记录一次docker环境下的内存溢出杀进程
日志记录
问题起因
在pve的lxc容器内的docker mc高负荷时会突然关服,并且无任何输出,疑似系统杀进程。
事情经过
-
注意到swap用量异常,内存空闲的情况下常常会占满——因为以前看到文章有指出部分应用会通过swap实现一些功能,所以没在意。
-
因为linux发行版较多缘故,许多查看系统杀进程日志的命令无法正常生效,导致前几次查看始终没有发现被系统杀进程。
-
debian套lxc套docker导致我无法确认kill由哪个级别的内核实现,增加了维护难度。
解决过程
-
机缘巧合找到正确的查看指令。
-
在docker lxc 和宿主机控制台分别执行。
-
在宿主机控制台发现kill日志。
-
明确为内存不足导致的杀进程。
-
原因是MC我限制了12G,docker限制12.2G。但是java在部分情况下和系统自带的一些损失使用量超过设定值,导致在限制内无法继续分配内存,激活了杀死【占用最高内存进程】的函数,java被杀。
解决办法
增大预留空间,MC限制12G,docker最好14G左右。
反思
-
要找到正确的发行版指令。
-
杀进程由宿主机发起。
-
因为docker使用上层lxc内核,lxc使用上层宿主机内核,所以杀进程因由宿主机发起。
-
swap的异常使用应该引起重视,在本次事件中是由于docker内部内存不足导致使用swap。
-
swap不一定要宿主机不够才会使用,只要有一层限制导致内存不足,那一层就会尝试使用swap。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 砂纸の小屋
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果