buffer/cach内存占用过高及k8s java后端pod容器超出内存限制被kill重启

当Docker pod因内存不足频繁重启时,通过分析日志和系统服务发现是journal日志服务占用大量缓存。使用`journalctl`命令清理过期日志释放了近4GB内存。此外,调整JVM参数,限制最大堆大小以避免容器内存限制冲突。监控和优化内存使用,确保服务稳定。

现象

之前某个后端服务pod一直在不停的重启导致线上环境很不稳定,于是开始分析问题的原因

分析pod日志和服务器日志

  1. 执行kubectl describe po <pod名> -n <命名空间> 查看pod所在Node的ip和Events 有时候通过Events 可以直接找到问题原因
  2. 执行kubectl logs --tail 100 <pod名> -n <命名空间> 查看服务最后一百行日志或者用logs -p选项查看前一个 pod 的日志,分析是否是服务原因导致pod重启
  3. 若仍然没找到原因可以去分析下pod所在节点的系统服务日志例如/var/log/messages
    搜索和重启时间相近的日志发现内存不足导致pod被kill, 报错信息如下:
    	Nov 11 17:30:43 host kernel: Memory cgroup out of memory: Kill process 31719 (grpc-default-ex) score 0 or sacrifice child
    	Nov 11 17:30:43 host kernel: Killed process 24288 (java) total-vm:3747220kB, anon-rss:450448kB, file-rss:15868kB, shmem-rss:0kB
    	Nov 11 17:30:43 host dockerd: time="2021-11-11T17:30:43.533974651+08:00" level=info msg="ignoring event" container=55ca2298ca9379b8bfcb4d977f9aeeb2eaa155f0126009bdab2747f8b1b5a77c module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
    	Nov 11 17:30:43 host containerd: time="2021-11-11T17:30:43.535142442+08:00" level=info msg="shim disconnected" id=55ca2298ca9379b8bfcb4d977f9aeeb2eaa155f0126009bdab2747f8b1b5a77c
    	Nov 11 17:30:43 host containerd: time="2021-11-11T17:30:43.535214178+08:00" level=error msg="copy shim log" error="read /proc/self/fd/75: file already closed"
    	Nov 11 17:30:43 host dockerd: time="2021-11-11T17:30:43.619404307+08:00" level=info msg="ignoring event" container=84129b38c689b77781da0ac9f44811747d5cac1420565ee2848f96f08cc50634 module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
    	Nov 11 17:30:43 host containerd: time="2021-11-11T17:30:43.620511825+08:00" level=info msg="shim disconnected" id=84129b38c689b77781da0ac9f44811747d5cac1420565ee2848f96f08cc50634
    	Nov 11 17:30:43 host containerd: time="2021-11-11T17:30:43.620570486+08:00" level=error msg="copy shim log" error="read /proc/self/fd/79: file already closed"
    

获取更多进程被kill 的相关信息可以用下面的命令

dmesg | egrep -i -B100 'killed process'
# 或:
egrep -i 'killed process' /var/log/messages
egrep -i -r 'killed process' /var/log
## 或:
journalctl -xb | egrep -i 'killed process'

分析并释放系统内存

执行 free -h 查看系统内存发现buff/cache占用特别高,如下:

[root@host ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            15G        3.4G        618M        3.0M         11G         10G
Swap:            0B          0B          0B
[root@host ~]#

使用hcache查看buff/cache占用情况

执行下面的命令

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值