PostgreSQL autovacuum 导致性能显着下降

PostgreSQL autovacuum causing significant performance degradation

我们的 Postgres 数据库(托管在 Google 云 SQL 上,有 1 CPU,3.7 GB RAM,见下文)主要由一个大的 ~90GB table大约有 6000 万行。使用模式几乎完全由附加和一些接近 table 末尾的索引读取组成。有时会删除一些用户,删除分散在 table.

中的一小部分行

一切正常,但每隔几个月就会触发自动清理 table,这会严重影响我们服务的性能约 8 小时:

这会在 autovacuum 期间将我们服务的第 95 个延迟百分位从 ~100 毫秒增加到 ~0.5-1 秒,这反过来会触发我们的监控。该服务每秒处理大约 10 个请求,每个请求包含几个简单的数据库 reads/writes,每个数据库通常有 2-3 毫秒的延迟。

以下是一些说明问题的监控截图:

数据库配置相当普通:

记录此 autovacuum 过程的日志条目内容如下:

system usage: CPU 470.10s/358.74u sec elapsed 38004.58 sec
avg read rate: 2.491 MB/s, avg write rate: 2.247 MB/s
buffer usage: 8480213 hits, 12117505 misses, 10930449 dirtied
tuples: 5959839 removed, 57732135 remain, 4574 are dead but not yet removable
pages: 0 removed, 6482261 remain, 0 skipped due to pins, 0 skipped frozen
automatic vacuum of table "XXX": index scans: 1

有什么可以调整以减少未来自动清理对我们服务的影响的建议吗?还是我们做错了什么?

如果您可以增加 autovacuum_vacuum_cost_delay,您的 autovacuum 会 运行 更慢并且侵入性更小。

但是,将 autovacuum_vacuum_cost_limit 设置为 2000 左右通常是使其更快的最佳解决方案。然后它完成得更快。

您也可以尝试将 VACUUM 的 table 安排在最不痛的时候。

但坦率地说,如果一个无害的 autovacuum 足以干扰您的操作,您需要更多 I/O 带宽。