cpuset and affinity implementation
jroberson at chesapeake.net
Mon Feb 25 03:37:10 UTC 2008
I have implemented a new api similar to processors sets on solaris. This
allows you to assign processes to sets of cpus and dynamically change
those sets. This is useful for provisioning purposes to add and remove
cpu resources for a particular process or group of processes. This new
facility also supports binding secific threads to specific cpus which some
applications may want to do. At some point in the future this will be
integrated with jail so you can restrict the cpus any jail is allowed to
This api should not be considered final and the 'cpuset' tool is quite
rough. This also only works with ULE and is unfortunately intertwined
with a big ULE patch I've been working on. The set management code is
generic but 4BSD doesn't contain the hooks to actually constrain threads.
here's a couple of neat things to do with cpuset:
cpuset -l 0-4 /bin/sh
This creates a new group with a list (-l) of cpus 0-4 inclusive and runs sh in
cpuset -g -p <sh pid>
This will get (-g) the mask of cpus pid (-p) is allowed to run on.
cpuset -l 0,2 -p <sh pid>
This will restrict sh to running on cpus 0, 2 while its group is still allowed
cpuset -l 0,2 -c -p <sh pid>
This will modify the cpuset (-c) that the sh belongs to.
cpuset -l 0-3 -s 1
This will modify the set (-s) that all threads are in by default to contain the
first 4 cpus leaving the rest idled.
cpuset -g -i -p <sh pid>
This will print the id of the set sh is in.
cpuset -s <set id> -p <pid>
This will move pid into the specified set so it may be managed with other
pids in that set.
Feedback is appreciated.
More information about the freebsd-current