web-dev-qa-db-ja.com

pgBouncerはどのように高速化に役立ちますかDjango

Geventに基づく管理コマンドがいくつかあります。私の管理コマンドは何千ものリクエストを作成するので、Geventを使用してすべてのソケット呼び出しを非ブロッキング呼び出しに変えることができます。同時にリクエストを行うことができるので、これは私のアプリケーションを本当にスピードアップします。

現在、私のアプリケーションのボトルネックはPostgresのようです。これは、Djangoへの接続に使用されるPsycopgライブラリがCで記述されており、非同期接続をサポートしていないためです。

PgBouncerを使用するとPostgresを2倍高速化できることも読んだ。これは素晴らしいように聞こえますが、誰かがpgBouncerがどのように機能し、役立つかを説明できたら素晴らしいと思いませんか?

ありがとう

25

接続と切断のオーバーヘッドを節約するだけでなく、各リクエストでこれが行われる場合、接続プーラーは多数のクライアント接続を少数の実際のデータベース接続に集中させることができます。 PostgreSQLでは、アクティブなデータベース接続の最適な数は、通常、約(((2 * core_count)+ effective_spindle_count)程度です。この数値を超えると、スループットと遅延の両方が悪化します。

「2000人のユーザーをサポートし、応答時間を速くしたい」と言う人もいます。 2000の実際のデータベース接続でそれを行おうとすると、パフォーマンスが恐ろしいものになることはほぼ保証されています。 4つのクアッドコアプロセッサを搭載したマシンを使用していて、アクティブなデータセットが完全にキャッシュされている場合、約35のデータベース接続を介して要求を集中させることにより、2000ユーザーのパフォーマンスが大幅に向上します。

それが真実である理由を理解するには、この思考実験が役立つはずです。共有するリソースが1つしかない架空のデータベースサーバーマシン、つまりシングルコアについて考えてみます。このコアは、オーバーヘッドのないすべての同時リクエスト間で均等にタイムスライスします。 100のリクエストがすべて同時に入ってくるとします。それぞれのリクエストには1秒のCPU時間が必要です。コアはそれらすべてに作用し、100秒後にすべてが完了するまで、それらの間で時間をスライスします。ここで、100のクライアント接続を受け入れる接続プールを前に置き、データベースサーバーに対して一度に1つの要求のみを行い、接続がビジー状態の間に到着した要求をキューに入れるとどうなるかを考えます。 100のリクエストが同時に到着すると、1つのクライアントが1秒で応答を受け取ります。別のクライアントは2秒で応答を受け取り、最後のクライアントは100秒で応答を受け取ります。応答を得るために誰も長く待つ必要はありませんでした。スループットは同じですが、平均待ち時間は100秒ではなく50.5秒です。

実際のデータベースサーバーには、並行して使用できるリソースがより多くありますが、同じ原則が成り立ち、リソースが飽和すると、同時データベースリクエストを追加することによってのみ害を与えます。タスクが増えると、タスクスイッチが増え、ロックとキャッシュの競合が増加し、L2とL3のキャッシュラインの競合、およびスループットとレイテンシの両方に影響するその他の多くの問題が発生するため、実際には例よりも悪いです。その上、高work_mem設定は、さまざまな方法でクエリを助けることができます。その設定は制限です各接続の計画ノードごと、したがって、接続の数が多い場合、キャッシュをフラッシュしないように非常に小さいままにする必要がありますまたはスワッピングにつながります。これにより、計画が遅くなったり、ハッシュテーブルがディスクに流出したりすることがあります。

一部のデータベース製品は接続プールをサーバーに効率的に構築しますが、PostgreSQLコミュニティは、最良の接続プールはクライアントソフトウェアの近くで行われるため、ユーザーに任せて管理するという立場を取っています。ほとんどのプーラーは、データベース接続をハードな数に制限する方法を持っていますが、それ以上の同時クライアント要求を許可し、必要に応じてそれらをキューに入れます。これはあなたが望むことであり、ステートメントや接続ごとではなく、transactionalベースで実行する必要があります。

84
kgrittn

PgBouncerは、接続プールを維持するプロキシとして機能することにより、接続の確立における待ち時間を短縮します。これは、Postgresへの短期間の接続を多数開いている場合に、アプリケーションを高速化するのに役立ちます。接続の数が少ない場合、多くの利益は得られません。

11
Michael Mior