I am trying to "reserve" a core on a CPU for performance measurement. I have mounted a cpuset cgroups vfs. I created two subgroups like this:
/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
I am able to move many processes to the "All" group, but I fail to do so for some (those who look like kernel processes). For instance, ksoftirqd has a pid of 3:
[root@Io:/vfsroot]# echo 3 > All/tasks echo: write error: invalid argument
Moreover, for some process I can see them in All/tasks but they'll still be running on the wrong cpu (here cpu #0, with a shell).
[root@Io:/vfsroot]# echo 28362 > All/tasks [root@Io:/vfsroot]# ps -eo pid,psr | grep "0$" ... 28362 0
For those I am wondering whether that's because they have not woken up since I changed their cpuset and ps displays the last cpu they ran on...
I can change my current shell cpu quite effectively. (Make it appear and disappear from /Timing/tasks and see it change CPU with ps)
I am using the latest version of Ubuntu and installed cgroups using apt-get if that matters.