2012-03-28 61 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附帶的設置旨在讓數據庫在小型筆記本電腦上啓動並運行 - 最佳性能通常需要進行一些調整,因此除非您的基準測試效果不同的配置設置,否則可能希望在基準測試之前查看整體配置。