CPU shielding using /proc and /dev/cpuset
m (CPU shielding moved to CPU shielding using /proc and /dev/cpuset) |
(→Interrupt shielding) |
||
Line 15: | Line 15: | ||
After this you can change the CPU affinity mask of each interrupt by doing: | After this you can change the CPU affinity mask of each interrupt by doing: | ||
− | {{cmdroot|echo ''hex_mask'' > /proc/irq/''irq_number''/smp_affinity}} | + | {{cmdroot|echo ''hex_mask'' > /proc/irq/''<irq_number>''/smp_affinity}} |
To check that the affinity mask has been set you can check the contents of the smp_affinity file. {{NOTE|The mask is updated the next time an interrupt is serviced. So you may not see the change immediately.}} | To check that the affinity mask has been set you can check the contents of the smp_affinity file. {{NOTE|The mask is updated the next time an interrupt is serviced. So you may not see the change immediately.}} |
Revision as of 04:09, 8 September 2009
Interrupt shielding
In order to shield CPUs from individual interrupts being serviced on them you have to make sure that the following kernel configuration parameter is set:
- CONFIG_IRQBALANCE
Then make sure that the interrupts are not automatically balanced by the irqbalance daemon. This daemon is started from the irqbalance init script. To disable once do:
# /etc/init.d/irqbalance stop
To disable after next reboot do:
# chkconfig irqbalance off
After this you can change the CPU affinity mask of each interrupt by doing:
# echo hex_mask > /proc/irq/<irq_number>/smp_affinity
More information can be found in /usr/src/kernel/Documentation/IRQ-affinity.txt
.
Process shielding
The kernel has an cpuset feature that allows you to create cpusets for real-time purposes. The kernel interface is proc filesystem based. It is described in /usr/src/kernel/Documentation/cpusets.txt
.
Here is a quick example of how to use cpuset to reserve one cpu for your real-time process on a 4 cpu machine:
# mkdir /dev/cpuset/rt0
# echo 0 > /dev/cpuset/rt0/cpus
# echo 0 > /dev/cpuset/rt0/mems
# echo 1 > /dev/cpuset/rt0/cpu_exclusive
# echo $RT_PROC_PID > /dev/cpuset/rt0/tasks
# mkdir /dev/cpuset/system
# echo 1-3 > /dev/cpuset/system/cpus
# echo 0 > /dev/cpuset/system/mems
# echo 1 > /dev/cpuset/system/cpu_exclusive
# for pid in $(cat /dev/cpuset/tasks); do /bin/echo $pid > /dev/cpuset/system/tasks; done