Docker Java可用CPU核心数

5

如何安全地获取docker实例可用的CPU核心数?

我知道在普通Java中可以这样做(包括逻辑核心数):

int cores = Runtime.getRuntime().availableProcessors();

当Java应用程序在Docker镜像内运行时,这种情况也可以吗?还是我需要考虑其他因素?
2个回答

3

根据你的Java版本而定。旧版本的Java会给出Docker服务器上的核心数量,而你可能想要的是容器可用的数量。从8u131和Java 9开始,这个问题得到了解决


1
这是正确的答案,可以使用jshell轻松测试。只需在docker化的JShell中放置并运行Runtime.getRuntime().availableProcessors();,包括和不包括--cpus 1。从命令行输入:docker run -it --rm --cpus 1 openjdk:11-jdk - Malt
1
docker run -it --rm --cpus 2.5 openjdk:17 bash -c 'echo "Runtime.getRuntime().availableProcessors()" | jshell'请执行以上命令,它将在 openjdk:17 镜像中运行一个 Bash shell,并使用 2.5 个 CPU 核心。然后,它将在 jshell 中打印可用的处理器数量。 - Archimedes Trajano

1
在Linux主机上,您可以读取路径/sys/fs/cgroup/cpu、cpuacct/docker伪文件系统中的伪文件,该文件系统跟踪CPU使用情况。 在上述路径中查找名为要检查的容器的完整容器ID的目录,并进入该目录。 然后读取名为cpuacct.usage_percpu的文件,您可以看到容器每个核心消耗的所有CPU时间。 上面文件的绝对路径将是这样的/sys/fs/cgroup/cpu,cpuacct/docker/f24b61ce690fe77f9eb0f029215e9491cc54642d686770d71218b4a0ada27ce3 在Java中,您只需读取这些伪文件并计算每个CPU核心的使用情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接