docker排查OOM
思路:
1.先从代码程序上排查,线程池创建是否使用ThreadPoolExecutor,线程池各项设置是否合理。
任务对象是否释放,网关是否需要限流。
2.服务器内存大小,cpu使用率,存储空间大小,java程序启动类设置的参数,如MEM_XMX,MEM_XMS,MEM_XMN,-server -Xmx512m -Xms512m -Xmn256m -Xss256k等是否合理。
1.内存不足 (OOM Killer)
最常见原因:当容器内存超过限制或宿主机内存不足时,Linux 的 OOM Killer 会强制终止进程。
检查方法:
docker stats # 查看容器资源使用情况
dmesg | grep -i kill # 查看系统日志是否有OOM记录
journalctl -k | grep -i oom
解决方案:
优化应用内存使用(如调整 JVM 堆大小,如果是 Java 应用)
增加宿主机内存或减少其他容器资源占用
2. CPU 资源限制
如果容器 CPU 使用率持续 100%,可能被调度器终止
检查:
docker stats
top
增加 CPU 份额:docker run --cpu-shares=512 ...
限制 CPU 核心数:docker run --cpus=1.5 ...
3. 存储空间不足
磁盘写满会导致各种异常
检查:
df -h
docker system df
4. 应用自身崩溃
查看应用日志:
docker logs -f <container_name>
检查是否有未捕获的异常
5. 健康检查失败
如果配置了健康检查且失败,Docker 会重启容器
检查:
docker inspect <container_name>
针对性建议
优先检查内存:
如果是 Java 应用:
确保设置了合理的 JVM 内存参数(如 -Xmx)
在docker-compose.yml中动态设置
6.内存不足
从 free -h 排查内存和Swap是否充足。
1. 启用 Swap 交换空间(必须做!)
# 创建 3GB Swap 文件(根据磁盘空间调整大小)
# 创建 3GB Swap 文件(根据磁盘空间调整大小)
sudo fallocate -l 3G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile# 永久生效(写入 /etc/fstab)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab# 验证
free -h # 应显示 Swap > 0
7. 终极方案
升级服务器配置,升级到 4GB 或更高内存。
docker 相关命令
Docker 教程 | 菜鸟教程