2012-03-28 48 views
2

我使用运行在Debian Linux上的Postgresql 9.1来执行一些基准测试任务。我想基准共享相同部分的查询的工作量。运行的每个查询之前我重新启动数据库,并执行以下命令:刷新PostgreSQL 9.1中的基准测试缓存

回声3>的/ proc/SYS/VM/drop_caches

瞄准滴两者共享存储器和OS缓存。但是,我注意到如果我以不同的顺序运行相同的查询工作负载,我会得到不同的查询响应时间。我怀疑,无论如何,查询优化器'会记住'如何有效地执行常见的查询部分或重用一些以前缓存的结果。

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

回答

1

首先想到的是autovacuum(PostgreSQL中的后台维护任务:http://www.postgresql.org/docs/current/interactive/routine-vacuuming.html#AUTOVACUUM)可能正在做一些工作,以难以预测的方式重新填充缓存。您可以禁用它,但请注意,这可能导致膨胀,导致计划选择不当的错误统计信息,并将额外的工作推向前端进程 - 因此通常不建议这样做。解决这个问题的另一种方法是在加载数据之后运行VACUUM FREEZE ANALYZE,将所有内容放入维护良好的状态,停止PostgreSQL,刷新OS缓存,然后启动并执行基准测试。

另一个可能的问题来源可能是检查点;您应确保将checkpoint_segments配置得足够高以避免强制频繁检查点,并且您应该考虑checkpoint_timeout设置,以便在基准测试期间检查点发生的时间。

RAID控制器卡或硬盘驱动器也可能缓存足够重要 - 我不知道是否刷新OS缓存清除这些,但我怀疑它。一般来说,请记住,PostgreSQL附带的设置旨在让数据库在小型笔记本电脑上启动并运行 - 最佳性能通常需要进行一些调整,因此除非您的基准测试效果不同的配置设置,否则可能希望在基准测试之前查看整体配置。