CPU shielding using /proc and /dev/cpuset

From RTwiki
(Difference between revisions)
Jump to: navigation, search
(Interrupt shielding)
(Interrupt shielding)
Line 1: Line 1:
 
== Interrupt shielding ==
 
== Interrupt shielding ==
  
 +
=== Kernel Space ===
 
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:
 
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
 
*CONFIG_IRQBALANCE
  
 +
 +
=== User Space ===
 
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:
 
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:
  

Revision as of 04:10, 8 September 2009

Contents

Interrupt shielding

Kernel Space

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


User Space

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

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.

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

Personal tools