すべてのスレッド/プロセスが実際に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を仮想コアの数にします。
偉大な答えをありがとう。すべてを知らなかった。アプリに非CPUバインド部分が少しある場合はどうなりますか?たとえば、CPUの計算が多いですが、最終的な結果はファイルまたはデータベースに保存されます。最終的なネットワーク(データベース)やディスク書き込み(ファイル書き込み)を待たなければならないため、プロセスを増やす必要がありますか? – Lostsoul
@Lostsoul一般に、ディスク・バインド・アクティビティのシェアが重要な場合はyesです。短い集計ファイル(複雑なシーンをレイトレースした後の画像など)を書く場合、この効果はごくわずかです。アプリケーションが大量のデータを読み書きする場合は、実際にプロセスの数を増やす必要があります。 1つの段落で答えを更新しました:もしあなたが確信が持てないなら、試してみてください! – phihag
観測部分に追加するだけで、同期オーバーヘッドのためにCPU使用率が増加しないようにしたいと思っています。したがって、実験を行う際には、システムの負荷とアプリケーションのスループットの両方を測定する必要があります。 – millimoose