postgresql - PostgreSQL autovacuum 导致性能显着下降
问题描述
我们的 Postgres DB(托管在具有 1 个 CPU、3.7 GB RAM 的 Google Cloud SQL 上,见下文)主要由一个约 90 GB 的大表组成,其中约 6000 万行。使用模式几乎完全由附加和表末尾附近的一些索引读取组成。有时会删除一些用户,删除分散在表中的一小部分行。
这一切都很好,但每隔几个月就会在该表上触发一次自动清理,这会显着影响我们服务的性能约 8 小时:
- 在 autovacuum 期间(几个小时),存储使用量增加了约 1GB,然后慢慢恢复到之前的值(由于 autovacuum 释放页面,最终可能会下降到该值以下)
- 数据库 CPU 利用率从 <10% 跃升至 ~20%
- 磁盘读/写操作从接近零增加到 ~50/秒
- 数据库内存略有增加,但保持在 2GB 以下
- 正如预期的那样,事务/秒和入口/出口字节也几乎不受影响
这会在 autovacuum 期间将我们服务的第 95 个延迟百分位从 ~100ms 增加到 ~0.5-1s,这反过来又会触发我们的监控。该服务每秒处理大约 10 个请求,每个请求由几个简单的 DB 读/写组成,每个请求通常有 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
在最不痛的时候自己安排餐桌。
但坦率地说,如果一个无害的 autovacuum 足以干扰您的操作,那么您需要更多的 I/O 带宽。
推荐阅读
- axon - 事件溯源和标准存储库可以混合使用吗?
- python - 在列表中的项目上分配变量并使用这些值打印所需的输出
- python - Python 3.6 / Oracle 18c / Oracle Client 12 问题 (OCI-22303)
- magento2 - Magento 2.26 管理帖子错误(不显示任何帖子)
- python - 我应该让我的 Web 应用程序通过前端还是后端访问 AWS 服务?
- tfs - Git 因致命错误而失败。请求的 URL 返回 URL 400
- audio-recording - 用 AudioWorklet 替换 scriptProcessorNode
- angular - Angular 7“Access-Control-Allow-Origin”标头包含多个值
- c# - 带有添加的 MRU 项目的 WPF 组合框
- java - 以不同的间隔多次重试代码段