最近、postgresql 9.1.6(8.3から)にアップグレードしました。私たちのテストサーバーは、max_pred_locks_per_transactionを少なくとも900まで設定する必要があることを示しました(これは推奨設定の64をはるかに超えています)。
現在本番環境にあり、ログが次のようにいっぱいになるため、このパラメーターを何度も増やす必要がありました。
ERROR: 53200: out of shared memory
HINT: You might need to increase max_pred_locks_per_transaction.
クライアント接続設定が600の場合(ただし、100クライアントを超えることのないプーリングシステム):
max_pred_locks_per_transaction:3000に行きました。約1日で使い果たされました。9000に行き、約3日でなくなりました。
現在、30000に設定しています。この数は、許可されたクライアント接続ごとに割り当てられる平均であるため、ロックスペース専用の約5GBの共有メモリがあります。
私はshared_buffersをかなり高く設定しています(現時点では24GB)。これはRAMの40%を超えています。(次回の再起動時にこれをRAMの約25%に調整する予定です)。
編集:このチューニングは悪い考えであることが判明しました。私のデータベースは大量のクエリを伴うものであり、shared_buffers専用の大きなRAMの半分を使用すると、大きなテーブルを完全にキャッシュできるため、データベースが窒息するのを防ぎます。
平均して、一度に約5〜10個のアクティブなクエリが表示されます。クエリの負荷は、更新の負荷をはるかに上回っています。
ここで何が問題になっているのかを追跡する方法を教えてくれる人はいますか?このような小さなアップデートセットでは、なぜロックが頻繁に不足しているのか理解できません...それは本当に私へのリークのようなにおいがします。
ロックがどこに向かっているのかを調べる方法を知っている人はいますか?(たとえば、この問題に関してpg_locksの内容をどのように読み取ることができますか)