Linux-RT processor affinity cpusets
cset examples
It is very easy to assign tasks to a particular processor or processor set!!!
For proper permissions: sudo or su root or add yourself to the admin group or /etc/sudoers file.
Use /bin/echo or just echo worked on my Ubuntu instance.
Obviously you can omit the full paths and use relative paths below, commands are listed with full paths for clarity.
mount the cpuset filesystem, add it to /etc/fstab to make it permanent and create a script called at startup to perform the subsequent initialization
set the sched_load_balance flag to zero - at that point the scheduler is not moving tasks among processors anymore, you may immediate notice in the System Monitor variation in the processor load if they weren't balanced at the moment this command was executed
create a sub cpuset for each processor or set of processor if you have more than 2
assign cpus and memory to the mems for each cpuset - my config only has one so I set it the same for each
migrate all tasks to one cpuset
migrate the critical task(s) to the dedicated cpuset
References:
cpusets.txt extend existing affinity mechanisms
Excerpts from cpusets.txt:
For real-time the top cpuset flag "sched_load_balance" should be disabled
By default, there is one sched domain covering all CPUs, except those marked isolated using the kernel boot time "isolcpus=" argument.
mounting cpuset filesystem
man cpuset filesystem
pin process to different CPU cores (using numactl)
pin to different physically memory based on NUMA nodes
Java Affinity Library
http://java.dzone.com/articles/java-threads-steroids
CPUs were additionaly occupied by handling IRQs, so reconfiguring irq load balancing by using IRQBALANCE_BANNED_CPUS could render slightly better results
The exact number of context switches can be measured using SystemTap or by examiningctxt property value in /proc/stat
You can achieve better results by employing Linux cgroups to separate application workload from system tasks by assigning two separate resource pools to those two different groups
It is very easy to assign tasks to a particular processor or processor set!!!
For proper permissions: sudo or su root or add yourself to the admin group or /etc/sudoers file.
Use /bin/echo or just echo worked on my Ubuntu instance.
Obviously you can omit the full paths and use relative paths below, commands are listed with full paths for clarity.
mount the cpuset filesystem, add it to /etc/fstab to make it permanent and create a script called at startup to perform the subsequent initialization
mkdir /dev/cpuset mount -t cpuset cpuset /dev/cpuset
set the sched_load_balance flag to zero - at that point the scheduler is not moving tasks among processors anymore, you may immediate notice in the System Monitor variation in the processor load if they weren't balanced at the moment this command was executed
cd /dev/cpuset echo 0 > sched_load_balance
create a sub cpuset for each processor or set of processor if you have more than 2
mkdir /dev/cpuset/cpu0 mkdir /dev/cpuset/cpu1
assign cpus and memory to the mems for each cpuset - my config only has one so I set it the same for each
echo 0 > /dev/cpuset/cpu0/mems
echo 0 > /dev/cpuset/cpu0/cpus
echo 0 > /dev/cpuset/cpu0/mems
echo 1 > /dev/cpuset/cpu1/cpus
migrate all tasks to one cpuset
while read i; do echo $i; done \ < /dev/cpuset/tasks > /dev/cpuset/cpu0/tasks
migrate the critical task(s) to the dedicated cpuset
echo <task pid> > /dev/cpuset/cpu1/tasks
References:
cpusets.txt extend existing affinity mechanisms
Excerpts from cpusets.txt:
For real-time the top cpuset flag "sched_load_balance" should be disabled
By default, there is one sched domain covering all CPUs, except those marked isolated using the kernel boot time "isolcpus=" argument.
mounting cpuset filesystem
man cpuset filesystem
pin process to different CPU cores (using numactl)
pin to different physically memory based on NUMA nodes
Java Affinity Library
http://java.dzone.com/articles/java-threads-steroids
http://wiki.linuxcnc.org/cgi-bin/wiki.pl?The_Isolcpus_Boot_Parameter_And_GRUB2
ps aux | awk '{print $2}' > pids
while read i; do taskset -cp 0 $i; done < pids
ps aux | awk '{print $2}' > pids
while read i; do taskset -cp 0 $i; done < pids
Comments