在PostgreSQL 9.1中清空缓存以进行基准测试

3

我正在使用运行在Debian Linux上的Postgresql 9.1执行一些基准测试任务。我想要对一个具有共同部分查询工作负载进行基准测试。在运行每个查询之前,我重新启动数据库并执行以下命令:

echo 3 > /proc/sys/vm/drop_caches

旨在清除共享内存和操作系统缓存。然而,我注意到如果我以不同的顺序运行相同的查询工作负载,我会得到不同的查询响应时间。我怀疑查询优化器会“记住”如何高效地执行常见的查询部分,或者重用先前缓存的结果。

您有什么办法绕过这个问题吗?我想获得大致相同的响应时间,无论查询顺序如何。请注意,我正在解析EXPLAIN输出以提取实际运行时间。

1个回答

2
首先要考虑的是,自动清理(PostgreSQL中的后台维护任务:http://www.postgresql.org/docs/current/interactive/routine-vacuuming.html#AUTOVACUUM)可能正在以难以预测的方式重新填充缓存。您可以将其禁用,但请注意,这可能会导致膨胀、错误的统计数据导致错误的计划选择,并将额外的工作推到前端进程上-因此通常不建议这样做。另一种方法是在加载数据后运行VACUUM FREEZE ANALYZE,使所有内容处于良好维护的状态,停止PostgreSQL,刷新您的操作系统缓存,然后启动并进行基准测试。
另一个可能出现问题的来源是检查点;您应该确保已将checkpoint_segments配置得足够高,以避免强制频繁的检查点,并且您应该考虑checkpoint_timeout设置,以确定检查点在基准测试期间何时发生。
还有可能是RAID控制器卡或硬盘缓存足够大-我不知道清除操作系统缓存是否会清除它们,但我对此表示怀疑。
总的来说,要记住PostgreSQL带有旨在使数据库在较小的笔记本电脑上启动和运行的设置-通常需要进行一些调整才能实现最佳性能,因此除非您的基准测试正在测试不同配置设置的影响,否则您可能希望在进行基准测试之前重新审查整体配置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接