isolcpusのさまざまなコアでタスクセットが機能しない


12

序文として、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セットから複数のコアを提供する方法を知っていますか?


マルチスレッドプログラムを使用してみることができますか?bashはマルチスレッドではない
c4f4t0r 14

1
はい、それはもともと私が気づいた原因です(私のマルチスレッドプログラムは複数のコアを使用していませんでした)。多くのスレッドを作成する単純なpythonスクリプトは、isolcpusセットで実行すると複数のコアを利用できません。(非分離コアで実行する場合、利用可能な8つのコアをすべて使用します)。
user79126 14

このlinuxtopia.org/online_books/linux_kernel/kernel_configuration/…を読んで、カーネルスケジューラからcpusを除外しますが、cpusを除外した後、除外されたcpusでプロセスを実行しますか?
c4f4t0r 14

1
プロセッサアフィニティマスクが使用する必要があることを示していない限り、カーネルはisolcpuでスレッドまたはプロセスをスケジュールしません。そうしないと、ユーザーが指定した理由でコアを予約し、不要なプロセスがそれを使用しないようにすることが目的である場合、isolcpusはコアをオフにするのと同じになります。タスクセットは、アフィニティマスクを8〜15の範囲のすべてのコア(/ procでチェックすると正しく設定されます)を使用するように設定するため、カーネルはアイドルコアでプロセスをスケジュールする必要があります。
user79126 14

回答:


9

フラストレーションの一日の後、私は解決策を決定しました。この動作は、デフォルトのカーネルスケジューラアルゴリズム(このディストリビューション/カーネルの場合はSCHED_OTHER)のアーティファクトのようです。プロセスを別のアルゴリズムに変更すると、問題が解消され、isolcpusはプロセス/スレッド全体で適切に利用されます。

最終的にSCHED_RRを使用しましたが、SCHED_FIFOとSCHED_IDLEもテストしましたが、どちらも動作しているようです。プロセスは、chrtユーティリティを使用して代替アルゴリズムで起動できます。

$ sudo chrt -r 1 [コマンド]

(非ルートとして実行する場合は、setcapユーティリティを使用して、コマンドに関連するバイナリファイルでCAP_SYS_NICEを有効にできます)


1
コア0,1へのアフィニティのタスク設定では、私のJavaアプリケーションは最初のコアのみを使用しました。「sudo chrt -r 1 [コマンド]」も私の問題を解決しました。
バリーNL 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.