本文档介绍了如何使用比较两个不同时间点之间的系统指标快照的报告来识别和缓解 AlloyDB Omni 数据库性能问题。在每个快照中捕获的系统指标包括虚拟 CPU (vCPU) 使用率、内存用量、磁盘 I/O、事务计数和等待事件。
性能快照报告的工作原理
性能快照报告是 AlloyDB Omni 内置的工具,可捕获和分析性能数据,以帮助您确定性能问题的原因。
性能快照报告会在单个报告中显示两个时间戳之间的数据库指标。您可以使用性能快照报告信息来找出性能快照报告实例存在的性能问题,例如一天中的特定时间段内数据库性能下降或是特定时间段内性能下降。
使用性能快照报告,您可以将指标与性能基准进行比较,以深入了解工作负载性能指标,您可以使用这些指标优化数据库性能或排查数据库性能问题。基准是一组自定义的数据库快照,用于衡量特定配置和工作负载下数据库的标准性能和行为。
如需了解性能快照报告中的等待事件,请参阅数据库性能快照报告参考文档。
所需的角色
确保您拥有 alloydbsuperuser
角色。默认情况下,AlloyDB 会向 alloydbsuperuser
授予 pg_monitor
角色。如需了解详情,请参阅 PostgreSQL 预定义角色。
如果您希望使用其他自定义角色,请先以 alloydbsuperuser
身份运行 GRANT pg_monitor TO my_user
。
安装性能快照报告
perfsnap
是架构名称,其中包含的 SQL 函数可让用户捕获快照或生成报告。此架构是 AlloyDB Omni g_stats
扩展程序的一部分。使用超级用户角色安装性能快照报告。
如需使用 perfsnap
API,请连接到用户想要在其中安装该扩展程序的任何数据库,并使用以下命令创建 g_stats
扩展程序:
CREATE EXTENSION IF NOT EXISTS g_stats;
创建系统指标的快照
在您感兴趣的工作负载的开始和结束时间创建快照。两个快照之间的时间间隔可让工作负载有足够的时间进行,以便系统可以累积反映工作负载的指标。从生成的性能快照报告中获取指标后,您可以创建另一组快照并重复此过程。
- 将
psql
客户端连接到 AlloyDB 实例。 运行
SELECT perfsnap.snap()
。输出类似于以下内容:postgres=# select perfsnap.snap(); snap ------ 1 (1 row)
查看快照列表
- 将
psql
客户端连接到 AlloyDB Omni 实例。 运行
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 数据库性能:
- 在数据库处于空闲状态或处理平均负载时创建基准快照。
- 启动您要提高其性能的工作负载或查询。
- 当工作负载或查询达到峰值资源使用率时,创建另一组快照。我们建议您为这两份报告使用相同的时间间隔。
- 比较使用这两组快照创建的报告,确定可能会提高性能的更改。如需详细了解性能建议,请参阅数据库性能优化建议。
数据库性能优化建议
下表列出了性能快照报告的各个部分,以及针对每个报告部分的建议改进措施。如需详细了解性能快照报告的各个部分和等待事件,请参阅数据库性能快照报告参考文档。
部分 | 报告字段 | 报告字段说明 | 优化建议 |
---|---|---|---|
快照详情 | 快照详情 | 提供主机、与 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) 信息 | 显示以下信息:
|
如果 Frozen XID 字段的存在时长过长,或者消耗的事务百分比接近 90%,请考虑进行完全清理 (vacuum)。如果聚合完全清理 (vacuum) 差距减小,则表示 Postgres 将强制执行完全清理 (vacuum) 以防止回卷。 | |
数据库进程等待详情 | 详细的后端和 后台进程信息 |
后端和后台进程在报告时间间隔内进行的所有等待的详情。信息包括累计等待时间、CPU 时间和每种等待类型的平均时间。 | 例如,如需减少 WALWrite 的等待时间,请增加可供数据库使用的 wal_buffers 的数量。 |
详细的后端和后台等待事件直方图 | 默认情况下,这会包含在性能快照报告中。该列表包含后端和后台进程的等待事件直方图,这些进程分为 32 个分区,从 1 微秒到超过 16 秒不等。 | 查找等待事件,并确定较大等待时间分区内的等待事件是否过多。等待事件过多或每次等待时间过长可能会出现问题。 | |
其他统计信息 | 预写式日志 (WAL) 统计信息 | WAL 统计信息摘要。 | 如果同步时间过长,请调整相关数据库标志 (GUC) 以改善工作负载。GUC 是用于处理服务器配置的 PostgreSQL 子系统。 |
摘要统计信息(跨所有数据库) | 快照时间间隔内发生的所有数据库操作的摘要。 | 不适用 | |
参数设置 | 参数设置 | 快照结束时间的关键 Postgres 配置参数。 | 检查 GUC 参数设置(Postgres 数据库标志),确定这些值是否不符合预期或不推荐使用。 |
限制
为避免空间膨胀,您最多可以在一个实例上手动创建 2500 个快照。空间膨胀可确保快照不会占用数据库中的太多存储空间。
如果快照数量超过快照限制,AlloyDB Omni 会删除超过 90 天的所有手动快照。如需保持在快照限制范围内,您必须先清理不必要的快照,然后再创建新快照。
AlloyDB Omni 会定期清理超过 90 天的手动快照。
后续步骤
- 了解性能快照报告中的等待事件。