Skip to content

Latest commit

 

History

History
24 lines (14 loc) · 1.94 KB

File metadata and controls

24 lines (14 loc) · 1.94 KB

容器内存

问题:容器为什么被杀了

容器在系统中被杀掉,其实只有一种情况,那就是容器中的进程使用了太多的内存。具体来说,就是容器里所有进程使用的内存量,超过了容器所在 Memory Cgroup 里的内存限制。这时 Linux 系统就会主动杀死容器中的一个进程,往往这会导致整个容器的退出。

CPU应该是可压缩资源,即便达到设置的资源限额也不会退出,而内存属于不可压缩资源,资源不足时就会发生OOM了。

swap打开了就不会OOMkill了。。但是性能会大幅下降

问题:容器内存使用量总是在临界点

每个容器的 Memory Cgroup 在统计每个控制组的内存使用时包含了两部分,RSS 和 Page Cache。

  • RSS 是每个进程实际占用的物理内存,它包括了进程的代码段内存,进程运行时需要的堆和栈的内存,这部分内存是进程运行所必须的。
  • Page Cache 是进程在运行中读写磁盘文件后,作为 Cache 而继续保留在内存中的,它的目的是为了提高磁盘文件的读写性能。

当节点的内存紧张或者 Memory Cgroup 控制组的内存达到上限的时候,Linux 会对内存做回收操作,这个时候 Page Cache 的内存页面会被释放,这样空出来的内存就可以分配给新的内存申请。

正是 Page Cache 内存的这种 Cache 的特性,对于那些有频繁磁盘访问容器,我们往往会看到它的内存使用率一直接近容器内存的限制值(memory.limit_in_bytes)。但是这时候,我们并不需要担心它内存的不够, 我们在判断一个容器的内存使用状况的时候,可以把 Page Cache 这部分内存使用量忽略,而更多的考虑容器中 RSS 的内存使用量。

问题:容器可以使用swap空间吗

kubelet缺省不能在打开swap的节点上运行。 配置“failSwapOn: false”参数,kubelet可以在swap enabled的节点上运行。