1. 安装cgroup
使用yum安装:yum install libcgroup
CentOS7系统需要安装libcgroup-tools包,才有cgroup配置命令 yum install -y libcgroup-tools.x86_64
2. 创建group
cgcreate -g cpuset:test_1 //创建名称为test_1的group,在目录/sys/fs/cgroup/cpuset下可看到test_1目录,进入后看到多个文件
3. 修改cpuset.cpus的设定,将属于该策略的所有进程都绑定到cpu的第23个core去执行
root@litrin-de-xubuntu:/sys/fs/cgroup/cpuset# cd /sys/fs/cgroup/cpuset/test_1/ root@litrin-de-xubuntu:/sys/fs/cgroup/cpuset/test_1# echo 23 > cpuset.cpus root@litrin-de-xubuntu:/sys/fs/cgroup/cpuset/test_1# cat cpuset.cpus 23
4. 使用test_1策略执行进程
root@litrin-de-xubuntu:/sys/fs/cgroup/cpuset/test_1# cgexec -g cpuset:test_1 sleep 1
5. 若提示cgroup change of group failed
开始我以为我自己打开的方法不对,google了一下发现redhat,suse,arch,debian的社区都有类似的bug汇报。最终找到了Redhat官方的cgroup解释:
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.
作为CPUset策略生效的必要条件,cpus和Mems必须强制指定。cpus是指进程被绑定的内核,而Mems则表示cpu的NUMA内存节点。
问题找到了,解决就很简单了:
root@litrin-de-xubuntu:/sys/fs/cgroup/cpuset/test_1# echo 0-1 > cpuset.mems root@litrin-de-xubuntu:/sys/fs/cgroup/cpuset/test_1# cgexec -g cpuset:test_1 xxx