jos*_*osh 7 postgresql postgresql-9.6 amazon-rds
我在 RDS 上使用 Postgres 9.6.1,看到的写入吞吐量比我预期的要高几个数量级。我看到 WriteThroughput 大约为 40,000,000 字节/秒。我查看了以下内容以尝试追踪它的来源:
我安装了 pg_stat_statements 并且一直在定期运行:
SELECT sum(shared_blks_dirtied) from pg_stat_statements
Run Code Online (Sandbox Code Playgroud)
看起来我的查询每秒最多只能脏大约 30 个块。一个块是 8kB,对吧?所以这只是每秒 240 kB。(我还检查了临时块和本地块,我几乎没有弄脏它们或写它们。我还确认我没有达到 pg_stat_statements 将跟踪的唯一语句的限制)。
我也在查看我的日志,我看到每 5 分钟运行一次关于此大小的检查点:
LOG: checkpoint complete: wrote 8538 buffers (0.4%); 0 transaction log file(s) added, 0 removed, 3 recycled; write=269.825 s, sync=0.021 s, total=269.921 s; sync files=2349, longest=0.010 s, average=0.000 s; distance=39599 kB, estimate=39599 kB
Run Code Online (Sandbox Code Playgroud)
所以这大约是 40 MB / 5 分钟 = 133 kB 每秒,这与我在 pg_stat_statements 中看到的数量级相同。
所以我有点困惑......我的数学计算有误,还是我应该在其他地方寻找产生所有写入吞吐量的原因?
另一件事要提到:我有很多表和模式:大约 25,000 个模式和 200 万个关系。(我通常每分钟创建/删除新模式几次)。我发现 autovacuum 无法跟上这一点,即使配置非常激进,所以我根据我的写入模式手动清理和分析表,并且我已经向上调整了 autovacuum 阈值,以便在实践中我的手动清理几乎总是在 autovacuum 运行之前到达那里。我已经确认我的手动真空确实出现在 pg_stat-statements 中,所以我假设它们生成的任何写入都已经在我的上述分析中被考虑在内,但也许没有?
事实证明,我的绝大多数写入吞吐量来自统计信息收集器。由于我的数据库中有非常多的关系,统计数据异常大。我能够通过暂时清除统计信息来诊断问题:
SELECT pg_stat_reset()
Run Code Online (Sandbox Code Playgroud)
这导致我的写入吞吐量立即急剧下降。为了解决未来的问题,我已使用以下设置将我的 stats 目录重定向到 ram 磁盘而不是硬盘驱动器:http : //docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html #PostgreSQL.Concepts.General.FeatureSupport.RamDisk
最终结果是 CloudWatch 现在报告的吞吐量约为 400 KB/s,而不是 40 MB/s。
| 归档时间: |
|
| 查看次数: |
2862 次 |
| 最近记录: |