web-dev-qa-db-ja.com

PostgresはRAM(キャッシュ)を大量に消費します

Centos 6 x64(RAM:8 GB)に小さなデータベースPostgreSQL(v9.3)があります。

postgresql.conf

max_connections = 512
shared_buffers = 3000MB  
temp_buffers = 8MB          
work_mem = 2MB          
maintenance_work_mem = 128MB         
effective_cache_size = 3000MB

約150の接続で、PostgreSQLは6 GB以上のRAM(もちろん、他のアプリケーションは約200 MBのRAMを使用します)を使用します)、ここに私の情報:

Mem:  7062.945M total, 6892.410M used,  170.535M free, 6644.000k buffers
Swap:    0.000k total,    0.000k used,    0.000k free, 5378.922M cached

質問:

  1. なぜPGは多くのRAMを使用するのですか?

  2. PGのキャッシュバッファを削減するにはどうすればよいですか?

1
Luan Huynh

PostgreSQLは大量のRAMを使用していません。カーネルはそれをディスクキャッシュに使用しています。

これがまさにあなたが起こしたいことです。ここで修正するものはありません。

"無料" RAMは無駄なRAMです。データベースサーバーにとって最良のことは、できるだけ多くのRAMをディスクキャッシュとして使用することです。

10
Craig Ringer

実際、_shared_buffers = 3000MB_を使用すると、PostgresdoesはRAM( 8 GBのシステムの場合は相対的に言えば)-すべてのRAMでなくても、あなたが考えていたように。そして、「理由」は明らかです。 _shared_buffers_ の設定で指示したためです。設定は高い(デフォルトは128MB)が、専用DBサーバーの場合、設定はまだ妥当と思われます。 (通常、合計の40%以上RAMは過剰です。)

Postgresはbothシステムキャッシュand独自の共有バッファを使用します。共有バッファはPostgresに対して専用であり、メモリは他のプロセスと共有されません。データの短期バッファリングに使用され、高速処理に不可欠です。システムキャッシュは、キャッシュに何を保持するか、リソースが要求された場合に何をプッシュアウトするかを長期的に処理するために、よりスマートで高速です。 @ Craigの回答 および 見つけたサイト は、システムキャッシュseemsがすべてのRAMを消費する理由を説明しています。これはすべて、Unix/Linux用です。 Windowsの動作は一部の側面で異なり、詳細についてはよくわかりません。

  • このマニュアルには、さまざまなシナリオの詳細情報と手順が記載されています。 カーネルリソースの管理
  • Postgres Wiki には、_shared_buffers_の設定方法に関するアドバイスがあります。

"PGのキャッシュされたバッファを減らす"(そして"small database"で実際にそれを実行する必要があるかもしれません)_shared_buffers_と Postgresを再起動します:

このパラメータは、サーバーの起動時にのみ設定できます。

3