2013-12-11 6 views
18

通常の使用後に30個のアイドル状態のポストグルプロセスが非常に多くのプロセス固有のメモリを占めるのを理解しようとしています。私はPostgres 9.3.1とCentOSリリース6.3(最終版)を使用しています。 topを使用して、私はpostgresの接続の多くは非共用の300メガバイト(平均〜200メガバイト)まで使用している(RES - SHR)ことがわかりますメモリ:多くのメモリを占有しているアイドル状態のポストグルプロセス

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
3534 postgres 20 0 2330m 1.4g 1.1g S 0.0 20.4 1:06.99 postgres: deploy mtalcott 10.222.154.172(53495) idle 
9143 postgres 20 0 2221m 1.1g 983m S 0.0 16.9 0:14.75 postgres: deploy mtalcott 10.222.154.167(35811) idle 
6026 postgres 20 0 2341m 1.1g 864m S 0.0 16.4 0:46.56 postgres: deploy mtalcott 10.222.154.167(37110) idle 
18538 postgres 20 0 2327m 1.1g 865m S 0.0 16.1 2:06.59 postgres: deploy mtalcott 10.222.154.172(47796) idle 
1575 postgres 20 0 2358m 1.1g 858m S 0.0 15.9 1:41.76 postgres: deploy mtalcott 10.222.154.172(52560) idle 

約29総アイドル接続があります。これらのアイドル状態の接続は、マシンがスワップを使用し始めるまでメモリ内で増加し続けるため、パフォーマンスは停止します。 期待どおり、接続をリセットすると、プロセス固有のメモリがクリアされます。同じマシン上の同じ数の接続は、定期的に再接続すると、メモリの20%(スワップ0)しか使用しません。これらのプロセスはどのような情報を保持していますか?私は長期間稼動していないアイドル状態のpostgresプロセスが、まったく新しいアイドル状態のメモリと同様のメモリ使用量を持つことを期待しています。

重要なこと:私はスキーマを頻繁に使用しています。私のアプリへのリクエストごとに、私はsearch_pathを設定してリセットしています。

答えて

12

これらのプロセスはどのような情報を保持していますか?私は長期間稼動していないアイドル状態のpostgresプロセスが、まったく新しいアイドル状態のメモリと同様のメモリ使用量を持つことを期待しています。

  • relcache(関係記述子)
  • catcache(システムカタログエントリ)
  • はコンパイル:

はそれがそれらをロードした後Postgresはローカルメモリにキャッシュすることを実際にかなりの数のものがありますplpgsql関数のツリー

ほとんどの場合、これらはすべて無視されます。ここでの重要な点は、スキーマの多用とrelcacheへの影響であった。このデータベースには〜500個のスキーマがあり、それぞれ〜90個のテーブルがあります。 Postgresでは、スキーマはすべて同じですが、これは45,000のテーブル(500 * 90)になります。

各リクエストは、メモリ内のテーブルのリレーションディスクリプタの一部をキャッシュしています(ほとんどの場合、前のリクエストとは異なるスキーマ)。残念ながら、Postgres does not offer a way to limit the size of these cachesは、おそらくほとんどの使用例でオーバーヘッドが逆効果になるためです。

考えられる解決策:

を使用してPostgresの接続数の上限を置くために、より多くのメモリに
  • 接続プーリングを追加します。

    Postgres mailing listsでこれを助けてくれたTom LaneとMerlin Moncureに感謝します。

  • 関連する問題