"1-7.2 基于工作集冷内存回收方案1"
在Linux内核中,内存管理是一个至关重要的部分,特别是在处理大量数据和多线程应用时。本资源主要关注一种称为"基于工作集冷内存回收方案"的方法,由滴滴出行的内核团队提出,并由演讲者谢永梅进行讲解。这个方案旨在优化内存回收策略,特别是针对工作集(Working Set)的管理和Kswapd的工作流程。
工作集是操作系统用来跟踪进程最近使用的内存页的集合。它反映了进程当前活跃的部分,有助于避免频繁的页面交换,提高系统性能。在内存回收过程中,区分工作集中的热(活跃)和冷(不活跃)页面是关键步骤。
在描述中提到了Active LRU和Inactive LRU,这是Linux内核的两个列表,用于管理内存页面。Active LRU列表存放最近被访问过的页面,而Inactive LRU则包含不那么活跃的页面,可能被回收或转换到磁盘上。当内存不足时,内核会尝试从Inactive LRU中回收页面。
"Node0DMA32youngpage", "Node0Normalyoungpage", 和 "Node1Normalyoungpage" 提及了不同类型的内存节点和年轻页面。这些可能指的是不同的内存区域,如DMA内存(适用于低速设备)、正常的物理内存等,而“年轻”页面是指最近被访问或修改过的页面。
内存回收策略通常分为全局回收和组回收。全局回收涉及到整个系统的内存管理,而组回收则可能与控制组(Cgroup)有关,允许对不同进程或服务的内存使用进行限制。在Linux中,可以通过/proc接口(如`min_free_kbytes`、`watermark_scale_factor`和`watermark_boost_factor`)来调整内存水印,以影响回收策略。
Kswapd是一个后台进程,负责监控内存使用情况并触发页面回收。然而,当多个线程或进程快速消耗大量内存时,单线程的Kswapd可能无法及时提供足够的空闲内存。在这种情况下,直接的内存回收(Direct Reclaim)可能会更有效,因为它能更快地释放内存。例如,当创建新的富容器时,不仅应用程序本身,还有各种代理进程也会消耗内存。
为了提前触发Kswapd,有提议认为这会有所帮助,因为可以更早地进行内存整理。然而,自从提交号为59dc76b的改动以来,活动/非活动页面的比例已经改变,使得基于工作集的策略变得更加复杂。被逐出的页面可能由于工作集的考虑而直接被提升,而不是首先移到Inactive LRU。
这个方案探讨了如何通过改进工作集策略和Kswapd的行为来优化内存回收,以适应现代云环境(如Kubernetes,简称K8S)中多线程、多进程的动态需求,同时减少不必要的性能开销。