问题描述
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 worker
和stats collector
都会占用较高的CPU和IO资源,导致实例中出现更多的慢SQL。此外,autovacuum
清理死元组(dead tuple)的效率也会降低,从而进一步导致出现慢SQL。
在表特别多的实例中,更容易发生上述场景,因为随着表的增多,统计信息的规模也会增大,从而导致统计信息的读写速度变慢。
解决方案
短期解决方案
定期手动运行SQL命令:
VACUUM FREEZE
,以减少autovacuum
运行的频率。增加
autovacuum_vacuum_scale_factor
和autovacuum_vacuum_insert_scale_factor
等参数的值,以减少autovacuum
运行的频率。详细操作请参见设置实例参数。使用通用云盘提高IO吞吐量性能。ESSD云盘支持变更为通用云盘,详情请参见ESSD云盘变更为通用云盘。
长期解决方案
将RDS PostgreSQL的大版本升级至15版本及以上。RDS PostgreSQL 15及以上版本将统计信息放入了共享内存,并去掉了stats collector
进程,避免对物理IO的占用。升级实例大版本请参见RDS PostgreSQL大版本升级。