比较性能快照

选择文档版本:

本文档介绍了如何使用比较两个不同时间点之间的系统指标快照的报告来识别和缓解 AlloyDB Omni 数据库性能问题。在每个快照中捕获的系统指标包括虚拟 CPU (vCPU) 使用率、内存用量、磁盘 I/O、事务计数和等待事件。

性能快照报告的工作原理

性能快照报告是 AlloyDB Omni 内置的工具,可捕获和分析性能数据,以帮助您确定性能问题的原因。

Performance Snapshot Report 会在单个报告中显示两个时间戳之间的数据库指标。您可以使用性能快照报告信息来找出性能快照报告实例存在的性能问题,例如一天中的特定时间段内数据库性能下降或是特定时间段内性能下降。

使用性能快照报告,您可以将指标与性能基准进行比较,以深入了解工作负载性能指标,您可以使用这些指标优化数据库性能或排查数据库性能问题。基准是一组自定义的数据库快照,用于衡量特定配置和工作负载下数据库的标准性能和行为。

如需了解 Performance Snapshot Report 中的等待事件,请参阅数据库 Performance Snapshot Report 报告参考

所需的角色

确保您拥有 pg_monitor 角色。此角色会授予给超级用户,超级用户继而又可向其他用户授予 pg_monitor 角色。

例如,postgres 默认是超级用户。您可以 postgres 身份运行 GRANT pg_monitor TO my_user,以便 my_user 能够按本文档中所述使用性能快照工具。

安装 Performance Snapshot Report

perfsnap 是架构名称,其中包含的 SQL 函数可让用户捕获快照或生成报告。此架构是 AlloyDB Omni g_stats 扩展程序的一部分。使用超级用户角色安装性能快照报告。

如需使用 perfsnap API,请连接到用户想要在其中安装该扩展程序的任何数据库,并使用以下命令创建 g_stats 扩展程序:

CREATE EXTENSION IF NOT EXISTS g_stats;

创建系统指标的快照

在您感兴趣的工作负载的开始和结束时间创建快照。两个快照之间的时间间隔可让工作负载有足够的时间进行,以便系统可以累积反映工作负载的指标。从生成的性能快照报告中获取指标后,您可以创建另一组快照并重复此过程。

  1. psql 客户端连接到 AlloyDB 实例
  2. 运行 SELECT perfsnap.snap()。输出类似于以下内容:

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

创建包含 SQL 执行统计信息的快照

默认情况下,AlloyDB Omni 使用 pg_stat_statements 扩展程序跟踪 SQL 语句。如需在性能报告中包含详细的 SQL 执行统计信息,您首先需要在 postgres 数据库中创建 pg_stat_statements 扩展程序。请注意,这些统计信息的捕获由 pg_stat_statements.track 标志启用,而不是由扩展程序本身的创建启用。

如需创建也包含 SQL 执行统计信息的快照,请按以下步骤操作:

  1. postgres 数据库中创建 pg_stat_statements 扩展程序。

    postgres=# CREATE EXTENSION pg_stat_statements;
    
  2. 现在,当您创建快照时,它会自动包含来自 pg_stat_statements 的 SQL 统计信息。

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

查看快照列表

  1. psql 客户端连接到 AlloyDB 实例
  2. 运行 SELECT * FROM perfsnap.g$snapshots。输出类似于以下内容:

    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)
    

生成快照报告

例如,如需生成一个报告来捕获快照 1 和快照 2 之间的差异,请运行
SELECT perfsnap.report(1,2)

差分操作中的第二个快照不需要紧跟在第一个快照之后。不过在差分操作中,请务必在第一个快照之后捕获第二个快照。

生成的性能摘要报告类似于以下精简示例:

性能快照报告示例

psql -d postgres -U alloydbsuperuser
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
 ----------------------------------------------------
(rows)

  

如需了解报告字段和性能优化建议,请参阅数据库性能优化建议。如需详细了解性能快照报告中的等待事件,请参阅数据库性能快照报告参考文档

删除快照

您必须先清除现有基准,然后才能删除属于该基准的快照。

如需删除快照,请运行 SELECT perfsnap.delete(n)。删除快照后,您将无法恢复快照。

将快照标记为性能基准

例如,如需将 ID 介于 1 到 3 之间的所有快照标记为系统性能基准,请运行
SELECT perfsnap.make_baseline(1, 3)

清除性能基准

例如,如需清除 ID 介于 1 到 3 之间的所有基准,请运行 SELECT perfsnap.clear_baseline(1, 3)

使用快照报告结果优化数据库性能

请按照以下步骤优化 AlloyDB 数据库性能:

  1. 在数据库处于空闲状态或处理平均负载时创建基准快照。
  2. 启动您要提高其性能的工作负载或查询。
  3. 当工作负载或查询达到峰值资源使用率时,创建另一组快照。我们建议您为这两份报告使用相同的时间间隔。
  4. 比较使用这两组快照创建的报告,确定可能会提高性能的更改。如需详细了解性能建议,请参阅数据库性能优化建议

数据库性能优化建议

下表列出了性能快照报告的各个部分,以及针对每个报告部分的建议改进措施。如需详细了解性能快照报告的各个部分和等待事件,请参阅数据库性能快照报告参考文档

部分 报告字段 报告字段说明 优化建议
快照详情 快照详情 提供主机、与 PostgreSQL 兼容的发布版本以及机器启动并正常运行的时间。 不适用
快照 ID 列出用于创建此报告的快照的 ID 和时间点。 不适用
系统数据分析 主机 CPU 主机 CPU 利用率详情。 如果 CPU 利用率超过 80%,我们建议您改用具有更多 vCPU 的系统。
主机内存 主机内存利用率详情。 如果可用内存小于 15%,我们建议您扩容到下一个可用大小。
负载配置文件 列出有助于根据生成的预写式日志记录 (WAL)、I/O 要求和连接管理来表征工作负载特征的计数器。 如果物理读取量高于逻辑读取量,请考虑扩容到下一个可用大小,以便为更大的数据缓存提供支持。
响应时间和等待类别细分 Postgres 进程在工作负载运行期间所用时间的细分。 例如,如果进程大多处于等待状态,请将调优重点放在缩短 I/O 等待时间上。
数据库工作负载信息 每个数据库的工作负载信息 每个数据库的关键指标,包括提交、回滚、命中率以及临时表和排序操作的相关信息。 如果回滚次数较多,请考虑诊断您的应用。
每个数据库的 DML 和 DQL 信息 查询操作的计数器。 将工作负载归类为读取密集型或写入密集型。
数据库冲突信息 常见应用和数据库问题的计数器。 如果存在死锁,请在应用中查找问题。
数据库
大小调整信息
显示数据库在两个快照之间的时间间隔内的增长量。此字段还会显示数据库是否建立了连接限制。 如果数据库增长过大,请在应用中查找问题。
完全清理 (vacuum) 信息 完全清理 (vacuum) 信息 完全清理 (vacuum) 操作的 I/O 和计数器的详情。 默认情况下,AlloyDB 会执行自适应完全清理 (vacuum)。您可以替换部分完全清理 (vacuum) 设置,以适应您的工作负载。例如,如果这些请求消耗的 I/O 过多,请减少完全清理 (vacuum) 操作。
每个数据库的完全清理 (vacuum) 信息 显示以下信息:
  • 每个数据库的 datfrozenxid(最早未冻结 XID)的当前存在时长,或从 datfrozenxid 到当前事务 XID 的事务数量。
  • 所有事务 ID 中已消耗的未冻结事务 ID。
  • autovacuum_freeze_max_age - age(pg_database.datfrozenxid) 的结果,表示在第二个快照时间点(即在数据库聚合级别上触发自动完全清理 [autovacuum] 以防止回卷的时间)的近似存在时长差距(以事务为单位)。
如果 Frozen XID 字段的存在时长过长,或者消耗的事务百分比接近 90%,请考虑进行完全清理 (vacuum)。如果聚合完全清理 (vacuum) 差距减小,则表示 Postgres 将强制执行完全清理 (vacuum) 以防止回卷。
数据库进程等待详情 详细的后端和
后台进程信息
后端和后台进程在报告时间间隔内进行的所有等待的详情。信息包括累计等待时间、CPU 时间和每种等待类型的平均时间。 例如,如需减少 WALWrite 的等待时间,请增加可供数据库使用的 wal_buffers 的数量。
详细的后端和后台等待事件直方图 默认情况下,这会包含在性能快照报告中。该列表包含后端和后台进程的等待事件直方图,这些进程分为 32 个分区,从 1 微秒到超过 16 秒不等。 查找等待事件,并确定较大等待时间分区内的等待事件是否过多。等待事件过多或每次等待时间过长可能会出现问题。
其他统计信息 预写式日志 (WAL) 统计信息 WAL 统计信息摘要。 如果同步时间过长,请调整相关数据库标志 (GUC) 以改善工作负载。GUC 是用于处理服务器配置的 PostgreSQL 子系统。
摘要统计信息(跨所有数据库) 快照时间间隔内发生的所有数据库操作的摘要。 不适用
参数设置 参数设置 快照结束时间的关键 Postgres 配置参数。 检查 GUC 参数设置(Postgres 数据库标志),确定这些值是否不符合预期或不推荐使用。
SQL 执行统计信息 按总耗时排序的每个查询的信息(前 50 个) 列出在两个快照期间耗时最多的前 50 个查询,以及它们的总执行次数,并按发出查询的用户和数据库进行细分。
Elapsed time = Difference of total_exec_time in pg_stat_statements at the two snapshot time
使用此部分可确定占用系统时间最多的最繁重查询。
按读取 IO 排序的每个查询的信息(前 50 个) 列出在两个快照期间耗时最多的前 50 个查询,以及它们的执行次数、缓冲区命中数、块读取数(包括总数和平均数)。
ReadIO = blk_read_time + temp_blk_read_time accumulated during the two snapshots
Buffer Hits = shared_blks_hit + local_blks_hit accumulated during the two snapshots
Buffer Reads = shared_blks_read + local_blks_read accumulated during the two snapshots
These fields are tracked by AlloyDB Cloud by default since track_io_timing is set.
使用此部分可确定 I/O 密集型查询,尤其是在它们需要频繁从磁盘读取数据的情况下。
按耗时标准差排序的每个查询的信息(前 50 个) 列出耗时标准差最高的前 50 个查询,并列出在开始和结束快照时间计算的标准差。
Here the value references stddev_exec_time from pg_stat_statements
对于标准差较高的查询,这意味着查询执行时间变化很大,可能需要查看 I/O。

限制

  • 为避免空间膨胀,您最多可以在一个实例上手动创建 2500 个快照。空间膨胀可确保快照不会占用数据库中的太多存储空间。

  • 如果快照数量超过快照限制,AlloyDB Omni 会删除超过 90 天的所有手动快照。如需保持在快照限制范围内,您必须先清理不必要的快照,然后再创建新快照。

  • AlloyDB Omni 会定期清理超过 90 天的手动快照。

后续步骤