Apache2.2.15とMySQL5.1.52を実行しているCentOS6 Webサーバー(PHP/MySQLフォーラム)にアクセスできます。このボックスには、デュアルoct-coreXeonがあります。
CPUグラフを見ると、最初の2つのコア(0と1)が90%の使用率に達しているのに対し、他の14のコアは30〜40%の使用率にしか達していないことがわかります。 2番目のプロセッサの最初のコアであると私が信じているコア8は、使用率が高い(最大90%)のですが、前述のように、他のすべてのコアは低くなっています。
Apacheは約20のプロセスを起動しますが、デフォルトの状態では理解できず、すべてのコアを自然に利用していると思います。これは私が思うカーネルの仕事であるはずです(誰かが確認できますか?)。ただし、これらのコアが最大になると、スペアのRAMおよびディスクI/Oにもかかわらず、パフォーマンスが著しく低下します。
他のすべてのコアを「認識させる」ためにApacheで微調整できるもの、または特定のプロセスを特定のコアに割り当てるためのカーネルperamaterはありますか?たとえば、コア0と1をApacheとMySQLの使用から除外できますか?
タスクセットとのプロセス親和性の調整
例:現在のプロセスをCPUコア0,1,3に割り当てます
$ taskset -cp 0,1,3 $$
pid 21698の現在のアフィニティリスト:0〜7
pid 21698の新しいアフィニティリスト:0,1,3
特定のプロセスのみを実行するようにCPUを分離します。カーネルパラメータ「isolcpus」は、特定のCPUを他のタスクの実行から分離できます。タスクセットと一緒に、指定されたタスクのみを実行する特定のCPUを持つことができます。たとえば、grub.confに「isolcpus = 2,3」を入力すると、CPU2と3が分離されます。
http://honglus.blogspot.com/2011/03/tune-interrupt-and-process-cpu-affinity.html
すべてのアプリケーショントラフィックが高度に並列化できるわけではありません。 24コアのモンスターで実行している場合でも、内部には断固としてシングルスレッドのWebアプリケーションがあります。私たちの場合、Webサーバーは、静的サービスのためにスローするのと同じ数のコアを喜んで使用します。ただし、特定のアプリサーバーにバインドされている場合は、1つのサーバーにとどまります。
シングルスレッドプロセスが実行されているときのコアごとの使用量を見ると、各コアは100 *(1/n)の割合で実行されています。カーネルは必要に応じて複数のコア間で負荷を移動していますが、1つのプロセッサの容量の100%しか使用されていません。
この例では、LAMxスタックを実行しています。ここで、(x)はこの回答では定義されていません。結局のところ、(x)が表すものはかなり重要です。そうです、多くのコアを使用できるかどうかは、LAMパーツだけでなく、スタック内のすべてのステップに依存しています。
実際、タスクをスケジュールするのはカーネルの仕事です。マルチコア環境では、カーネルがすべてのコアにジョブを割り当てることがありますが、1つまたは2つのコアでは、Apacheなどのすべてのヘビーデューティープロセスが割り当てられます。
理想的には、カーネルは、マシンに複数のコアがあることをすでに認識している必要があります。それでも以下を実行して、スーパーユーザーであることを確認します。
dmidecode|grep Core
私のデュアルコアマシンでは、次のように書かれています。
Version: Intel(R) Core(TM) i5-2410M CPU @ 2.30GHz
Core Count: 2
Core Enabled: 2