如何在 Docker 容器内对进程进行数字绑定



我有一个英特尔至强融核 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? 谢谢!

  1. 您需要获取哪个 CPU 属于 1 个 numa 节点:

    $ lscpu | grep node1

    NUMA node1 CPU(s): 8-15,24-31

  2. 为 docker 创建 cpuset:

    $ cgcreate -g cpuset:docker

    $ echo 8-15 > /sys/fs/cgroup/cpuset/docker/cpuset.cpus

  3. 如果只想在特定 NUMA 节点上运行某些容器:

    cgcreate -g cpuset:my-cgroup

    echo 8-15 > /sys/fs/cgroup/cpuset/my-cgroup/cpuset.cpus

  4. 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更安全的方法,但仍应启用所需的功能。

最新更新