8

postgres サーバーのログを見ると、Linux クライアントまたは Windows クライアントから呼び出された場合、同じ postgres サーバーでまったく同じクエリを実行すると、はるかに長い (約 10 倍の) 時間がかかることがわかります。

クエリは、4 GB の RAM を搭載した Linux マシンと 8 GB の RAM を搭載した Windows マシンで実行されている Django アプリケーションから取得されます。どちらの pyhon 環境にも、同じ postgres サーバーにリクエストを送信するための psycopg2 ライブラリ バージョン 2.4.4 があります。

以下はpostgresサーバーのログです

Windows クエリ (時間付き):

2013-06-11 12:12:19 EEST [unknown] 10.1.3.152(56895) mferreiraLOG:  duration: 3207.195 ms  statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61  AND "revisions"."repo" = 'Trunk' )

Linuxクエリ(はるかに長い):

2013-06-11 12:12:56 EEST [unknown] 10.1.3.154(35325) mferreiraLOG:  duration: 22191.773 ms  statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61  AND "revisions"."repo" = 'Trunk' )

psql から直接実行 (最速):

2013-06-11 12:19:06 EEST psql [local] mferreiraLOG:  duration: 1332.902 ms  statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61  AND "revisions"."repo" = 'Trunk' );

データベースからそれほど多くのアイテムをロードする必要がない他のクエリは、ほぼ同じように実行されます。

このクエリのクライアント間の時間差が大きいのはなぜですか?

: すべてのマシンが同じイントラネットにあるため、送信時間は関係ありません。また、postgresql サーバーが実行されているのと同じ Linux マシンからクライアント要求が送信されると、時間が遅くなります。

注 2 : Windows と Linux では、Psycopg2 のインストール方法が異なります。Windowsでは事前にパッケージ化されたバイナリからインストールしましたが、Linuxでは、システムで利用可能なpostgresqlインストールに依存する「pip install psycopg2」を実行しました。これにより、クライアント側のパフォーマンスに影響を与えるパラメーター (「work_mem」パラメーターなど) の値が異なる可能性がありますか?

4

1 に答える 1

12

遅いクライアントが SSL 暗号化を行っているかどうかを確認する必要がある場合があります。サーバー上でセットアップされ、クライアントが SSL サポートでコンパイルされている場合、デフォルトで発生します。

大量のデータを取得するクエリの場合、時間差は重要です。また、Debian/Ubuntu などの一部の Linux ディストリビューションでは、localhost を介した TCP 接続であっても、デフォルトで SSL がオンになっています。

例として、ウォーム キャッシュを使用して合計 64M バイトの 1,5M 行を取得するクエリの時間差を次に示します。

暗号化なし:

$ psql "host=localhost dbname=mlists sslmode=disable"
パスワード:
psql (9.1.7、サーバー 9.1.9)
ヘルプについては、「ヘルプ」と入力してください。

mlists=> \timing
タイミングはオンです。
mlists=> \o /dev/null
mlists => メールから件名を選択;
時間: 1672.258 ミリ秒

暗号化あり:

$ psql "host=localhost dbname=mlists"
パスワード:
psql (9.1.7、サーバー 9.1.9)
SSL 接続 (暗号: DHE-RSA-AES256-SHA、ビット: 256)
ヘルプについては、「ヘルプ」と入力してください。

mlists=> \o /dev/null
mlists=> \timing
タイミングはオンです。
mlists => メールから件名を選択;
時間: 7017.935 ミリ秒

グローバルにオフにするにはSSL=offpostgresql.conf.

クライアント アドレスの特定の範囲に対して無効にするには、より一般的なエントリの前に、最初のフィールドにpg_hba.confwithエントリを追加します。hostnosslhost

クライアント側をオフにするかどうかは、ドライバーがsslmode接続パラメーターを公開する方法によって異なります。そうでないPGSSLMODE場合、ドライバーが の上に実装されている場合は、環境変数を使用できますlibpq

Unix ドメイン ソケット ( ) を介した接続に関してlocalは、SSL は使用されません。

于 2013-06-11T13:01:50.270 に答える