2.9. 在控制组群中启动一个进程
重要
有些子系统拥有强制参数,您在可以将任务移动到使用那些子系统的 cgroup 前必须设定这些参数。例如:在您将任务移动到使用
cpuset
子系统的 cgroup 前,必须为那个 cgroup 定义 cpuset.cpus
和 cpuset.mems
参数。
本章的示例演示了命令的正确语法,但只适用于在此示例中为所有控制器设定了相关强制参数的系统。如果您还没有配置相关控制器,您就无法直接将本章中的命令示例直接用于您的系统。
给定子系统的强制参数的描述请参考 第 3.10 节 “附加资源”。
您还可以运行
cgexec
命令在 cgroup 中启动进程。例如:这个命令启动了 group1
cgroup 中的 lynx 网页浏览器,目的是限制 cpu
子系统为那个组群造成的负担。
~]# cgexec -g cpu:group1 lynx http://www.redhat.com
cgexec
语法为:cgexec -g
subsystems:path_to_cgroup command arguments
,其中:
- subsystems 是用逗号分开的子系统列表或者
*
启动与所有可用子系统关联的层级中的进程。请注意:如 第 2.7 节 “设置参数” 所述的cgset
,如果在多个层级中有同名的 cgroup,-g
选项会在每个组群中创建进程。请确定您在拥有在此指定的子系统的层级中都有该 cgroup。 - path_to_cgroup 是到与该层级相关的 cgroup 的路径。
- command 是要运行的命令
- arguments 是该命令所有参数
您还可以在 command 前面添加
-- sticky
将所有子进程放在同一 cgroup 中。如果您没有设定这个选项,且 cgred 守护进程正在运行,则将根据在 /etc/cgrules.conf
中的设置将子进程分配到 cgroup 中。而该进程本身仍保留在启动它的 cgroup 中。
备用方法
当您启动新进程时,它会继承其父进程的组群。因此在具体 cgroup 中启动进程的备选方法是将您的 shell 进程移动到那个组群中(请参考 第 2.8 节 “将某个进程移动到控制组群中”),然后在那个 shell 中启动该进程。例如:
~]#echo $$ > /cgroup/lab1/group1/tasks
lynx
请注意:退出 lynx 后,您现有 shell 中仍在
group1
cgroup 中。因此更好的方法应为:
~]# sh -c "echo \$$ > /cgroup/lab1/group1/tasks && lynx"
2.9.1. 在控制组群中启动服务
您可在某个 cgroup 中启动某些服务。在 cgroup 中启动的服务必须:
- 使用
/etc/sysconfig/servicename
文件 - 使用
/etc/init.d/functions
的daemon()
功能启动该服务
要在某个 cgroup 中启动合格服务,请在
/etc/sysconfig
中编辑其文件,使该文件包含格式如下的条目:CGROUP_DAEMON="subsystem:control_group"
,其中 subsystem 是与具体层级关联的子进程,control_group 是那个层级中的 cgroup。例如:
CGROUP_DAEMON="cpuset:daemons/sql"