一、Memory Cgroup 对容器内存的限制

1. OOM Killer

OOM Killer 这个行为在 Linux 中很早就存在了,它其实是一种内存过载后的保护机制,通过牺牲个别的进程,来保证整个节点的内存不会被全部消耗掉。在 Cgroup 的概念出现后,Memory Cgroup 中每一个控制组可以对一组进程限制内存使
用量,一旦所有进程使用内存的总量达到限制值,在缺省情况下,就会触发 OOM Killer,控制组里的“某个进程”就会被杀死。
请注意,这里 Linux 系统肯定不能随心所欲地杀掉进程,杀掉“某个进程”的选择标准,涉及到内核函数 oom_badness()。具体的计算方法是 :
系统总的可用页面数乘以进程的 OOM 校准值 oom_score_adj,再加上进程已经使用的物理页面数,计算出来的值越大,那么这个进程被 OOM Kill 的几率也就越大。

2. Memory Cgroup最基本的三个参数

memory.limit_in_bytes 一个控制组里所有进程可使用内存的最大值
memory.oom_control 当控制组中的进程内存使用达到上限值时,这个参
数能够决定会不会触发 OOM Killer,默认会触发
memory.usage_in_bytes 它里面的数值是当前控制组里所有进程实际使用的内存总和,越接近参数1,越容易被kill

3. 解决方法

怎么确定是否发生了omm kill,通过journal -k 或者查看 /var/log/message 日志。
如果出现omm kill 使用以下方法解决。

  • 第一种情况这个进程本身的确需要很大的内存,这说明我们给 memory.limit_in_bytes里的内存上限值设置小了,那么就需要增大内存的上限值
  • 第二种情况是进程的代码中有 Bug,会导致内存泄漏,进程内存使用到达了 MemoryCgroup 中的上限。如果是这种情况,就需要我们具体去解决代码里的问题了。