日志记录

问题起因

在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。