docker 部署JAVA应用OOM的排障经历——筑梦之路

故障现象:

 使用docker部署JAVA的应用,tomcat作为中间件容器,启动应用时总是报错无法创建Java虚拟机,然后就是OOM

报错信息:

不管是从docker容器的日志还是系统日志均未发现有用的信息,也尝试更换过镜像tomcat版本、docker版本、docker-compose版本,均未能解决该问题

于是根据报错信息:library initialization failed - unable to allocate file descriptor table - out of memory

查阅资料

docker 启动报错 library initialization failed - unable to allocate file descriptor table - out of memory_薄伤一宰的博客-CSDN博客

library initialization failed - unable to allocate file descriptor table - out of memoryAborte_Tiny-V的博客-CSDN博客

根据查阅的资料查询当前系统的文件描述符相关设置,发现当前系统limits.conf内设置的值很大

 docker 部署JAVA应用OOM的排障经历——筑梦之路_第1张图片

至此,终于找到问题根源所在。

解决方法:

 全局解决方法:修改系统配置limits.conf

* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
* soft memlock unlimited
* hard memlock unlimited
* soft core unlimited
* hard core unlimited

 解决docker当前问题:

vim  /etc/systemd/system/docker.service

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --default-ulimit nofile=65535:65535 -H fd://

systemctl daemon-reload

systemctl restart docker

docker-compose yml文件中指定ulimits参数:

参考如下:


以下是一个示例docker-compose.yml文件中指定nproc和nofile参数的配置:

version: '3'
services:
  web:
    build: .
    ulimits:
      nproc: 2048
      nofile:
        soft: 65535
        hard: 65535
    command: python app.py
    ports:
      - "5000:5000"

 

总结:对于系统参数优化方面,并不是值越大越好,需要根据实际情况调整,而不是盲目地去增加参数值。 

你可能感兴趣的:(linux系统运维,Java技术,虚拟化,java,docker,jvm)