%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81CPUSET%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E9%9A%94%E9%9B%A2%E3%81%95%E3%82%8C%E3%81%9F%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%83%BC%E3%83%BB%E3%82%B3%E3%82%A2%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E5%84%AA%E5%85%88%E5%BA%A6%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82.png)
まず、私たちが達成しようとしている目標の背景知識をお知らせします。起動パラメータ(isolcpuとnohz_full、ハウスキーピングサブシステム設定)を使用して特定のCPUを分離する方法を知っています。
しかし、私の要件に応じて、システムの起動後にCPUを隔離する必要があります。そこで、多くの記事に続き、次のサブシステムを使用して特定のCPUを分離しようとしましたcpuset
。
私が使用するハードウェアには16個のCPUがあります。 (0-15).そこでCPU 0を切り離すことにしました。
$ cd /cpusets
$ mkdir housekeeping
$ mkdir isolate
$ echo 1-15 > housekeeping/cpus
$ echo 0 > mems
$ echo 0 > isolated/cpus
$ echo 0 > isolated/mens
$ echo 0 > cpuset.sched_load_balance
$ echo 0 > isolated/sched_load_balance
$ while read P ; do echo $P > housekeeping/tasks ; done < tasks
これにより、0
プロセッサは他のすべてのプロセッサから隔離されます。ただし、taskset
次のようにプロセスをプロセッサ0に割り当てようとすると:
/******loop.c**********/
int main(){
int i;
for(i=0;;i++);
return 0;
}
$ gcc -o loop.c loop
$ taskset -c 0 ./loop
taskset: failed to set pid 2755250's affinity: Invalid argument
検疫/作業にpidをエコーするだけでなく、2755250
検疫CPUの新しいプロセスの好みを設定できますか0
?
私はどこで間違っていますか?
答え1
taskset
通知されますsched_setaffinityもし
接続されたビットマスクマスクには、現在システムに物理的に配置されているプロセッサは含まれていません。そして、cpuset cgroupsまたは「cpuset」メカニズムによって課される可能性がある制限に基づいてスレッドを使用できます。cpuset(7) で説明されています。
ブートパラメータを使用するときの動作が異なる理由は、カーネルisolcpus=
ドキュメント(Documentation/admin-guide/kernel-parameters.txt
)でCPUアフィニティシステムコールによって実行時に無視される可能性があることに注意してください。
CPUアフィニティシステムコールまたはcpusetを介してプロセスを「解放された」CPUの内外に移動できます。
逆に、人間CPUセットsched_setaffinity 設定が競合した場合、cpuset バッチが強制されることを通知します。
CPUset は、カーネルの sched_setaffinity(2) スケジューリング選好メカニズムと mbind(2) および set_mempolicy(2) メモリ配置メカニズムと統合されています。これらのメカニズムのいずれも、プロセスがプロセスの cpuset で許可されていない CPU またはメモリノードを使用することを許可しません。。プロセスの cpuset バッチ変更がこれらの他のメカニズムと競合する場合、これが他のメカニズムをオーバーライドしても cpuset バッチが強制されます。カーネルは、これらの他のメカニズムによって要求されたCPUとメモリノードを、呼び出しプロセスのcpusetが許可するノードに自動的に制限することによって、これらのオーバーライドを実行します。これにより、これらの他の呼び出しがエラーを返す可能性があります。たとえば、その呼び出しが空のCPUまたはメモリノードのセットを要求し、要求が呼び出しプロセスのcpusetに制限されることがあります。
注:また、(カーネル文書では)isolcpus=
ブートパラメータは廃止されていることに注意してください。