RDS PostgreSQL stats collector进程占用CPU和IO高导致慢SQL增多

问题描述

RDS PostgreSQL出现慢SQL增多的情况,经排查发现stats collector进程占用了较高的CPU和IO。

说明

在增强监控中,可以通过查看指标os.cpu_process.pgstat来监测stats collector进程的CPU占用情况。详情请参见查看增强监控

问题原因

在RDS PostgreSQL 14及以下版本中,统计信息是通过stats collector进程写入文件的,而autovacuum worker进程需要频繁更新统计信息。首先,autovacuum worker进程会读取统计信息,然后进行更新,并将更新后的信息发送给stats collector进程,由后者负责写入。当autovacuum频繁运行时,autovacuum workerstats collector都会占用较高的CPU和IO资源,导致实例中出现更多的慢SQL。此外,autovacuum清理死元组(dead tuple)的效率也会降低,从而进一步导致出现慢SQL。

在表特别多的实例中,更容易发生上述场景,因为随着表的增多,统计信息的规模也会增大,从而导致统计信息的读写速度变慢。

解决方案

短期解决方案

  • 定期手动运行SQL命令:VACUUM FREEZE,以减少autovacuum运行的频率。

  • 增加autovacuum_vacuum_scale_factorautovacuum_vacuum_insert_scale_factor等参数的值,以减少autovacuum运行的频率。详细操作请参见设置实例参数

  • 使用通用云盘提高IO吞吐量性能。ESSD云盘支持变更为通用云盘,详情请参见ESSD云盘变更为通用云盘

长期解决方案

将RDS PostgreSQL的大版本升级至15版本及以上。RDS PostgreSQL 15及以上版本将统计信息放入了共享内存,并去掉了stats collector进程,避免对物理IO的占用。升级实例大版本请参见RDS PostgreSQL大版本升级

相关文档