Mas*_*ora 22 java containers tomcat out-of-memory docker
我们有一个在 Java 8 上运行的企业应用程序。部署环境是通过 Bitbucket 管道构建和更新的。我有一张显示环境高级架构的图形。除了一些特定于应用程序的环境变量之外,我们有两个运行相同配置的应用程序服务器。
一切都运行良好,直到一周前成功运行管道后,其中一台服务器上的 2 个应用程序实例停止工作并出现以下错误:
There is insufficient memory for the Java Runtime Environment to continue.
Cannot create GC thread. Out of system resources.
Run Code Online (Sandbox Code Playgroud)
两个实例在另一台服务器上都运行良好。相反,容器无法在此服务器上启动。
该错误伴随以下信息:
可能的原因: 系统物理 RAM 或交换空间不足 进程在启用 CompressedOops 的情况下运行,Java 堆可能会阻止本机堆的增长。
可能的解决方案:
我们已经尝试过:
以下是内存和交换消耗的情况:
free -mh
total used free shared buff/cache available
Mem: 15Gi 378Mi 12Gi 1.0Mi 2.9Gi 14Gi
Swap: 9Gi 0B 9Gi
Run Code Online (Sandbox Code Playgroud)
我有几个相关工件的链接。其中包括完整的docker logs输出以及故障服务器和运行服务器docker info上的输出。
这就是docker ps -a我们得到的:
:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d29747bf2ad3 :a7608a838625ae945bd0a06fea9451f8bf11ebe4 "catalina.sh run" 10 hours ago Exited (1) 10 hours ago jbbatch
0951b6eb5d42 :a7608a838625ae945bd0a06fea9451f8bf11ebe4 "catalina.sh run" 10 hours ago Exited (1) 10 hours ago jbapp
Run Code Online (Sandbox Code Playgroud)
我们现在没有想法,因为我们已经尝试了几乎所有关于堆栈溢出的解决方案。我们缺少什么?
Ser*_*nin 31
我看到您的 Docker 映像使用 Ubuntu 22.04 LTS 作为基础。最近在此 LTS 版本之上重建了基础 Java 映像,这在较旧的 Docker 运行时上引起了很多问题。这很可能就是您正在经历的情况。它与内存无关,而是与 Docker 与用作基础映像的较新 Linux 版本不兼容有关。
您的运行服务器的 Docker 服务器版本为 20.10.10,而故障服务器的版本为 20.10.09。Docker 20.10.10 中完全修复了不兼容问题。有关不兼容性问题的更多技术详细信息可在此处获取。
解决方案是将出现故障的服务器至少升级到 Docker 20.10.10。
ish*_*ulz 10
我也犯过同样的错误。输出
# docker info
Run Code Online (Sandbox Code Playgroud)
曾是:
....
Security Options:
seccomp
WARNING: You're not using the default seccomp profile
Profile: /etc/docker/seccomp.json
....
Run Code Online (Sandbox Code Playgroud)
该问题已通过放置解决
security_opt:
- seccomp:unconfined
Run Code Online (Sandbox Code Playgroud)
在服务的 docker-compose.yml 中并删除并重新创建容器
docker rm <container_name>
docker-compose up -d <service_name>
Run Code Online (Sandbox Code Playgroud)
也许调整 /etc/docker/seccomp.jsonn 可以达到相同的结果 - 我尝试过但失败了。