Compara instantáneas de rendimiento para optimizar el rendimiento de la base de datos

En este documento, se describe cómo identificar y mitigar los problemas de rendimiento de la base de datos de AlloyDB Omni con un informe que compara instantáneas de las métricas del sistema entre dos momentos diferentes. Las métricas del sistema capturadas en cada instantánea incluyen el uso de la CPU virtual (vCPU), el uso de memoria, la E/S de disco, el recuento de transacciones y los eventos de espera.

Cómo funcionan los informes de instantáneas de rendimiento

Los informes de instantáneas de rendimiento son una herramienta integrada de AlloyDB Omni que captura y analiza datos de rendimiento para ayudarte a identificar la causa de los problemas de rendimiento. Esta herramienta complementa otras funciones de observabilidad de AlloyDB Omni, como las estadísticas de sistemas, las estadísticas de consultas y el Explorador de métricas, que proporcionan métricas en tiempo real sobre tu instancia.

Los informes de instantáneas de rendimiento muestran las métricas de la base de datos entre dos marcas de tiempo en un solo informe. Puedes usar la información del informe de instantánea de rendimiento para identificar problemas de rendimiento con tu instancia de informe de instantánea de rendimiento, como una disminución del rendimiento de la base de datos durante ciertos momentos del día o una disminución del rendimiento durante un período determinado.

Con el informe de resumen de rendimiento, puedes comparar las métricas con un modelo de referencia de rendimiento para obtener estadísticas sobre las métricas de rendimiento de la carga de trabajo, que puedes usar para optimizar el rendimiento de la base de datos o solucionar problemas relacionados. Un modelo de referencia es un conjunto personalizado de instantáneas de bases de datos que miden el rendimiento y el comportamiento estándar de una base de datos para una configuración y una carga de trabajo específicas.

Para obtener información sobre los eventos de espera en el informe de instantáneas de rendimiento, consulta la referencia del informe de instantáneas de rendimiento de la base de datos.

Roles obligatorios

Asegúrate de tener el rol alloydbsuperuser. De forma predeterminada, AlloyDB otorga el rol pg_monitor a alloydbsuperuser. Para obtener más información, consulta Roles predefinidos de PostgreSQL.

Si prefieres usar tus otros roles definidos por ti, primero ejecuta GRANT pg_monitor TO my_user como alloydbsuperuser. Para obtener más información, consulta Cómo actualizar una cuenta de Identity and Access Management (IAM) con el rol adecuado.

Instala el informe de instantáneas de rendimiento

perfsnap es el nombre del esquema que contiene funciones de SQL que permiten a los usuarios capturar instantáneas o generar informes. Este esquema forma parte de la extensión g_stats de AlloyDB Omni. Usa el rol de superusuario para instalar el informe de resumen de rendimiento.

Para usar las APIs de perfsnap, conéctate a cualquier base de datos en la que los usuarios quieran instalar la extensión y crea la extensión g_stats con el siguiente comando:

CREATE EXTENSION IF NOT EXISTS g_stats;

Crea una instantánea de las métricas del sistema

Crea una instantánea al principio y al final de la carga de trabajo que te interesa. El intervalo de tiempo entre las dos instantáneas permite que la carga de trabajo avance lo suficiente para que el sistema pueda acumular métricas que reflejen la carga de trabajo. Después de obtener las métricas del informe de instantáneas de rendimiento resultante, puedes tomar otro conjunto de instantáneas y repetir el proceso.

  1. Conecta un cliente psql a una instancia de AlloyDB..
  2. Ejecuta SELECT perfsnap.snap(). El resultado es similar al siguiente:

    postgres=# select perfsnap.snap();
     snap
    ------
        1
    (1 row)
    

Cómo ver una lista de instantáneas

  1. Conecta un cliente psql a una instancia de AlloyDB Omni.
  2. Ejecuta SELECT * FROM perfsnap.g$snapshots. El resultado es similar al siguiente:

    postgres=# select * from perfsnap.g$snapshots;
     snap_id |           snap_time           | instance_id | node_id | snap_description | snap_type | is_baseline
    ---------+-------------------------------+-------------+---------+------------------+-----------+-------------
           1 | 2023-11-13 22:13:43.159237+00 | sr-primary  |         | Manual snapshot  | Manual    | f
           2 | 2023-11-13 22:53:40.49565+00  | sr-primary  |         | Automatic snapshot| Automatic | f
    (2 rows)
    

Genera un informe de instantáneas

Para generar un informe que capture la diferencia entre las instantáneas 1 y 2, por ejemplo, ejecuta
SELECT perfsnap.report(1,2).

La segunda instantánea de una operación diferencial no tiene que seguir de inmediato a la primera. Sin embargo, asegúrate de capturar la segunda instantánea en el diferencial después de la primera.

El informe de instantánea de rendimiento generado es similar al siguiente ejemplo resumido:

Ejemplo de informe de resumen de rendimiento

$ psql -d postgres -U alloydbsuperuser
postgres=> select perfsnap.report(22, 23);

report
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 PGSNAP DB Report for:

 Snapshot details
 --------------------------------------
 Host                   i841-sr-primary-2a34f46e-06bc
 Release                14.12
 Startup Time           2024-10-08 03:23:15+00

              Snap Id    Snap Time
 ------------ ---------- ------------------------
 Begin Snap:          22 24.10.2024 04:33:56 (UTC) Automatic snapshot
   End Snap:          23 25.10.2024 04:38:56 (UTC) Automatic snapshot
    Elapsed:                      1 day 00:04:59.979321

 Database Cache sizes
 ~~~~~~~~~~~~~
            Shared Buffers:       31 GB        Block Size:         8192
      Effective Cache Size:       25 GB       WAL Buffers:        16384

 Host CPU
 ~~~~~~~~~~
       %User   %Nice %System   %Idle    %WIO    %IRQ   %SIRQ  %Steal  %Guest
     ------- ------- ------- ------- ------- ------- ------- ------- -------
        1.07    0.22    0.91   97.40    0.09    0.00    0.31    0.00    0.00

 Host Memory
 ~~~~~~~~~~~~
              Total Memory:       63 GB
          Available Memory:       11 GB
               Free Memory:      726 MB
            Buffers Memory:     3706 MB

 Load profile (in bytes)
 ~~~~~~~~~~~~~~~~~~~~~~~            Per Second         Per Transaction
                                    ------------       ---------------
                     Redo size:         63083.64               4489.93
                 Logical reads:          1961.21                139.59
                 ...

 Response Time Profile (in s)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 CPU time:               5399 (   0.39%)
 Wait time:           1386906 (  99.61%)
 Total time:           1392306

 Backend Processes Wait Class Breakdown (in s)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 IO                   119.300 (  98.91%)
 LWLock                 1.305 (   1.08%)
 IPC                     .010 (   0.01%)
 Lock                    .000 (   0.00%)

 Backend Processes Wait Information
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Event                                          Class         Waits      Time (us)      Avg (us)
 -------------------------------------- ------------- ------------- -------------- -------------
 CPU                                                                    1995948632
 WALInsert                                     LWLock             1           6656          6656

 Vacuum Information
 ~~~~~~~~~~~~~~~~~~~
             Num Analyze operations:             1976
              Num Vacuum operations:             3435

 Per Database Information
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 Name                      Commits       Rollbacks     BlkRds        Blkhits       TempFiles     TempBytes
 ------------------------- ------------- ------------- ------------- ------------- ------------- -------------
 bench                             27939             0             0       7823038             0       0 bytes
 postgres                          39792             0             7      11089243             0       0 bytes

 Per Database DML & DQL Information
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Name                      Tuples returned  Tuples fetched   Tuples inserted  Tuples updated   Tuples deleted   Index splits     Index Only heap fetches   HOT updates
 ------------------------- ---------------- ---------------- ---------------- ---------------- ---------------- ---------------- ------------------------- ----------------
 bench                             16119481          4843262                0                0                0                0                        16                0
 postgres                          25415473          6327188                0               10                0                0                         0                8

 Per Database Conflict Information
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Name                      Lock Timeout  Old Snapshot  Buffer Pins   Deadlock
 ------------------------- ------------- ------------- ------------- -------------
 bench                                 0             0             0             0
 postgres                              0             0             0             0

 Per Database Vacuum Information
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Name                      Frozen XID    % Consumed    Aggregate Vacuum Gap
 ------------------------- ------------- ------------- --------------------
 bench                         179460916         9.00%         20539084
 postgres                      179339239         9.00%         20660761

 Per Database Sizing Information
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                    Conn.
 Name                 Collation     Limit   Tablespace           DB Size    Growth
 -------------------- ------------- ------- -------------------- ---------- ----------
 bench                C.UTF-8            -1 pg_default                80 GB    0 bytes
 postgres             C.UTF-8            -1 pg_default               135 MB    0 bytes

 Backend Wait Event Histogram
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Event                                          Class       Waits    <= 1us    <= 2us    <= 4us    <= 8us   <= 16us   <= 32us   <= 64us  <= 128us  <= 256us  <= 512us
 -------------------------------------- ------------- ----------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------
 WALInsert                                  LWLock             1         0         0         0         0         0         0         0         0         0         0

 Background Wait Event Histogram
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Event                                          Class       Waits    <= 1us    <= 2us    <= 4us    <= 8us   <= 16us   <= 32us   <= 64us  <= 128us  <= 256us  <= 512us
 -------------------------------------- ------------- ----------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------
 WALInsert                                  LWLock           542       107       174        39       113        93         8         1         1         0         1

 Write Ahead Log (WAL) Statistics
 --------------------------------
 Records       Full Page Images   Bytes        Buffers Full   Write         Sync          Write Time    Sync Time
 -----------   ----------------   -----------  ------------   -----------   -----------   -----------   -----------
     2936305                100     805989345             0             0             0             0             0

 Summary Stats (across all databases)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Name                             Value
 -------------------------------- ----------------------------------
 Buffers evicted                  0
 Commits                          1216693
 ...

 Parameter Settings
 ~~~~~~~~~~~~~~~~~~~
 Parameter                         Value
 --------------------------------- --------------------------------------------------------------
 DateStyle                            ISO, MDY
 TimeZone                             UTC
 autovacuum                           on
 work_mem                             4096

 Columnar Engine available size  Columnar Engine configured size
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                       14959MB                         19293MB

 Columnar Engine Statistics
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 name                                                       count
 ---------------------------------------------------------- ------------
 CU Populations/Refreshes                                          13197
 CU Auto Refreshes                                                 10975
 ...
 Columnar Engine Ultra-fast Cache Statistics
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Ultra-fast Cache Size (MB):                        19200
 Ultra-fast Cache Used Size (MB):                       0
 Ultra-fast Cache Block Size (MB):                     80

 ----------------------------------------------------
 Created by G_STATS v1.0.100
 ----------------------------------------------------
(xxx rows)

  

Para obtener información sobre los campos de informes y las recomendaciones de optimización del rendimiento, consulta Recomendaciones para optimizar el rendimiento de las bases de datos. Para obtener más información sobre los eventos de espera en los informes de instantáneas de rendimiento, consulta la referencia del informe de instantáneas de rendimiento de la base de datos.

Borrar una instantánea

Antes de borrar instantáneas que forman parte de un modelo de referencia existente, debes borrarlo .

Para borrar una instantánea, ejecuta SELECT perfsnap.delete(n). Una vez que borres una instantánea, no podrás recuperarla.

Marca una instantánea como modelo de referencia de rendimiento

Para marcar todas las instantáneas con IDs entre 1 y 3, por ejemplo, como un modelo de referencia del rendimiento del sistema, ejecuta
SELECT perfsnap.make_baseline(1, 3).

Cómo borrar los modelos de referencia de rendimiento

Para borrar todos los modelos de referencia con IDs entre 1 y 3, por ejemplo, ejecuta SELECT perfsnap.clear_baseline(1, 3).

Optimiza el rendimiento de la base de datos con los resultados del informe de instantáneas

Sigue estos pasos para optimizar el rendimiento de la base de datos de AlloyDB:

  1. Crea instantáneas de referencia cuando la base de datos esté inactiva o cuando experimente una carga promedio.
  2. Inicia la carga de trabajo o la consulta cuyo rendimiento deseas mejorar.
  3. Cuando la carga de trabajo o la consulta alcancen el uso máximo de recursos, crea otro conjunto de instantáneas. Te recomendamos que uses el mismo intervalo para ambos informes.
  4. Compara los informes que creaste con ambos conjuntos de instantáneas y, luego, identifica los cambios que podrían mejorar el rendimiento. Para obtener más información sobre las recomendaciones de rendimiento, consulta Recomendaciones para optimizar el rendimiento de las bases de datos.

Recomendaciones para optimizar el rendimiento de la base de datos

En la siguiente tabla, se enumeran las secciones del informe de resumen de rendimiento y las mejoras recomendadas para cada sección del informe. Para obtener más información sobre las secciones del informe de instantáneas de rendimiento y los eventos de espera, consulta la referencia del informe de instantáneas de rendimiento de la base de datos.

Sección Campo del informe Descripción de los campos del informe Recomendaciones de optimización
Detalles de la instantánea Detalles de la instantánea Proporciona el host, la versión de lanzamiento compatible con PostgreSQL y el momento en que la máquina está en funcionamiento. N/A
ID de instantánea Muestra el ID y el momento de las instantáneas que se usan para crear este informe. N/A
Estadísticas del sistema CPU del host Detalles del uso de CPU del host Si el uso de CPU es superior al 80%, te recomendamos que cambies a un sistema con más CPU virtuales.
Memoria del host Detalles del uso de memoria del host Si la memoria libre es inferior al 15%, te recomendamos que aumentes el tamaño al siguiente disponible.
Perfil de carga Muestra una lista de contadores que ayudan a caracterizar tu carga de trabajo en términos de los registros de escritura anticipada (WAL) generados, los requisitos de E/S y la administración de conexiones. Si las operaciones de lectura físicas son superiores a las operaciones de lectura lógicas, considera escalar hasta el siguiente tamaño disponible para admitir una mayor almacenamiento en caché de datos.
Desglose del tiempo de respuesta y la clase de espera Desglose del tiempo que los procesos de Postgres dedicaron durante la ejecución de la carga de trabajo. Enfócate en acortar la espera de E/S si los procesos están principalmente en un estado de espera, por ejemplo.
Información de la carga de trabajo de la base de datos Información de la carga de trabajo por base de datos Métricas clave para cada base de datos, incluidas las confirmaciones, las reversiones, la proporción de hits y la información sobre las tablas temporales y las operaciones de ordenamiento Si las reversiones son altas, considera diagnosticar tu app.
Información de DML y DQL por base de datos Contadores para operaciones de consulta. Clasifica tu carga de trabajo como con mucho contenido de lectura o de escritura.
Información sobre conflictos de bases de datos Contadores para problemas comunes de aplicaciones y bases de datos Busca problemas en tu aplicación si hay un interbloqueo.
Información sobre el tamaño de la base de datos
Muestra cuánto creció la base de datos durante el intervalo entre dos instantáneas. Este campo también muestra si la base de datos tiene límites de conexión establecidos. Busca problemas en tu aplicación si el crecimiento de la base de datos es demasiado grande.
Información sobre la aspiradora Información sobre la aspiradora Detalles de la E/S y los contadores para las operaciones de limpieza. De forma predeterminada, AlloyDB realiza la limpieza adaptativa. Puedes anular algunos de los parámetros de configuración de limpieza para que se adapten a tu carga de trabajo. Por ejemplo, reduce las operaciones de limpieza si se gasta demasiada E/S en estas solicitudes.
Información de limpieza por base de datos Muestra la siguiente información:
  • La antigüedad actual de datfrozenxid (los XIDs más antiguos sin inmovilizar) de cada base de datos o la cantidad de transacciones de datfrozenxid al XID de la transacción actual.
  • Porcentaje de IDs de transacción desinmovilizados de todos los IDs de transacción.
  • Es el resultado de autovacuum_freeze_max_age - age(pg_database.datfrozenxid), que indica las brechas de edad aproximadas (en transacciones) en el segundo momento de la instantánea, cuando se activa el autovacuum para evitar los desbordamientos a nivel agregado de la base de datos.
Si la antigüedad del campo XID congelado es demasiado antigua o si el porcentaje de transacciones consumidas es cercano al 90%, considera realizar una limpieza. Si disminuye la brecha de vaciado agregada, esto indica que Postgres aplicará un vaciado para evitar el desbordamiento.
Detalles de espera de los procesos de la base de datos Información detallada de los procesos en segundo plano y del backend de
Detalles de todas las esperas por procesos en segundo plano y de backend en el intervalo del informe La información incluye el tiempo de espera acumulado, el tiempo de CPU y el tiempo promedio por tipo de espera. Para disminuir el tiempo de espera en WALWrite, por ejemplo, aumenta la cantidad de wal_buffers disponibles para la base de datos.
Histograma detallado de eventos de espera en segundo plano y de backend Esto se incluye en el informe de instantáneas de rendimiento de forma predeterminada. La lista contiene el histograma de eventos de espera para los procesos en segundo plano y de backend, que se dividen en 32 intervalos, de 1 μs a más de 16 s. Busca los eventos de espera y determina si hay demasiados en el bucket de tiempo de espera más grande. Es posible que haya un problema con demasiados eventos de espera o con cada tiempo de espera consumido.
Estadísticas diversas Estadísticas del registro de escritura por adelantado (WAL) Resumen de las estadísticas de WAL. Si experimentas demasiado tiempo de sincronización, ajusta las marcas de base de datos relacionadas (GUC) para mejorar tu carga de trabajo. GUC es el subsistema de PostgreSQL que controla la configuración del servidor.
Estadísticas de resumen (en todas las bases de datos) Es un resumen de todas las operaciones de la base de datos que se producen durante el intervalo de la instantánea. N/A
Configuración del parámetro Configuración del parámetro Parámetros de configuración clave de Postgres en la hora de finalización de la instantánea. Verifica la configuración del parámetro GUC (las marcas de la base de datos de Postgres) para determinar si los valores no son esperados o no se recomiendan.

Limitaciones

  • Para evitar el aumento excesivo del espacio, puedes crear manualmente un máximo de 2,500 instantáneas en una instancia. El aumento de espacio garantiza que las instantáneas no ocupen demasiado espacio de almacenamiento en tu base de datos.

  • Si la cantidad de instantáneas supera el límite, AlloyDB Omni borrará todas las instantáneas manuales que tengan más de 90 días. Para permanecer dentro del límite de instantáneas, debes limpiar las instantáneas innecesarias antes de tomar una nueva.

  • AlloyDB Omni limpia periódicamente las instantáneas manuales que tienen más de 90 días.

¿Qué sigue?