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」パラメーターなど) の値が異なる可能性がありますか?