记录一次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 协议,完整转载请注明来自 砂纸の小屋
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果