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 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大版本升級。