2.9. Starting a Process in a Control Group
Important
Some subsystems have mandatory parameters that must be set before you can move a task into a cgroup which uses any of those subsystems. For example, before you move a task into a cgroup which uses the
cpuset
subsystem, the cpuset.cpus
and cpuset.mems
parameters must be defined for that cgroup.
The examples in this section illustrate the correct syntax for the command, but only work on systems on which the relevant mandatory parameters have been set for any controllers used in the examples. If you have not already configured the relevant controllers, you cannot copy example commands directly from this section and expect them to work on your system.
Refer to Chapter 3, Subsystems and Tunable Parameters for a description of which parameters are mandatory for given subsystems.
Launch processes in a cgroup by running the
cgexec
command. For example, this command launches the firefox web browser within the group1
cgroup, subject to the limitations imposed on that group by the cpu
subsystem:
~]# cgexec -g cpu:group1 firefox http://www.redhat.com
The syntax for
cgexec
is:
cgexec -g
subsystems:path_to_cgroup command arguments
where:
- subsystems is a comma‑separated list of subsystems, or
*
to launch the process in the hierarchies associated with all available subsystems. Note that, as withcgset
described in Section 2.7, “Setting Parameters”, if cgroups of the same name exist in multiple hierarchies, the-g
option creates processes in each of those groups. Ensure that the cgroup exists within each of the hierarchies whose subsystems you specify here. - path_to_cgroup is the path to the cgroup relative to the hierarchy.
- command is the command to run.
- arguments are any arguments for the command.
You can also add the
--sticky
option before the command to keep any child processes in the same cgroup. If you do not set this option and the cgred service is running, child processes will be allocated to cgroups based on the settings found in /etc/cgrules.conf
. The process itself, however, will remain in the cgroup in which you started it.
Alternative method
When you start a new process, it inherits the group of its parent process. Therefore, an alternative method for starting a process in a particular cgroup is to move your shell process to that group (refer to Section 2.8, “Moving a Process to a Control Group”), and then launch the process from that shell. For example:
~]#echo $$ > /cgroup/cpu_and_mem/group1/tasks
~]#firefox
Note that after exiting firefox, your existing shell is still in the
group1
cgroup. Therefore, an even better way would be:
~]# sh -c "echo \$$ > /cgroup/cpu_and_mem/group1/tasks && firefox"
2.9.1. Starting a Service in a Control Group
You can start certain services in a cgroup. Services that can be started in cgroups must:
- use a
/etc/sysconfig/servicename
file - use the
daemon()
function from/etc/init.d/functions
to start the service
To make an eligible service start in a cgroup, edit its file in the
/etc/sysconfig
directory to include an entry in the form CGROUP_DAEMON="subsystem:control_group"
where subsystem is a subsystem associated with a particular hierarchy, and control_group is a cgroup in that hierarchy. For example:
CGROUP_DAEMON="cpuset:group1"
If
cpuset
is mounted to /cgroup/cpu_and_mem/
, the above configuration translates to /cgroup/cpu_and_mem/group1
.