通过比较性能快照来优化数据库性能

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

效果数据快照报告的运作方式

性能快照报告是 AlloyDB Omni 的一款内置工具,可捕获和分析性能数据,帮助您找出性能问题的原因。此工具可与 AlloyDB Omni 可观测性功能(例如系统数据分析查询数据分析Metrics Explorer)相辅相成,这些功能可提供有关实例的实时指标。

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

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

如需了解性能快照报告中的等待事件,请参阅数据库性能快照报告参考文档

所需的角色

确保您拥有 alloydbsuperuser 角色。默认情况下,AlloyDB 会将 pg_monitor 角色授予 alloydbsuperuser。如需了解详情,请参阅 PostgreSQL 预定义角色

如果您想使用其他自定义角色,请先以 alloydbsuperuser 身份运行 GRANT pg_monitor TO my_user。如需了解详情,请参阅更新具有适当角色的 Identity and Access Management (IAM) 账号

安装效果概况报告

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)
    

查看快照列表

  1. psql 客户端连接到 AlloyDB Omni 实例。
  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
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)

  

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

删除快照

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

如需删除快照,请运行 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. 将您创建的报告与这两组快照进行比较,找出可能会提升效果的更改。如需详细了解性能建议,请参阅数据库性能优化建议

数据库性能优化建议

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

Section 报告字段 报告字段说明 优化建议
快照详情 快照详情 提供主机、与 PostgreSQL 兼容的版本以及机器启动和运行的时间。 不适用
快照 ID 列出用于生成此报告的快照的 ID 和时间点。 不适用
系统数据分析 主机 CPU 主机 CPU 利用率详细信息。 如果 CPU 利用率高于 80%,我们建议您改用 vCPU 数量较多的系统。
主机内存 主机内存利用率详情。 如果可用内存低于 15%,我们建议您扩容到下一个可用大小。
加载个人资料 列出了有助于从生成的写提前日志记录 (WAL)、I/O 要求和连接管理方面对工作负载进行描述的计数器。 如果实际读取次数高于逻辑读取次数,请考虑扩容到下一个可用大小,以支持更大的数据缓存。
响应时间和等待类别细分 Postgres 进程在工作负载运行期间所花费时间的细分。 例如,如果进程大部分处于等待状态,请重点调整以缩短 I/O 等待时间。
数据库工作负载信息 每个数据库的工作负载信息 每个数据库的主要指标,包括提交、回滚、命中率,以及有关临时表和排序操作的信息。 如果回滚次数较多,请考虑诊断您的应用。
每个数据库的 DML 和 DQL 信息 用于统计查询操作的计数器。 将您的工作负载归类为读取密集型或写入密集型。
数据库冲突信息 用于跟踪常见应用和数据库问题的计数器。 如果存在死锁,请在应用中查找问题。
数据库
大小信息
显示数据库在两个快照之间的间隔时间内增长了多少。此字段还会显示数据库是否已建立连接限制。 如果数据库增长过快,请查找应用中存在的问题。
吸尘器信息 吸尘器信息 真空操作的 I/O 和计数器详情。 默认情况下,AlloyDB 会执行自适应吸尘。您可以替换某些真空设置,以适应您的工作负载。例如,如果这些请求消耗了过多的 I/O,请减少执行吸尘器操作。
每个数据库的吸尘器信息 显示以下信息:
  • 每个数据库的 datfrozenxid(最早未冻结的 XID)的当前存在时间,或从 datfrozenxid 到当前事务 XID 的事务数。
  • 已解冻的事务 ID 占所有事务 ID 的比例。
  • autovacuum_freeze_max_age - age(pg_database.datfrozenxid) 的结果,表示在第二次快照时间(系统触发自动执行自动整理以防止数据库汇总级别出现环绕)时大致的年龄差距(以事务为单位)。
如果 Frozen XID 字段的年龄过长,或者已消耗事务的百分比接近 90%,请考虑进行真空处理。如果总体真空间隔时间缩短,则表示 Postgres 将强制执行真空操作以防止环绕。
数据库进程等待详情 详细的后端和
后台进程信息
报告间隔内后端和后台进程的所有等待详情。信息包括累计等待时间、CPU 时间和每种等待类型的平均时间。 例如,如需缩短 WALWrite 的等待时间,请增加可供数据库使用的 wal_buffers 数量。
详细的后端和后台等待事件直方图 默认情况下,此信息包含在性能快照报告中。该列表包含后端和后台进程的等待事件直方图,这些直方图被划分为 32 个存储分区,范围从 1 微秒到 16 秒以上。 找到等待事件,并确定较长等待时间分桶中的等待事件是否过多。等待事件过多或每次等待所消耗的时间可能存在问题。
其他统计信息 预写式日志 (WAL) 统计信息 WAL 统计信息摘要。 如果同步时间过长,请调整相关数据库标志 (GUC) 以改进工作负载。GUC 是用于处理服务器配置的 PostgreSQL 子系统。
摘要统计信息(涵盖所有数据库) 快照时间间隔内发生的所有数据库操作的摘要。 不适用
参数设置 参数设置 结束快照时间的主要 Postgres 配置参数。 检查 GUC 参数设置(Postgres 数据库标志),以确定值是否不符合预期或不受推荐。

限制

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

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

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

后续步骤