一般容器被杀死都是因为内存不足造成OOM,导致被OOM killer杀死来回收内存空间。

OOM kill选择进程的逻辑为:系统可用页数 x 进程的oom_score_adj(/proc/<pid>/oom_score_adj文件中的值) + 进程已用的物理页面数。值越大,那么进程被杀死的概率越大。

如果是OOM killer杀死的容器,那么使用docker inspect命令查看容器信息的使用可以看到两个关键信息,那就是容器的Status为exited,OOMKilled为true

使用journalctl -k命令或者直接查看日志文件/var/log/message可以看到OOM kill的日志信息。这里可以看到进程使用的物理内存信息,发生了OOM的memory cgroup,以及杀死的进程等等信息。

通过上面的方式我们可以知道容器是否被OOM kill,以及OOM kill时的进程信息。

知道了OOM发生的信息,我们可以对容器进行调节来避免这一点,比如调大可用的内存上限等等。这里需要说明几个参数:

  • memory.limit_in_bytes:容器可用的内存上限
  • memory.usage_in_bytes:容器已用内存,注意在容器内存监控指标提到的,并不是这个值接近1了之后就一定会无法分配内存报OOM错误。
  • memory.oom_control:用于控制容器使用启用OOM,如果仅用了OOM的话,那么申请操作内存不足时,不会报OOM,而是会阻塞等待。

结论:容器被杀死之后,可以排查是否时OOM kill掉的,然后可以尝试调节内存配置信息。