2012-02-20 7 views
8

私はマルチプロセッシングで脚を濡らしているだけですが、プロセスの数を選択する際のガイドラインがあるかどうか疑問に思っていましたか?それはちょうどサーバー上のコアの数に基づいていますか?それは何とかあなたの実行(ループの数、CPUの使用量など)に基づいていますか?等...どのように私はいくつのプロセスを生み出すかを決定するのですか?現在、私はプロセスを推測し追加/削除していますが、何らかのガイドラインやベストプラクティスがあれば素晴らしいでしょう。マルチプロセスでプロセス数を選択する際のガイドラインはありますか?

もう1つの質問ですが、少なすぎるものを追加すると(プログラムはスローです)、「あまりにも多く」を追加するとどうなりますか?

ありがとうございます!

答えて

9

すべてのスレッド/プロセスが実際にCPUにバインドされている場合は、CPUがコアをレポートするプロセス数だけ実行する必要があります。 HyperThreadingのため、各物理CPUコアは複数の仮想コアを提示することができます。仮想コアの数を取得するにはmultiprocessing.cpu_countに電話してください。

のみPあなたのスレッドの1のはCPUバウンドである場合は、Pを乗じてその数を調整することができます。たとえば、プロセスの半分がCPUバインド(p = 0.5)で、コアが4つでHyperThreadingが2つのCPUが2つある場合は、0.5 * 2 * 4 * 2 = 8プロセスを開始する必要があります。

プロセスが少なすぎると、アプリケーションが予想よりも遅く動作します。アプリケーションが完全にスケーリングされ、CPUバウンドのみである(つまり、コアの量の10倍で実行された場合の速度が10倍速い)場合は、速度が相対的に遅いことを意味します。たとえば、システムが8つのプロセスを呼び出すが、4つしか起動しない場合は、処理能力の半分を使用し、2倍の時間を要します。実際にはアプリケーションは完全にはスケールされませんが、一部の(レイトレーシング、ビデオエンコーディング)はかなり近いことに注意してください。

プロセスが多すぎると、同期のオーバーヘッドが増加します。あなたのプログラムがほとんど同期のオーバーヘッドにならない場合、これは全体的なランタイムに影響することはありませんが、プロセスをより低い優先順位に設定しない限り、他のプログラムの速度が遅くなることがあります。あなたのOSが良いスケジューラを持っているならば、理論的にはプロセスの数が過度に(例えば10000)うまくいきます。実際には、事実上すべての同期がオーバーヘッドを耐え難いものにします。

アプリケーションがCPUバウンドか完全スケーリングのどちらであるかわからない場合は、異なるスレッド数でシステム負荷を監視してください。システムの負荷を100%弱にするか、より正確にはuptimeを仮想コアの数にします。

+0

偉大な答えをありがとう。すべてを知らなかった。アプリに非CPUバインド部分が少しある場合はどうなりますか?たとえば、CPUの計算が多いですが、最終的な結果はファイルまたはデータベースに保存されます。最終的なネットワーク(データベース)やディスク書き込み(ファイル書き込み)を待たなければならないため、プロセスを増やす必要がありますか? – Lostsoul

+0

@Lostsoul一般に、ディスク・バインド・アクティビティのシェアが重要な場合はyesです。短い集計ファイル(複雑なシーンをレイトレースした後の画像など)を書く場合、この効果はごくわずかです。アプリケーションが大量のデータを読み書きする場合は、実際にプロセスの数を増やす必要があります。 1つの段落で答えを更新しました:もしあなたが確信が持てないなら、試してみてください! – phihag

+2

観測部分に追加するだけで、同期オーバーヘッドのためにCPU使用率が増加しないようにしたいと思っています。したがって、実験を行う際には、システムの負荷とアプリケーションのスループットの両方を測定する必要があります。 – millimoose

1

これは間違いなくアプリケーションの機能に基づいています。 CPUが重い場合、コアの数は正常な開始点です。 IOが重い場合は、複数のプロセスがパフォーマンスに影響しません。 IO(IO)が頻繁に発生するCPU(PNG最適化など)の場合、コアの数よりも多くのプロセスを実行できます。

確かにわかる唯一の方法は、現実的な入力でアプリケーションを実行し、リソースの使用率を確認することです。余分なCPU時間がある場合は、より多くのワーカープロセスを追加してください。

関連する問題