故障现象:
使用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内设置的值很大
至此,终于找到问题根源所在。
解决方法:
全局解决方法:修改系统配置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"
总结:对于系统参数优化方面,并不是值越大越好,需要根据实际情况调整,而不是盲目地去增加参数值。