cgroup的cpuset问题

项目中需要将某个进程强制绑定到一个指定的CPU core中。首当其冲的考虑就是这个可以直接通过cgroup的cpuset配置来实现。

Control Groups 即Cgroup,其实之前在讨论Mesos和Docker时已经提及了多次。它旨在通过一系列文件接口的方式实现对于进程的资源隔离。同时,由于它映射成了一个文件系统,就拥有了文件系统的优势——嵌套管理的优势。

首先是建立一个cgroup的group

root@litrin-de-xubuntu:/sys/fs/cgroup/cpuset# cgcreate -g cpuset:test_1
root@litrin-de-xubuntu:/sys/fs/cgroup/cpuset# ls /sys/fs/cgroup/cpuset/ | grep test
test_1

cpuset下面,有一个名叫test_1的目录已经建好。

现在就修改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

现在,问题来了。当我尝试执行cgexe用test_1策略去起一个进程的时候,出现了问题。

root@litrin-de-xubuntu:/sys/fs/cgroup/cpuset/test_1# cgexec -g cpuset:test_1 sleep 1
cgroup change of group failed

cgroup change of group failed 进程无法切换到指定的cgroup

开始我以为我自己打开的方法不对,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 ls /
bin boot cdrom dev etc home initrd.img initrd.img.old lib lib64 lost+found media mnt opt proc root run sbin snap srv sys tmp usr var vmlinuz vmlinuz.old
推荐阅读:
经常会通过一些通用的测试工具测
首先,提个问题:64bit x
接到一个黑盒的case:一套双

“cgroup的cpuset问题”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据