生产k8s 应用容器内存溢出OOMKilled问题处理

**需求:**使用spring batch从上游edb接收数据压缩文件,再将文件解压后使用load将数据入库。解压后单个文件有800M左右。

**问题:**服务正常启动没有问题,且数据量少时也没有内存溢出问题。但是当数据量增大时存在内存溢出问题,服务会被强制重启。

**问题查看:**kubectl describe pod <podName> -n <namespaceName>

在reason中可以看到Pod 的状态为 Terminated,并且 Reason 字段为 OOMKilled。这表示该 Pod 是因为内存溢出(OOM,Out of Memory)被系统终止的。这种状态一般表示节点上的内存不足,无法满足 pod 的内存需求。(如果一个 pod 是因为超过了自己声明的使用限制(memory limit)而被杀死,那么它的 Reason 字段应该是 Evicted。)

解决方案:

1、增加节点内存限制;

资源管理

resources:

#最大使用

limits:

cpu: "8" # 1个cpu=1000m

memory: "16Gi"

2、增加jvm内存溢出时日志打印:

-XX:+HeapDumpOnOutOfMemoryError \

-XX:HeapDumpPath=/appabs/abslogs/dump_pid_%p_time_%t.hprof

3、修改程序逻辑:

不要批量一次将所有文件进行解压,防止磁盘空间不足、jvm直接内存不够问题。通过使用线程池一个线程解压完文件,再数据加载入库,最后删除数据文件,同时需要控制线程数不要太多,防止线程切换耗时且处理多个线程出现内存溢出问题。

相关推荐
会飞的大可12 小时前
Docker容器项目无法访问MySQL的解决策略
mysql·docker·容器
cool320012 小时前
二进制基于kubeasz部署 K8s 1.34.x 高可用集群实战指南-第一章节基础环境准备(1-4)
云原生·容器·kubernetes
涛声依旧3931613 小时前
构建部署kubernetes所需主机
linux·运维·云原生·容器·kubernetes
槐序深巷里打雨伞的人14 小时前
k8s中部署prometheus并监控k8s集群以及nginx案例
nginx·kubernetes·prometheus
eRTE XFUN14 小时前
Redis 设置密码(配置文件、docker容器、命令行3种场景)
数据库·redis·docker
万象.15 小时前
Docker网络原理
网络·docker·容器
春日见15 小时前
从底层思维3分钟彻底弄清卷积神经网络CNN
人工智能·深度学习·神经网络·计算机视觉·docker·cnn·计算机外设
wudl556615 小时前
MySQL 8.0.42 Docker 开发部署手册
数据库·mysql·docker
IT一氪15 小时前
K8s Admin:一个轻量级的多集群 Kubernetes 管理平台
云原生·容器·kubernetes
大新新大浩浩16 小时前
Deerflow部署-X86架构-在ubuntu2204操作系统上使用docker模式部署
docker·容器·架构