我有一个英特尔至强融核 64 核 CPU,其中 16GB 片上内存设置为 NUMA 节点 1。 我想将 Docker 容器内运行的进程绑定到此 NUMA 节点,但它出错了:
root@Docker$ sudo numactl --membind 1 python script.py
Error: set_mempolicy: Operation not permitted
setting membind: Operation not permitted
我还尝试将整个 Docker 母舰绑定到 NUMA 节点 1,但没有运气:
localhost$ sudo numactl --membind 1 docker run xyz /bin/bash
这不会给出任何错误,但显示没有片上存储器的利用率。
我的问题是:如何将进程成功绑定到 NUMA 节点 1? 谢谢!
-
您需要获取哪个 CPU 属于 1 个 numa 节点:
$ lscpu | grep node1
NUMA node1 CPU(s): 8-15,24-31
-
为 docker 创建 cpuset:
$ cgcreate -g cpuset:docker
$ echo 8-15 > /sys/fs/cgroup/cpuset/docker/cpuset.cpus
-
如果只想在特定 NUMA 节点上运行某些容器:
cgcreate -g cpuset:my-cgroup
echo 8-15 > /sys/fs/cgroup/cpuset/my-cgroup/cpuset.cpus
-
Docker允许将新容器放在不同的cgroup下:
docker run -it --rm --cgroup-parent=/my-cgroup/ ubuntu bash
有关详细信息,请参阅 https://sthbrx.github.io/blog/2016/07/27/get-off-my-lawn-separating-docker-workloads-using-cgroups/。
我遇到了同样的问题,通过使用">--privileged"模式创建容器解决了这个问题。
通过这种模式,我们可以将 mem 和 CPU 节点绑定在容器内并有效地使用 numa。
使用以下命令:
#docker run --privileged --name=test_numa --net=host -itd <image_id>
尝试向容器授予欺骗性命名的CAP_SYS_NICE
功能,这允许进程"为任意进程设置 CPU 关联" [ref]:
docker run --cap-add SYS_NICE <other arguments>
这是一种比--privileged
更安全的方法,但仍应启用所需的功能。