我正在尝试使用内核的cpuset
隔离我的进程。为此,我遵循内核文档cpusets中的说明( 2.1基本用法),但是,它在我的环境中不起作用。
我在我的centos7服务器和ubuntu16.04工作计算机中都尝试过,但是都没有工作。
[root@node ~]# uname -r
3.10.0-327.el7.x86_64
4.15.0-46-generic
我尝试过的方法如下。
root@Latitude:/sys/fs/cgroup/cpuset# pwd
/sys/fs/cgroup/cpuset
root@Latitude:/sys/fs/cgroup/cpuset# cat cpuset.cpus
0-3
root@Latitude:/sys/fs/cgroup/cpuset# cat cpuset.mems
0
root@Latitude:/sys/fs/cgroup/cpuset# cat cpuset.cpu_exclusive
1
root@Latitude:/sys/fs/cgroup/cpuset# cat cpuset.mem_exclusive
1
root@Latitude:/sys/fs/cgroup/cpuset# find . -name cpuset.cpu_excl
usive | xargs cat
0
0
0
0
0
1
root@Latitude:/sys/fs/cgroup/cpuset# mkdir my_cpuset
root@Latitude:/sys/fs/cgroup/cpuset# echo 1 > my_cpuset/cpuset.cpus
root@Latitude:/sys/fs/cgroup/cpuset# echo 0 > my_cpuset/cpuset.mems
root@Latitude:/sys/fs/cgroup/cpuset# echo 1 > my_cpuset/cpuset.cpu_exclusive
bash: echo: write error: Invalid argument
root@Latitude:/sys/fs/cgroup/cpuset#
它仅显示错误bash: echo: write error: Invalid argument
。
Google,但是我找不到正确的答案。
如上所述,在进行操作之前,我确认cpuset
根路径已启用cpu_exclusive功能,并且所有cpus未被其他子cpuset排除。
通过使用ps -o pid,psr,comm -p $PID
,如果我不关心cpu_exclusive
,我可以确认可以将cpus分配给某个进程。但是我也证明了,如果未设置cpu_exclusive
,则也可以将同一cpus分配给另一个进程。
我不知道是不是因为缺少一些预设。
我期望的是“使用cpuset获得cpus的独占使用”。谁能提供任何线索?
非常感谢。
答案 0 :(得分:1)
我相信这是对cpu_exclusive标志的误解,就像我一样。这是文档https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt,引用:
If a cpuset is cpu or mem exclusive, no other cpuset, other than
a direct ancestor or descendant, may share any of the same CPUs or
Memory Nodes.
所以您拥有bash: echo: write error: Invalid argument
的一个可能原因是,您启用了其他cgroup cpuset,并且它与echo 1 > my_cpuset/cpuset.cpu_exclusive
的操作冲突
请运行find . -name cpuset.cpus | xargs cat
列出您所有cgroup的目标cpus。
假定您有12个cpus,如果要设置my_cpuset
的 cpu_exclusive ,则需要仔细修改所有其他cgroup以使用cpus。 0-7,然后将my_cpuset
的cpus设置为8-11。完成所有这些cpus配置后,您可以将 cpu_exclusive 设置为1。
但是,其他进程仍然可以使用CPU 8-11。仅属于其他cgroups 的任务将不使用CPU 8-11
对我来说,我有一些docker容器正在运行,这使我无法设置cpuset cpu_exclusive
使用内核文档,我认为cgroup本身不可能单独使用cpus。一种方法(我知道这种方法正在生产中运行)是我们隔离cpus,并由我们自己管理cpu关联性/ cpuset