cpuset and affinity implementation

Jeff Roberson 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.

Please see:

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 mailing list