我正在编写一个并行运行的库。该库通常在docker容器中使用。我想开始尽可能多的线程,因为我的docker容器已分配核心。
docker是否将CPU限制设置为某个环境变量?
例如,如果我的用户在创建容器时设置了两个CPU:
docker run --cpuset-cpus="2" myapp:latest
如何通过检查容器的状态从容器中取回号码2
?
答案 0 :(得分:2)
使用--cpuset-cpus="2"
实际使用1个cpu。例如,如果您有4个可用:{0,1,2,3}
,则必须通过用逗号分隔或通过定义范围来指定其中的2个。来自docs:
--cpuset-cpus
限制容器可以使用的特定CPU或核心。如果您有多个CPU,则容器可以使用的以逗号分隔的列表或连字符分隔的CPU范围。第一个CPU编号为0.有效值可能是0-3(使用第一个,第二个,第三个和第四个CPU)或1,3(使用第二个和第四个CPU)。
nproc
/sys/fs/cgroup/cpuset/cpuset.cpus
小例子如下:
主机:
$ nproc
4
带有1个cpu的容器:
$ docker run --rm -it --cpuset-cpus="2" ubuntu
root@73844de506db:/# nproc
1
root@73844de506db:/# cat /sys/fs/cgroup/cpuset/cpuset.cpus
2
3 cpus的容器:
$ docker run --rm -it --cpuset-cpus="0-2" ubuntu
root@4c3f841e613b:/# nproc
3
root@4c3f841e613b:/# cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-2
答案 1 :(得分:0)
根据设计,Docker容器与底层主机系统隔离,因此您不应该向Docker询问“我有多少CPU核心”。
使用/ proc / cpuinfo似乎对我不起作用,它总是告诉我容器内的1个cpu。
在Github上查看this issue描述了以迂回方式解决问题的过程。最后,这个方法会查看cgroup以确定哪些核心可用,我认为这对您有用:
cat /sys/fs/cgroup/cpuset/cpuset.cpus
答案 2 :(得分:0)
/ proc / cpuinfo,/ proc / meminfo等文件未命名空间。在容器中,最好的方法是检查/sys/fs/cgroup/cpuset/cpuset.cpus以获取可用的CPU