序文として、AMD64チップセット上のカーネル3.2でDebian Wheezyを使用しています。私のマシンには2つのXeon E5-2690コアがあります。1つのCPU上のすべてのコアが単一のプロセス専用になるように、ブートパラメーターを設定しました。これを行うために、grubにisolcpus = 8,9,10,11,12,13,14,15を設定しました。
ここまでは順調ですね。ここで、特定のコマンドに分離されたCPUを使用したいとします。簡単にするために、単純な無限ループを使用します。
$ taskset -c 8-15 bash -c 'while true; echo hello> / dev / null; 完了」
これまでのところ、topはコア8がほぼ100%の使用率までスピンすることを示しています。ここで、そのコマンドをもう一度起動するとします。
$ taskset -c 8-15 bash -c 'while true; echo hello> / dev / null; 完了」
上の図は、コア9〜15がアイドル状態であり、2つのプロセスがコア8を共有していることを示しています。
$ taskset -c 8 bash -c 'while true; echo hello> / dev / null; 完了」
$ taskset -c 9 bash -c 'while true; echo hello> / dev / null; 完了」
コア8および9は、それぞれ必要に応じて100%の使用率を取得します。これはisolcpusにのみ適用されます。コア1〜7の同じタスクセットがプロセスを関連するコアに適切に分散するためです。さらに、「taskset -p」は、8〜15プロセスのアフィニティマスクが正しく設定されていることを示しています。カーネルスケジューラは、isolcpusアフィニティマスクで指定された最低のコア以外の使用を拒否しているようです。
さて、通常、これは上記の例では大した問題ではなく、各プロセスに個別のコアを指定するだけです。ただし、専用のCPUで高度にマルチスレッド化されたアプリケーションを実行したいと思います。生成される個々のスレッドごとにプロセッサアフィニティを個別にリセットすることなく、コアセットを指定し、スレッドプールに自動的に使用させます。
誰かがスケジューラにisolcpuセットから複数のコアを提供する方法を知っていますか?