我们发现提交WALWrite
在某些高负载时期过度等待。不仅是某些会话,而且所有提交,甚至真空。通过拍摄快照pg_stat_all_tables
,pg_statio_all_tables
我认为很明显,在这些WALWrite
事件如此突出的特定时期,一张特定的桌子及其吐司桌是罪魁祸首。WALWrite
在存在大量等待期间,它会接收大量插入、更新和删除操作。就会话数量(大约 20 个)和数据量(大文本字段)而言,“繁重”。
看看pg_stat_wal
等待期间的快照,我可以看到:
wal_records
每秒从平均 2.000 增加到 10.000-20.000wal_fpi
每秒从平均 150 增加到 500-1.000wal_kbytes
每秒从平均 600 次增加到 3.000-5.000 次wal_write
每秒wal_sync
从平均 50 增加到 200
上述数字是否pg_stat_wal
表明 WALWrite 事件的原因是什么?
- 是每秒提交的次数吗?
- 是提交的大小(以兆字节为单位)吗?
- 是同时提交的会话数吗?
如果这些数字不能清晰地描绘出情况,我该如何找出答案?我想解决瓶颈,但需要先确定它。
规格更新
- AWS RDS 上的 PG 14.1 (db.r6i.4xlarge (16 vCPU, 128GB RAM),带有 1 个副本 (db.r6i.2xlarge)。
- 存储类型为通用 SSD (gp3),预配置 IOPS 为 12000 IOPS,存储吞吐量为 500 MiBps。
- 没有 PostgreSQL 专用日志卷
checkpoint_timeout
900max_wal_size
15360min_wal_size
8192synchronous_standby_names
无效的wal_level
复制品wal_buffers
64MBshared_buffers
32GBwal_compression
在commit_delay
0synchronous_commit
在
这几乎肯定意味着您的磁盘过载。您也许可以将工作负载调整为 I/O 密集型程度较低,否则您需要更好的存储。
您可以尝试启用
wal_compression
,这可以在一定程度上减少 WAL 的体积,但会牺牲 CPU 时间。