我的docker容器有多少CPU?

MRo*_*lin 5 docker

我正在写一个并行运行的库.该库通常在docker容器中使用.我想开始尽可能多的线程,因为我的docker容器已分配核心.

docker是否将CPU限制设置为某个环境变量?

例如,如果我的用户在创建容器时设置了两个CPU:

docker run --cpuset-cpus="2" myapp:latest
Run Code Online (Sandbox Code Playgroud)

(见这个问题)

如何2通过检查容器的状态从容器中取回数字?

tgo*_*gos 10

--cpuset-cpus="2"您实际使用 1 cpu。例如,如果您有 4 个可用:{0,1,2,3}您必须通过用逗号分隔它们或定义一个范围来指定其中的 2 个。从文档

--cpuset-cpus

限制容器可以使用的特定 CPU 或内核。如果您有多个 CPU,则容器可以使用的以逗号分隔的列表或以连字符分隔的 CPU 范围。第一个 CPU 编号为 0。有效值可能是 0-3(使用第一个、第二个、第三个和第四个 CPU)或 1,3(使用第二个和第四个 CPU)。

回答:

  • 要获得可用的处理单元数: nproc
  • 要获取 CPU 集: /sys/fs/cgroup/cpuset/cpuset.cpus

小例子如下:

  1. 主持人:

    $ nproc
    4
    
    Run Code Online (Sandbox Code Playgroud)
  2. 具有 1 个 CPU 的容器:

    $ docker run --rm -it --cpuset-cpus="2" ubuntu
    root@73844de506db:/# nproc
    1
    root@73844de506db:/# cat /sys/fs/cgroup/cpuset/cpuset.cpus
    2
    
    Run Code Online (Sandbox Code Playgroud)
  3. 具有 3 个 CPU 的容器:

    $ docker run --rm -it --cpuset-cpus="0-2" ubuntu
    root@4c3f841e613b:/# nproc
    3
    root@4c3f841e613b:/# cat /sys/fs/cgroup/cpuset/cpuset.cpus
    0-2
    
    Run Code Online (Sandbox Code Playgroud)


blu*_*res 2

Docker 容器在设计上与底层主机系统隔离,因此您不应该问 Docker“我有多少个 CPU 核心”。

使用 /proc/cpuinfo 似乎对我不起作用,它总是告诉我容器内有 1 个 cpu。

在Github上看这个问题,用迂回的方式描述了解决这个问题的历程。最终,此方法会查看 cgroup 以确定哪些核心可用,我认为这对您有用:

cat /sys/fs/cgroup/cpuset/cpuset.cpus