cgroups、cpusetが一部のプロセスのcpusetを変更できませんでした。

cgroups、cpusetが一部のプロセスのcpusetを変更できませんでした。

パフォーマンスを測定するためにCPUにコアを「予約」しようとしています。私はcpuset cgroups vfsをインストールしました。次のように2つのサブグループを作成しました。

/cpuset.cpu_exclusive    1
/cpuset.cpus             0-3
/cpuset.mems             0

# Everything on the PC except what I want to measure
/All/cpuset.cpu_exclusive    1
/All/cpuset.cpus             1-3
/All/cpuset.mems             0

# The measurement processes only (i.e. the shell + a binary to test)
/Timing/cpuset.cpu_exclusive    1
/Timing/cpuset.cpus             0
/Timing/cpuset.mems             0

多くのプロセスを「すべての」グループに移動できましたが、一部(カーネルプロセスのように見えるプロセス)ではそれを行うことができませんでした。たとえば、ksoftirqdのpidは3です。

[root@Io:/vfsroot]# echo 3 > All/tasks 
echo: write error: invalid argument

また、一部のプロセスでは All/Tasks で表示されますが、まだ間違った CPU (ここでは CPU #0、シェルを使用) で実行されます。

[root@Io:/vfsroot]# echo 28362 > All/tasks 
[root@Io:/vfsroot]# ps -eo pid,psr | grep "0$"
...
28362   0

彼らのために、これは私が彼らのcpusetを変更して以来、彼らが目覚めておらず、psが彼らが実行していた最後のCPUを示しているからであると思います...

現在、シェルCPUを非常に効率的に変更できます。 (/ Timing / tasksで表示され消え、PSを使用してCPUが変更されていることを確認してください)

必要に応じて、最新バージョンのUbuntuを使用し、apt-getを使用してcgroupをインストールしました。

答え1

マンページcset-shieldには次の説明があります。

オプションの--kthread = onオプションがShieldコマンドに指定されている場合、すべてのカーネルスレッド(CPU固有の割り込みカーネルスレッドを除く)もシステムセットに移動されます。

私はこれを「(一部)割り込みカーネルスレッドがCPUにバインドされています」と解釈します。名前で判断するとksoftirqd(Kernel Soft IRQ Daemon)が可能な候補のようです! (ところで、私はこれらのカーネルスレッドがパフォーマンス測定に影響を与えないと思います。)

関連情報