我在 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 …