linux全局内存机制和cgroup内存机制

  • Post author:
  • Post category:linux




1 内存页的分类

linux进程使用的内存页面(page)的主要分类:

1)匿名页:来自堆、栈、数据段,需要换出到交换区 (swap-out)来回收(reclaim)。

2)共享内存:来自匿名 mmap 映射、shmem 共享内存,需要换出到交换区(swap-out)来回收(reclaim)。

3)文件页:来自代码段、文件映射,需要通过页面换出(page-out)来回收(reclaim),如果释放的是脏页则需要回写磁盘,因为必须让内存数据和磁盘数据保持一致。



2 cgroup级的内存直接回收(不存在后台回收)

Linux内核的原则是尽可能地使用内存(贪婪使用),直接内存回收这个工作主要发生在内存水位比较高的时候。

当容器自身的所有内存用量(包含 page cache)接近 cgroup limit 时,会触发 cgrou级别的直接内存回收(direct reclaim)来回收干净的文件页,这个内存回收过程发生在进程申请内存的上下文,此时线程不是在做自身业务而是在执行内核代码回收内存,因此会造成应用的卡顿。

此时,如果内存申请速率超出回收速率,Linux OOM Killer 将对cgroup中的所有进程进行大到小排序,杀死使用内存最多的进程来释放内存。



3 全局内存后台回收和直接回收

当整机内存资源紧张时,进程申请内存会有机会触发后台回收文件页和直接回收文件页。图片来自极客时间。

在这里插入图片描述

1)当空闲内存开始低于watermark low水位线(vm.min_free_kbytes)时,唤醒内核线程kswapd回收page cache,不会阻塞应用进程运行,支持对脏页的回收,kswapd线程会持续回收内存直到内存水位达到于watermark high。图片来自极客时间。

在这里插入图片描述

2)当空闲内存开始低于Min水位线时(Min < Low),会触发全局的直接内存回收,该过程发生在进程分配内存的上下文,且期间需要扫描更多页面、回写脏页,节点上所有任务都可能被干扰。图片来自极客时间。

在这里插入图片描述

3)当整机的内存分配速率超出回收速率时,则会触发整机的OOM,linux oom killer找出整机中内存使用量最大的进程进行强制杀死以释放内存。

4)全局的直接内存回收对系统性能有很大影响,例如在内存超卖场景中,资源消耗型任务会时常瞬间申请大量的内存,使得整机的空闲内存开始低于全局最低水位线(global wmark_min),引发整机上所有任务进入

直接内存回收的慢速路径

,进而导致延敏感型业务的性能抖动,这是一件不公平的事情,内存未超卖的进程(usage < request )被内存超卖的进程(usage > request )拖累了。



版权声明:本文为nangonghen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。