Postgresのキャッシュ/バッファを表示してクリアしますか?


90

時々私はPostgresクエリを実行しますそれは30秒かかります。次に、すぐに同じクエリを実行します。2秒かかります。Postgresにはある種のキャッシュがあるようです。どういうわけか、そのキャッシュが何を保持しているかを確認できますか?チューニングのためにすべてのキャッシュを強制的にクリアできますか?

注:基本的に、次のSQLServerコマンドのpostgresバージョンを探しています。


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

しかし、そのバッファに実際に何が含まれているかを確認する方法も知りたいです。

助けてくれてありがとう。

回答:


60

pg_buffercacheモジュールを使用して、PostgreSQLバッファキャッシュの内容を確認できます。「PostgreSQLバッファキャッシュの内部」と呼ばれるプレゼンテーションを行い、表示内容を説明しました。それに伴う情報の解釈に役立つ、より複雑なクエリをいくつか示します。

一部のシステムでは、オペレーティングシステムのキャッシュを確認することもできます。大まかな例については、[pg_osmem.py]を参照してください。

キャッシュを簡単にクリアする方法はありません。Linuxでは、データベースサーバーを停止し、drop_caches機能を使用してOSキャッシュをクリアできます。最初に同期を実行するには、そこで警告に注意してください。


29
単一のセッション内でキャッシュを単純にバイパスすることは可能ですか?多くの場合、さまざまなクエリのパフォーマンステストが必要であり、このキャッシュにより、あるメソッドが別のメソッドよりも優れているかどうかを評価することが非常に困難になります(キャッシュされたパフォーマンスを比較する場合を除く)
EvilPuppetMaster 2010

7
データベースのキャッシュをバイパスまたはフラッシュする方法はありません。それをクリアするためにできることは、サーバーを再起動することだけです。
グレッグスミス

2
これは、たとえば将来の開発で可能になる可能性があると考えられますか?それとも、これは、現在のシステム(PGおよびLinux)では、試してみると不可能なことですか?
Kuberchaun 2011

9
Amazon RDSなどのマネージドPostgreSQLインストールを使用する場合、OSにアクセスできず、テスト目的でOSキャッシュを空にするのは非常に難しい場合があるため、この機能はPostgreSQLで非常に役立ちます。
Samuli Pahaoja 2014年

4
遅いクエリを再現できないのは問題ですが、チューニング後にクエリが実行されていることを確認するにはどうすればよいですか?サーバーを再起動することはオプションではありません
。prod

22

PostgreSQLでキャッシュをフラッシュするコマンドを見たことがありません。表示されるのは、通常のインデックスとデータキャッシュがディスクから読み取られ、メモリに保持されていることです。postgresqlとOSのキャッシュの両方によって。それをすべて取り除くために、私が知っている唯一の方法は次のとおりです。

あなたがすべきことは:

  1. シャットダウンデータベースサーバ(pg_ctlは、sudo service postgresql stopsudo systemctl stop postgresql、など)
  2. echo 3 > /proc/sys/vm/drop_caches これにより、OSファイル/ブロックキャッシュがクリアされます。他のOSでそれを行う方法はわかりませんが、非常に重要です。(許可が拒否された場合はsudo sh -c "echo 3 > /proc/sys/vm/drop_caches"その質問のように試してください)
  3. データベースサーバーを起動します(例sudo service postgresql startsudo systemctl start postgresql

1
Postgresのデータディレクトリが「/」がマウントされているのと同じボリューム上にない場合は、上記の操作の前後にアンマウントする必要があるかもしれません(実際にはどちらかはわかりません)。さらに(多分少しブードゥー)、これらのステップの前後に「sync」を実行してみてください。
2011年

18

drop_cachesに関するGregSmithの回答は非常に役に立ちました。キャッシュを削除するだけでなく、postgresqlサービスを停止して開始する必要があることがわかりました。これがそのトリックを行うシェルスクリプトです。(私の環境はUbuntu14.04とPostgreSQL9.3です。)

#!/usr/bin/sudo bash

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

最初は19秒かかり、その後の試行では2秒未満のクエリでテストしました。このスクリプトを実行した後、クエリは再び19秒かかりました。


15

Linuxボックスで次のコマンドを使用します。

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

キャッシュを完全に取り除きます。


2
Postgresqlのバージョンが9.0でない場合:sync; sudoサービスpostgresql停止; エコー1> / proc / sys / vm / drop_caches; sudo service postgresql start
rusllonrails 2015

@rusllonrailsこれは、サービスに名前が付けられている場合にのみ機能しpostgresqlますが、そうでない場合もあります。
jpmc26 2017年

Postgresは停止プロセス中に何かを再び書き込むことができるため、syncサーバーを停止した後、直前に実行する必要があると思いますdrop_caches
greatvovan 2018

8

はい、postgresqlには確かにキャッシュがあります。サイズは、shared_buffersの設定によって制御されます。それ以外にも、前の回答で述べたように、OSファイルキャッシュも使用されています。

キャッシュの内容を確認したい場合は、pg_buffercacheと呼ばれるcontribモジュールを使用できます(contrib /のソースツリー、contrib RPM、またはインストール方法に適した場所)。使用方法は、標準のPostgreSQLドキュメントに記載されています。

サーバーを再起動する以外に、バッファキャッシュをクリアする方法はありません。OSがLinuxの場合は、他の回答に記載されているコマンドを使用してOSキャッシュを削除できます。


7

このエラーが発生しました。

psql:/cygdrive/e/test_insertion.sql:9:エラー:パラメーター53のタイプ(t_stat_gardien)が、プランの準備時のタイプ(t_stat_avant)と一致しません

私は現在の計画をフラッシュすることを探していました、そしてこれを見つけました:

廃棄計画

私は私の挿入物の間にこれを持っていました、そしてそれは私の問題を解決します。


2
破棄プランは修正されませんでした。クエリはまだキャッシュされているようです
deFreitas 2018年

1
正しい構文はDISCARD PLANS;です。また、ドキュメントに記載されているように、「DISCARDはデータベースセッションに関連付けられた内部リソースを解放します」。
EAmez

6

はい、共有バッファのpostgresキャッシュOSキャッシュの両方をクリアすることが可能です。以下のソリューションはWindows用です...他の人はすでにLinuxソリューションを提供しています。

多くの人がすでに言っているように、共有バッファをクリアするには、Postgresを再起動するだけです(サーバーを再起動する必要はありません)。ただし、これを実行してもOSキャッシュはクリアされません。

Postgresが使用するOSキャッシュをクリアするには、サービスを停止した後、優れたSysinternals Suiteの優れたRamMaphttps://technet.microsoft.com/en-us/sysinternals/rammap)を使用します。RamMapを実行したら、メインメニューの[空]-> [空のスタンバイリスト]をクリックするだけです。

Postgresを再起動すると、キャッシュがまったくないため、次のクエリが非常に遅くなることがわかります。

Postgresを閉じずにRamMapを実行することもできます。すでに述べたように、共有バッファは通常OSキャッシュと比較してほとんど影響を与えないため、おそらく「キャッシュなし」の結果が得られます。しかし、信頼性の高いテストのために、OSキャッシュをクリアして確認する前に、postgresをすべて停止したいと思います。

注:AFAIK、RamMapを使用するときに「スタンバイリスト」以外の他のものをクリアすることはお勧めしません。他のデータが何らかの形で使用されており、そうすると問題やデータの損失を引き起こす可能性があるためです。postgresファイルだけでなく、他のアプリやOSでも使用されているメモリをクリアしていることを忘れないでください。

よろしく、チアゴL。


お役に立ててうれしいです;)
チアゴ・リンハレス・デ・オリベイラ2017

5

これが私のショートカットです

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;

5

キャッシュpg_buffercacheを調べるモジュールがありますshared_buffers。そして、ある時点で、「コールド」キャッシュでいくつかのパフォーマンステストを行うためにキャッシュをドロップする必要があったので、まさにこれを行うpg_dropcache拡張機能を作成しました。チェックアウトしてください。


0

専用のテストデータベースがある場合は、パラメータ:共有バッファを16に設定できます。これにより、すべてのクエリのキャッシュが無効になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.