问题描述
我们有一个计划的清理作业,用于删除具有过去时间戳的记录。我们以 10'000 个为批次选择它们,并通过主键(复合键整数和时间戳)删除它们。此作业可能会在几秒钟内删除多达 200,000 条记录。
我们可以在运行此作业后立即一致地复制所有读取器上的 cpu 负载达到 100%(因此阻止应用程序)。我们还可以一致地看到,运行 VACUUM 会立即使负载恢复正常。
这是一个已知问题吗?我们可以做些什么来避免 100% 的 cpu 峰值?
设置
- aurora (AWS) postgresql 12.6 集群
- 1 个作者,2 个读者 (db.r5.2xlarge)
- 数据库
- 数据库大小:50 GB
- 索引大小:30 GB
- 一张桌子:
- 主键是复合键(整数、时间戳)
- 时间戳列上的附加索引(为了选择过去的记录)
- 加载
- 提交吞吐量
- 写入器上 300 次计数/秒
- 每个阅读器 300 次/秒
自动真空设置:
姓名 | 价值 |
---|---|
自动吸尘器 | 开 |
log_autovacuum_min_duration | 10s |
autovacuum_max_workers | 3 |
autovacuum_naptime | 5s |
autovacuum_vacuum_threshold | 50 |
autovacuum_analyze_threshold | 50 |
autovacuum_vacuum_scale_factor | 0.1 |
autovacuum_analyze_scale_factor | 0.05 |
autovacuum_freeze_max_age | 200000000 |
autovacuum_vacuum_cost_delay | 5ms |
autovacuum_vacuum_cost_limit | 1200 |
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)