首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java (在JDK8更新131之前)应用程序在坞容器中运行的CPU /内存问题?

Java (在JDK8更新131之前)应用程序在坞容器中运行的CPU /内存问题?
EN

Stack Overflow用户
提问于 2020-10-08 12:49:16
回答 1查看 841关注 0票数 0

JVM(更新131之前的JDK 8)在码头容器中运行,忽略了容器环境设置的CGroup限制。而且,他们是在查询主机资源,而不是向容器分配什么。结果对JVM来说是灾难性的,即当JVM试图分配比通过CGroup限制所允许的更多资源(CPU或内存)时,docker恶魔会注意到这一点,并在java程序运行pid 1时杀死JVM进程或容器本身。

内存问题解决方案- - (可能在JDK8UPDATE 131中修复),就像上面描述的那样,JVM分配的内存比容器所允许的内存要多。这可以很容易地由

  1. 在启动JVM时显式设置最大堆内存限制(使用-Xmx )。(在131次更新之前)
  2. 或者传递这些标志-(在131更新之后) -XX:+UnlockExperimentalVMOptions-XX:+UseCGroupMemoryLimitForHeap

再次解决了(可能在JDK 212中解决)问题,运行在docker中的JVM将直接查看主机硬件并获得可用的CPU总数。然后,它将尝试访问或优化基于这个CPU计数。

  1. 在JDK 8更新212之后,在docker容器中运行的任何JVM都将遵守分配给容器的cpu限制,而不是直接查看主机cpu。如果按照下面的方式启动具有cpu限制的容器,JVM将遵守这一限制,并将自己限制为1个cpu。 在此容器中运行的docker run -ti --cpus 1 -m 1G openjdk:8u212-jdk //jvms仅限于1 1cpu。
  2. 这里是我的问题:问题很可能是在JDK8更新212,中修复的,但是如果我不能更新我的JDK8并且在更新131之前运行版本,我如何解决JDK8问题.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-08 22:20:51

Linux容器支持首先出现在JDK 10中,然后移植到8u191,参见JDK-8146115

JVM的早期版本获得可用CPU的数量如下所示。

  • 在8u121之前,HotSpot JVM依赖于sysconf(_SC_NPROCESSORS_ONLN) libc调用。然后,glibc读取系统文件/sys/devices/system/cpu/online。因此,为了伪造可用CPU的数量,可以使用绑定安装替换该文件: 回显0-3 >/tmp/在线码头运行--cpu 4 -v /tmp/在线:/sys/设备/系统/cpu/联机. 要只设置一个CPU,请编写echo 0而不是echo 0-3
  • 从8u121开始,JVM就变成了任务集感知。而不是sysconf,它开始调用sched_getaffinity来查找进程的CPU关联掩码。 这打破了装订技巧。不幸的是,您不能以与sched_getaffinity相同的方式伪造sysconf。但是,可以使用sched_getaffinity替换预压的libc实现。

我编写了一个小型共享库程序计数,它替换了sysconfsched_getaffinity。因此,这个库可以用于在8u191之前的所有JDK版本中设置正确数量的可用CPU。

是如何工作的

  1. 首先,它读取cpu.cfs_quota_uscpu.cfs_period_us,以确定容器是否使用--cpus选项启动。如果两者都高于零,则CPUs的数量估计为 cpu.cfs_quota_us / cpu.cfs_period_us
  2. 否则,它将读取cpu.shares并将可用CPU的数量估计为 cpu.shares / 1024 这种CPU计算类似于它在现代容器感知的JDK中的实际工作方式。
  3. 库定义(重写) sysconfsched_getaffinity函数,以返回(1)或(2)中获得的处理器数。

如何编译

代码语言:javascript
运行
复制
gcc -O2 -fPIC -shared -olibproccount.so proccount.c -ldl

如何使用

代码语言:javascript
运行
复制
LD_PRELOAD=/path/to/libproccount.so java <args>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64262912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档