我有一个Intel Xeon Phi 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?谢谢!
答案 0 :(得分:1)
您需要获取哪个cpus属于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/。
答案 1 :(得分:1)
我遇到了同样的问题,该问题通过使用“ -特权”模式创建容器而得以解决。
通过这种模式,我们可以在容器内绑定mem和CPU节点,并有效地使用numa。
使用以下命令:
/etc/modprobe.d/blacklist.conf
答案 2 :(得分:0)
尝试向容器授予具有欺骗性名称的 CAP_SYS_NICE
功能,这允许进程“为任意进程设置 CPU 关联性”[ref]:
docker run --cap-add SYS_NICE <other arguments>
这是比 --privileged
更安全的方法,但仍应启用您需要的功能。