我正在尝试使用内核的cpuset
来隔离我的进程。为了获得这个,我按照内核文档 cpuset 中的说明(2.1 基本用法)进行操作,但是,它在我的环境中不起作用。
我已经在我的 centos7 服务器和我的 ubuntu16.04 工作电脑中尝试过,但都没有用。
- CentOS 内核版本:
[root@node ~]# uname -r
3.10.0-327.el7.x86_64
- ubuntu内核版本:
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
. 谷歌一下,但是,我无法得到正确的答案。
正如我上面粘贴的,在操作之前,我确认cpuset
根路径已启用cpu_exclusive功能,并且所有 cpu 都没有被其他子 cpuset 排除。
通过使用ps -o pid,psr,comm -p $PID
,我可以确认如果我不在乎cpu_exclusive
,可以将CPU分配给某个进程。但我也证明了,如果没有设置cpu_exclusive
,同样的 cpu 也可以分配给另一个进程。
我不知道是不是因为错过了一些预设。
我期望的是"使用 cpuset 获得 CPU 的独占使用"。谁能提供任何线索?
非常感谢。
我相信这是对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 的目标 CPU。
假设你有 12 个 CPU,如果要设置my_cpuset
的cpu_exclusive,则需要仔细修改所有其他 cgroup 以使用 CPU,例如 0-7,然后将my_cpuset
的 CPU 设置为 8-11。完成所有这些 cpus 配置后,您可以将cpu_exclusive设置为 1。
但是,其他进程仍然可以使用 CPU 8-11。只有属于其他 cgroup的任务不会使用 cpu 8-11
对我来说,我有一些 docker 容器正在运行,这阻止我设置 CPU 集cpu_exclusive
对于内核文档,我认为不可能仅由cgroup本身使用CPU。一种方法(我知道这种方法在生产环境中运行)是我们隔离 CPU,并自己管理 CPU 关联/cpuset