日志记录

问题起因

在 pve 的 lxc 容器内的 docker mc 高负荷时会突然关服,并且无任何输出,疑似系统杀进程。

事情经过

  1. 注意到 swap 用量异常,内存空闲的情况下常常会占满——因为以前看到文章有指出部分应用会通过 swap 实现一些功能,所以没在意。

  2. 因为 linux 发行版较多缘故,许多查看系统杀进程日志的命令无法正常生效,导致前几次查看始终没有发现被系统杀进程。

  3. debian 套 lxc 套 docker 导致我无法确认 kill 由哪个级别的内核实现,增加了维护难度。

解决过程

  1. 机缘巧合找到正确的查看指令。

  2. 在 docker lxc 和宿主机控制台分别执行。

  3. 在宿主机控制台发现 kill 日志。

  4. 明确为内存不足导致的杀进程。

  5. 原因是 MC 我限制了 12G,docker 限制 12.2G。但是 java 在部分情况下和系统自带的一些损失使用量超过设定值,导致在限制内无法继续分配内存,激活了杀死【占用最高内存进程】的函数,java 被杀。

解决办法

增大预留空间,MC 限制 12G,docker 最好 14G 左右。

反思

  1. 要找到正确的发行版指令。

  2. 杀进程由宿主机发起。

  3. 因为 docker 使用上层 lxc 内核,lxc 使用上层宿主机内核,所以杀进程因由宿主机发起。

  4. swap 的异常使用应该引起重视,在本次事件中是由于 docker 内部内存不足导致使用 swap。

  5. swap 不一定要宿主机不够才会使用,只要有一层限制导致内存不足,那一层就会尝试使用 swap。