我怎样才能在Docker容器中运行一个进程?

时间:2017-04-06 23:44:46

标签: python linux docker virtualization numa

我有一个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?谢谢!

3 个答案:

答案 0 :(得分:1)

  1. 您需要获取哪个cpus属于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

  5. 有关详细信息,请参阅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 更安全的方法,但仍应启用您需要的功能。