Mejora el rendimiento de AlloyDB Omni con la aceleración de E/S

Selecciona una versión de la documentación:

En esta página, se describe cómo habilitar un conjunto de funciones de aceleración de E/S en AlloyDB Omni que pueden ayudar a mejorar el uso de los recursos de procesamiento y E/S para un rendimiento más rápido de las cargas de trabajo y las consultas.

Se incluyen las siguientes funciones:

  • Protección contra escrituras incompletas
  • Compatibilidad con O_DIRECT
  • E/S asíncrona (AIO)
  • Lecturas de transmisión

Para habilitar estas funciones de aceleración de E/S, habilita la configuración unificada general (GUC) alloydb_omni_atomic y configura AlloyDB Omni para que pueda usar la GUC.

Funciones de aceleración de E/S

En las siguientes secciones, se describen las funciones de aceleración de E/S que habilita la GUC alloydb_omni_atomic.

Protección contra escrituras incompletas

Cuando habilitas la configuración alloydb_omni_atomic, desactivas las escrituras de página completa para evitar la sobrecarga de rendimiento de tener que generar imágenes de página completa para el registro.

Compatibilidad con O_DIRECT

La compatibilidad con O_DIRECT es un requisito previo para las escrituras atómicas. O_DIRECT se aplica al directorio de datos de PostgreSQL y a la memoria caché del disco de AlloyDB Omni. Para obtener más información, consulta Cómo acelerar el rendimiento de la base de datos con la memoria caché del disco.

O_DIRECT también ofrece los siguientes beneficios:

  • El uso de O_DIRECT te permite evitar el problema de doble almacenamiento en búfer en PostgreSQL. PostgreSQL administra su propia caché de búfer y puede omitir la caché de búfer del kernel del sistema operativo.
  • O_DIRECT reduce la sobrecarga de CPU y memoria del sistema operativo que se necesita para mantener la caché de búfer del kernel.

E/S asíncrona

La configuración alloydb_omni_atomic proporciona capacidades de E/S asíncrona (AIO) con las bibliotecas io_uring y libaio. Te recomendamos que uses io_uring para evitar las limitaciones de la biblioteca libaio anterior. AlloyDB Omni recurre a libaio cuando no se detecta la compatibilidad con io_uring. Este enfoque supera la pérdida de ventajas de E/S almacenadas en búfer, como la lectura anticipada y la combinación de escritura, y también garantiza que se maximice el ancho de banda de E/S disponible del almacenamiento subyacente ofrecido.

Lecturas de transmisión

AlloyDB Omni usa lecturas de transmisión, similares a la función de PostgreSQL 17, que proporcionan análisis secuenciales mejorados, ANALYZE y rendimiento de pg_prewarm mediante el uso de E/S vectorizada para leer varios bloques en la caché de búfer. La E/S vectorizada es un método en el que una sola llamada de procedimiento puede obtener datos previamente de varios búferes, lo que mejora la eficiencia al reducir los cambios de contexto y las llamadas al sistema.

AlloyDB Omni extiende la compatibilidad para usar lecturas de transmisión para lecturas desde la memoria caché del disco de AlloyDB Omni con AIO para amplificar el rendimiento de lectura. Este enfoque facilita la lectura anticipada efectiva de búferes en el grupo de memoria compartida desde el almacenamiento para que las consultas los usen, en lugar de tener que leer estos bloques del almacenamiento cada vez que sean necesarios.

Antes de comenzar

  1. Verifica la compatibilidad del sistema operativo y del sistema de archivos.

    1. Para asegurarte de que el kernel admita RWF_ATOMIC, verifica la versión del kernel. En el siguiente ejemplo, se usa una máquina Ubuntu 24.10 que ejecuta el kernel de Linux 6.14 que admite escrituras atómicas.

      > sudo hostnamectl
       ...
       Operating System: Ubuntu 24.10
            Kernel: Linux 6.14.0-061400rc5-generic
      ...
      
    2. Si tu kernel no admite RWF_ATOMIC, te recomendamos que actualices a una versión del kernel que admita RWF_ATOMIC.

  2. Para usar las funciones de aceleración de E/S de AlloyDB Omni para probar las ganancias de rendimiento con la protección contra escrituras incompletas, habilita la configuración unificada general (GUC) alloydb_omni_atomic. Para usar esta GUC, debes tener un kernel y un sistema de archivos compatibles que proporcionen E/S atómica y protejan contra escrituras incompletas.

    La marca RWF_ATOMIC se usa para la compatibilidad con escrituras atómicas. De forma predeterminada, la compatibilidad con RWF_ATOMIC se verifica durante el inicio. PostgreSQL no se inicia si no se pueden confirmar las escrituras atómicas con la marca RWF_ATOMIC.

    Puedes anular este comportamiento predeterminado, pero te recomendamos que uses una plataforma compatible y la opción force para evitar anular accidentalmente la configuración óptima.

    Puedes anular la verificación de compatibilidad RWF_ATOMIC con la opción force_unsafe, pero la seguridad de los datos no está garantizada con esta anulación. Te recomendamos que no uses esta opción a menos que estés evaluando AlloyDB Omni en un entorno que no se pueda actualizar para usar el kernel y el sistema de archivos adecuados.

    En la siguiente tabla, se enumeran los parámetros de configuración de alloydb_omni_atomic y las verificaciones de compatibilidad correspondientes.

    Valor de alloydb_omni_atomic Verificación de compatibilidad de inicio Descripción
    off
    N/A Este valor desactiva el modo atómico. La función está inactiva.
    force
    Realiza la verificación de compatibilidad de inicio. No se inicia si falla la escritura RWF_ATOMIC. Establece las configuraciones del modo atómico.
    force_unsafe
    No realiza una verificación de compatibilidad de inicio. Muestra una advertencia, pero continúa si RWF_ATOMIC falla la escritura. Establece las configuraciones del modo atómico.

    En la configuración force/force_unsafe, se establecen automáticamente las configuraciones full_page_writes, io_combine_limit y debug_io_direct. Puedes anular estas configuraciones con la configuración opcional on/on_unsafe configuración.

Configura las funciones de aceleración de E/S de AlloyDB Omni

  1. Configura el sistema de archivos XFS para el directorio de datos. XFS se usa porque admite un tamaño de bloque del sistema de archivos mayor que el tamaño de la página. AlloyDB Omni puede usar XFS para escribir de forma atómica bloques de 8 KiB con compatibilidad completa con RWF_ATOMIC.

    1. Crea un sistema de archivos XFS con un tamaño de bloque de 8 KiB y móntalo en la ubicación del directorio de datos (DATA_DIR).

      sudo mkfs.xfs -f -b size=8k /dev/$DEVICE
      sudo mount /dev/$DEVICE DATA_DIR
      

      Realiza el siguiente reemplazo:

      • DATA_DIR: La ubicación del directorio de datos
    2. Revisa los registros del kernel para asegurarte de que se usen bloques de 8k:

      > sudo journalctl -f
      ...
      kernel: XFS (sdc): EXPERIMENTAL large block size feature enabled.  Use at your own risk!
      kernel: XFS (sdc): Mounting V5 Filesystem 350aa26a-7555-4566-94c1-74e54ddc9250
      ...
      
  2. Opcional: Configura la memoria caché del disco de AlloyDB Omni.

    Usa el siguiente ejemplo para crear un sistema de archivos con ext4, y, luego, montar el sistema de archivos.

    sudo /sbin/mkfs.ext4 -m 1 -F -E lazy_itable_init=0,lazy_journal_init=0 /dev/DEVICE
    sudo mount --make-shared -o noatime,discard,errors=panic /dev/DEVICE /OMNI_DISK_CACHE_DIRECTORY
    

    Realiza el siguiente reemplazo:

    • DEVICE: La entidad con la que interactúa la aplicación para realizar operaciones de E/S (lectura o escritura de datos)

    Para admitir el rendimiento óptimo de las funciones de aceleración de E/S de AlloyDB Omni cuando el almacenamiento principal no ofrece más operaciones de entrada y salida por segundo (IOPS), te recomendamos que configures la memoria caché del disco de AlloyDB Omni. Para obtener más información, consulta Cómo acelerar el rendimiento de la base de datos con la memoria caché del disco.

  3. Descarga y ejecuta AlloyDB Omni.

    1. Descarga el contenedor de Docker más reciente de AlloyDB Omni. Para obtener más información, consulta Cómo instalar AlloyDB Omni en una VM.
    2. Para usar la caché de disco, sigue las instrucciones que se indican en Cómo acelerar el rendimiento de la base de datos con la caché de disco.
    3. Para permitir io_uring, agrega un argumento adicional, --security-opts="seccomp:unconfined".

      docker run -d --name CONTAINER_NAME \
         -e POSTGRES_PASSWORD=NEW_PASSWORD \
         -v DATA_DIR:/var/lib/postgresql/data \
         -v /OMNI_DISK_CACHE_DIRECTORY:/CACHE_DIRECTORY_PATH_INSIDE_CONTAINER \  # Only if disk cache is enabled
         -p HOST_PORT:5432 \
         --security-opts="seccomp:unconfined" \
         --restart=always \
         google/alloydbomni:16
      

      Realiza los siguientes reemplazos:

      • CONTAINER_NAME: El nombre del contenedor de AlloyDB Omni en el registro de contenedores de tu máquina anfitrión
      • NEW_PASSWORD: La contraseña asignada al usuario de PostgreSQL del contenedor
      • DATA_DIR: La ubicación del directorio de datos
      • CACHE_DIRECTORY_PATH_INSIDE_CONTAINER: La ruta de acceso del directorio de caché de disco dentro del contenedor
      • HOST_PORT: El puerto TCP en la máquina anfitrión al que el contenedor debe publicar su propio puerto 5432
  4. Configura AlloyDB Omni para usar E/S atómica.

    Establece la GUC alloydb_omni_atomic en un valor adecuado y reinicia el contenedor.

    alter system set alloydb_omni_atomic='force';
    sudo docker restart CONTAINER_NAME;
    

    Realiza los siguientes reemplazos:

    • CONTAINER_NAME: El nombre del contenedor de AlloyDB Omni en el registro de contenedores de tu máquina anfitrión

Limitaciones

  • PostgreSQL 16 contiene rutas de acceso que realizan E/S de un solo bloque, lo que O_DIRECT ralentiza. Es posible que las lecturas sean más lentas durante la recuperación de la base de datos (ruta de rehacer), los análisis de vacuum y el precalentamiento de la memoria caché del disco de Omni.
  • Las funciones de aceleración de E/S de AlloyDB Omni en réplicas de lectura no son compatibles con la versión preliminar .
  • En cargas de trabajo pesadas, los sistemas basados en ARM pueden mostrar un rendimiento más bajo debido a las diferencias arquitectónicas.
  • Debido a sus limitaciones con el aumento de las cargas de trabajo, libaio es susceptible a la falta de disponibilidad de recursos. io_uring puede experimentar problemas de asignación de memoria cuando la memoria del sistema disponible es baja.