2009-08-01 2386 views
55

有時我運行Postgres查詢需要30秒。然後,我立即運行相同的查詢,它需要2秒鐘。看來Postgres有某種緩存。我可以以某種方式查看緩存的內容嗎?我可以強制清除所有緩存以進行調整嗎?查看並清除Postgres緩存/緩存?

注:基本上,我在尋找一個Postgres版本以下SQL Server命令:


DBCC FREEPROCCACHE 
DBCC DROPCLEANBUFFERS 

但我也想知道怎麼看什麼是真正包含在緩衝區中。

感謝您的任何幫助。

回答

43

您可以使用pg_buffercache模塊查看PostgreSQL緩衝區緩存中的內容。我已經完成了一個名爲「Inside the PostgreSQL Buffer Cache」的演示文稿,它解釋了您所看到的內容,並展示了一些更復雜的查詢以幫助解釋與之相關的信息。

也可以在某些系統上查看操作系統緩存,有關一個有點粗略的示例,請參閱pg_osmem.py

無法輕鬆清除緩存。在Linux上,您可以停止數據庫服務器並使用drop_caches工具清除OS緩存;一定要注意那裏的警告先運行同步。

+14

是否可以簡單地繞過一個會話中的緩存?我們經常需要對不同的查詢進行性能測試,並且這種緩存使得評估一種方法是否比另一種更好(除了比較緩存的性能時)是非常困難的。 – EvilPuppetMaster 2010-12-09 02:02:56

+0

謝謝,但是有Postgres SQL命令刷新緩存嗎? – 2011-01-14 23:59:14

+4

無法繞過或刷新數據庫的緩存。您可以執行的所有操作都是重新啓動服務器。 – 2011-01-22 15:24:30

16

我還沒有看到任何命令刷新PostgreSQL中的緩存。你看到的可能只是正常的索引和數據緩存從磁盤讀取並保存在內存中。通過postgresql和操作系統中的緩存。爲了擺脫這一切,我知道的唯一途徑:

你應該做的是:

  1. 關閉數據庫服務器(pg_ctl,須藤服務的PostgreSQL停止, 等)
  2. 回聲3>/proc/sys/vm/drop_caches 這將清除OS文件/塊緩存 - 非常重要,但我不知道如何在其他操作系統上執行此操作。
  3. 啓動數據庫服務器
+1

認爲這將是有益的注意:如果Postgres的數據目錄是不一樣的捲上‘/’安裝,您可能需要之前卸除/上述操作後, (不確定哪個,真的)。另外(也許有點巫術)嘗試在這些步驟之前和之後運行「同步」。 – marqueed 2011-11-04 07:01:58

5

是和PostgreSQL肯定有緩存。大小由設置shared_buffers控制。除此之外,正如前面的回答所提到的那樣,OS文件緩存也被使用。

如果你想看看有什麼在緩存中,有一個名爲pg_buffercache可用的contrib模塊(contrib請/在源代碼樹,在contrib RPM,或任何適合您如何安裝)。如何使用它在標準的PostgreSQL文檔中列出。

除了重啓服務器之外,沒有辦法清除緩衝區緩存。您可以使用其他答案中提到的命令刪除操作系統緩存 - 只要您的操作系統是Linux。

11

我在我的Linux系統中使用這個命令:

sync; /etc/init.d/postgresql-9.0 stop; echo 1 > /proc/sys/vm/drop_caches; /etc/init.d/postgresql-9.0 start 

它徹底擺脫了緩存。

6

我有這個錯誤。

psql:/cygdrive/e/test_insertion.sql:9: ERROR: type of parameter 53 (t_stat_gardien) does not match that when preparing the plan (t_stat_avant)

我一直在尋找沖洗當前計劃和發現這一點:

DISCARD PLAN

我有我的這個插件之間,它解決了我的問題。

6

Greg Smith對drop_caches的回答非常有幫助。我發現除了刪除緩存之外,還需要停止並啓動postgresql服務。這是一個可以實現這個技巧的shell腳本。 (我的環境是Ubuntu的14.04和PostgreSQL 9.3。)

#!/usr/bin/sudo bash 

service postgresql stop 
sync 
echo 3 > /proc/sys/vm/drop_caches 
service postgresql start 

我與花19秒所述第一時間,以及小於2秒後續嘗試查詢測試。運行此腳本後,查詢再次花費19秒。

3

這是我的快捷

echo 1 > /proc/sys/vm/drop_caches; echo 2 > /proc/sys/vm/drop_caches; echo 3 > /proc/sys/vm/drop_caches; rcpostgresql stop; rcpostgresql start; 
3

pg_buffercache模塊尋找到shared_buffers緩存。在某些時候,我需要放棄緩存來對'冷'緩存進行一些性能測試,所以我寫了一個pg_dropcache擴展,完成這個。請檢查一下。

3

是的,可以清除共享緩衝區postgres緩存 OS緩存。解決方案波紋管是針對Windows ...其他人已經提供了Linux解決方案。

正如許多人已經說了,要明確你可以重新啓動的Postgres(無需重新啓動服務器)的共享緩存。但只是這樣做不會清除操作系統緩存。

要清除Postgres所使用操作系統的緩存,停止服務後,使用該外觀極好RAMMAPhttps://technet.microsoft.com/en-us/sysinternals/rammap),從外觀極好的Sysinternals Suite。 一旦你執行RamMap,只需點擊主菜單中的「Empty」 - >「Empty Standby List」。

重新啓動Postgres,你會看到現在你的下一個查詢將由於沒有緩存而變得緩慢。

您也可以執行RAMMAP而不關閉Postgres的,而且很可能會有「不緩存」結果,你想要的,因爲人們已經說過,共享緩存相比,操作系統的緩存通常給人的影響很小。但是對於可靠的測試,我寧願在清除OS緩存之前停止postgres以確保。

注意:AFAIK,在使用RamMap時,我不建議您清除「備用列表」以外的其他內容,因爲其他數據在某種程度上正在被使用,如果您這樣做,您可能會導致問題/數據丟失。請記住,您正在清除內存,不僅可以使用postgres文件,還可以使用其他應用程序和操作系統。

問候,蒂亞戈L.