問題描述
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大版本升級。