容器启动失败:内存不足,Java运行环境无法继续运行

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 堆可能会阻止本机堆的增长。

可能的解决方案:

  • 减少系统内存负载
  • 增加物理内存或交换空间
  • 检查交换后备存储是否已满
  • 减少 Java 堆大小 (-Xmx/-Xms)
  • 减少 Java 线程数
  • 减少 Java 线程堆栈大小 (-Xss)
  • 使用 -XX:ReservedCodeCacheSize= 设置更大的代码缓存

我们已经尝试过:

  1. 添加更多交换内存。服务器有 8GB RAM,而我们尝试了从 4GB 交换到 9GB。
  2. 使用堆大小 Xms 和 Xmx 从 128m 到 4096m。
  3. 将此服务器上的 RAM 增加到 16GB,而另一台可以运行的服务器仍然使用 8GB。

以下是内存和交换消耗的情况:

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 可以达到相同的结果 - 我尝试过但失败了。