2011-10-19 4 views
1

私は、ワーカープロセスを起動するPython(2.6.5 64ビット、Windows 2008 Server R2)アプリケーションを持っています。親プロセスはジョブをジョブキューに入れ、そこから従業員がジョブキューを取り出します。同様に結果キューもあります。各ワーカーは、サーバーに照会することでジョブを実行します。従業員のCPU使用率は低いです。Pythonマルチプロセッシングキュー多数のワーカーにスケーリング

ワーカーの数が増えると、サーバーのCPU使用率は実際には低下します。サーバー自体はボトルネックではありません。他のアプリケーションからさらにロードすることができます。

他にみんな同様の動作が見られますか?多数のプロセスが同じキューに読み書きしているときに、Pythonの多重処理キューに問題がありますか?

+0

あなたは「私は労働者の数を増やしましたが、行われている作業の量は減少しています」と明言できますか? – MattH

+1

いくつかのコードを共有できますか?実装によっては、多くの原因が考えられます。 –

+0

@MattH:仕事の意味が少ない(A)サーバー上のCPU使用率が低下し、(B)記録される結果の割合が低下する。(記録結果はボトルネックではなく、サーバーの処理能力を超えてテストされています)。 – Underhill

答えて

0

すべての詳細を指定しない限り、何が起こっているのか正確にはわかりません。

ただし、実際の並行処理はハードウェアスレッドの実際の数によって制限されることに注意してください。起動されるプロセスの数がハードウェアスレッドの実際の数よりもはるかに多い場合、コンテキスト切り替えのオーバーヘッドは、より多くの並行プロセスを持つ利点を上回ることになります。

+0

物理的な処理時間が十分にあり、CPU使用率はかなり低いです。コンテキスト切り替えの問題ではありません。この問題は、8コアシステムではわずか30人の労働者で問題になります。また、各作業者はかなりのアイドル時間を費やしています。サーバーへのクエリには約1/3秒かかります。 – Underhill

1

性能制約のために二つの異なるアイデア:

  1. ボトルネックがお互いに戦って労働者とジョブキューへのアクセスのための親です。
  2. ボトルネックは、サーバー上の接続率制限(syn-flood protection)です。

収集の詳細情報:

  1. 作業量プロフィール:あなたのコアの性能指標としてこれを使用して、毎秒完了したタスクを。
  2. パケットキャプチャを使用して、ネットワークレベルの遅延のネットワークアクティビティを表示します。
  3. ジョブキューにアクセスするまでの待ち時間を作業者に文書化してもらいます。

考えられる改善:

  1. (例えばHTTP)利用可能/該当する場合は、あなたの労働者が持続的な接続を使用してもらいます。
  2. タスクを複数のジョブキューに分割して、複数のワーカーにプールします。
+0

ワーカーはすでに永続的な接続を使用しています。私はマルチキューのアプローチを検討してきましたが、実際の問題が依然として非常にぼんやりしている場合は、その多くのコードを並べ替えることをためらっています。 (問題がPythonマルチプロセッシングの場合には、実際のプロセス数を減らすために、ワーカープロセスあたり4つのワーカースレッドを使用することも考えました。) – Underhill

0

新しいtheadの作成は非常に高価な操作です。

多くのパラレルネットワーク接続を制御する最も簡単な方法の1つは、非同期ソケットをサポートするスタックレススレッドを使用することです。 Pythonには素晴らしいサポートとライブラリがたくさんありました。

私の好きなものはgeventです。これは素晴らしい、完全に透明な猿のパッチを当てるユーティリティです。

関連する問題