2

ローカル ネットワーク上の複数のマシンで実行される Postgresql 8.3 を使用して Python でアプリケーションを作成しています。

すべてのマシン

1)データベースサーバーから膨大な量のデータをフェッチし(データベースがマシンから2秒で100の異なるクエリを取得するとします)、それを実行しているマシンは約10台または11台です。

2) データを処理した後、マシンは特定のテーブルを更新する必要があります (マシンごとに 1.5 秒あたり約 3 または 4 回の更新/挿入クエリ)。

私が気付いたのは、サーバーがプロセスを異常終了させたり、サーバー マシンをフリーズさせたり (ハード リセットが必要) したりして、データベースが何度かダウンすることです。

ちなみに、すべてのマシンは常にデータベースへの一定の接続を維持しています。つまり、Psycopg2 (Python で) を使用して接続が確立されると、処理が終了するまで (数時間続く可能性があります) アクティブなままになります。

アプリケーションで多数の接続を処理するための最良/最適な方法は何ですか?各クエリの後に破棄する必要がありますか?

次に、 max_connections を増やす必要がありますか?

この件に関するアドバイスをいただければ幸いです。

4

2 に答える 2

1

最も可能性の高い原因は、確かにメモリ不足のように聞こえます。これらが Linux サーバーの場合、メモリ不足状態をトリガーすると、「OOM-killer」が呼び出され、メモリ ホグ プロセスが単純に終了されます (したがって、「サーバーはプロセスを異常終了しました」)。メモリ不足の状況は、多くの場合、ディスク スワッピング/ページングの負荷が非常に高いことを意味し、サーバーが応答していないように見えます。

dmesg" " に似たものがないか、カーネル ログ ファイル (またはコマンド) を参照してくださいOut of Memory: Killed process 1234 (postgres)。これは、カーネルがメモリをオーバーコミットすることを許可するデフォルトが原因です。最初に行うべきことは、オーバーコミットを無効にして、メモリ不足の状況を適切に処理できるようにすることです。

echo 2 > /proc/sys/vm/overcommit_memory

プランA:

原因として考えられるのは、work_mem個々の操作ごとに割り当てることができるメモリの量を指定する設定です。1 つのクエリは、メモリを集中的に使用する複数のステップで構成される場合があるため、各バックエンドは、グローバル設定に加えて、数倍のwork_mem量のメモリを割り当てることができます。さらに、オペレーティング システムのキャッシュ用の空きメモリも必要です。shared_buffers

詳細については、リソース消費設定に関する PostgreSQL マニュアルを参照してください: PostgreSQL 8.3 ドキュメント、リソース消費

次の手段:

これらのチューナブルを減らすと、クエリが非常に遅くなり、まだ作業が完了しない可能性があります。これに代わる方法は、並行して実行できるクエリの数を人為的に制限することです。PostgreSQL の接続プールミドルウェアの多くは、並列クエリの数を制限し、代わりにキューイングを提供できます。このソフトウェアの例としては、pgbouncer (より単純) とpgpool -II (より柔軟) があります。

EDIT:あなたの質問に答える:

アプリケーションで多数の接続を処理するための最良/最適な方法は何ですか?各クエリの後に破棄する必要がありますか?

一般に、PostgreSQL への新しい接続の確立は高速ではありません。これは、PostgreSQL がバックエンドごとに新しいプロセスを生成するためです。ただし、プロセスはメモリの点で安価ではないため、データベースへのアイドル状態の接続を多数維持することはお勧めできません。

プラン Bで述べた接続プーリング ミドルウェアは、いつ、どのくらいの頻度でプーラーに接続または切断するかに関係なく、Postgres への妥当な数の接続を維持します。したがって、そのルートを選択すると、接続を手動で開いたり閉じたりすることを心配する必要はありません。

次に、 max_connections を増やす必要がありますか?

データベース サーバーに大量の RAM (8 GB 以上) がない限り、既定の制限である 100 接続を超えることはありません。

于 2009-11-14T16:01:47.350 に答える
1

これは、特にデータベース サーバーが文字通りクラッシュした場合に、DB サーバーに問題がある可能性があるように思えます。ログから問題の根本原因を突き止めることから始めます。メモリ不足のようなものである可能性がありますが、ハードウェアの障害が原因で発生する可能性もあります.

開始時にすべての接続を開いて、それらを開いたままにしている場合max_connectionsは、原因ではありません。DB接続を処理する方法は問題なく、サーバーがどのように構成されていても、サーバーはそれを行うべきではありません。

于 2009-11-13T14:39:45.877 に答える