一种Linux内存管理机制
- 格式:pdf
- 大小:1.03 MB
- 文档页数:6
第33卷 第12期 Vo1.33 NO.12 新乡学院学报 Journal of Xinxiang University 2016年12月
Dee.2016
一种Linux内存管理机制 谢文娣,冷先进,金建 (安徽新华学院电子通信工程学院,合肥230088) 摘要:以Linux内存管理研究为基础,阐述了内存管理模型、伙伴系统slab分配流程和内存回收策略,提出了通过修改 内存管理器和调整Linux水位线的方法,以避免OOM(out of memo ̄)事件的发生和内存耗尽问题的出现,并对内存变化过 程进行了分析。 关键词:内存管理;内存回收策略;水位线;OOM 中图分类号:TP316.85 文献标识码:A 文章编号:2095—7726(2016)12—0031—06
内存是Linux系统中重要的资源,在运行过程中, 系统内核和所有进程的运行都需要使用有限的物理内 存,因此内存的分配和释放策略制约着系统的运行效 率。高效的内存管理策略不仅要有效地管理系统内存, 减少内存频繁分配,避免出现内存耗尽的情况.而且要 尽量提高分配和回收的速度以提高系统的运行效率。 1 Linux内存管理模型 Linax系统的内存区域zone)分为ZONE—DMA、 ZONE NORMAL和ZONE—HIGHMEM三种,系统给每 种zone都分配有buddy system。在buddy system中.物 理内存空间是按2的整数次幂(称为order)放于 zone_ ̄ee_area中的。系统会按照需求先拆分物理内存 空间进行内存分配,再合并和释放内存,即在zone allocator里调用alloc_page()函数分配内存,调用 free_page()函数释放内存。虽然buddy system的效率 非常高。但它存在内部碎片问题,这是因为只有从2的 0次方到MAX—ORDER次方的页才会被分配出来,且 对于硬件cache(缓存)来说,这种使用方法也不方便。 在Linux内核中,固定分配的内存经常会被申请使用, 如果每次申请都必须通过buddy system就会浪费时间 和空间.而引人slab allocator(分配器)则可以节省时间 和空间。slab allocator模型图如图1所示。 slab allocator会把内存资源放到cache里按定值 进行缓存。如果系统需要使用内存,就可直接从此 cache里调取,不使用时就释放,而内存也会被重新放 回cache里。cache以slab为单位来划分区域,几个连 接的物理页常常包含在一个slab中。多个cache在 slab allocator中共同维护.而每个cache里可能包含同 一类型的object(对象)。系统通过调用kmalloc()函数 或kmem_cache_alloc()函数分配slab allocator中的内 存资源,调用kfree()函数或kmem_cache_free()函数释 放内存,如果在通过调用kmem_cache—alloc()函数分 配内存时object不在cache中,那么就通过调用 cache_grow()函数在cache中增加一个slab。
cache_grow()函数给object分配物理内存(cache_grow
()=>kmem_getpages()),而分配kmem_getpages还要通 过buddy system实现 (kmem_getpages ()=> alloc_pages_node()alloc_pages())。由此可见,slab
allocator的出现并不意味着buddy system完全消失.而 是对后者的一种增强。
图1 slab allocator模型 收稿51期:2016—06—01 基金项目:安徽高校自然科学研究项目(KJ2016A306) 作者简介:谢文娣(1987一),女,硕士,讲师,主要研究方向:嵌入式系统、计算机网络和移动通信。 ・32・ 新乡学院学报 2 Linux伙伴系统 2.1分配流程 (1)正常分配(或叫快速分配) 为提升性能,对分配的是单个页面的情况,系统会 在每个内存管理区中都定义一个“perCPU”页框高速 缓存。所有的“perCPU”高速缓存中都包含一些预先分 配的页框.这些页框可以用来满足本地CPU发出的单 个页内存请求。Linux内核为每个内存管理区和CPU 都提供了两种高速缓存:一种是热高速缓存,它存放的 页框中所包含的内容很可能在CPU硬件高速缓存中 也存在;另一种是冷高速缓存。如果perCPU缓存中不 存在页面,则可通过伙伴系统来提取页面进行增补。 对多个页面的分配,系统先分配指定类型的页面, 若指定类型没有足够的页面。就转而分配链表中备用 的类型,然后将类型链表保留下来。 (2)慢速(允许等待和页面回收)分配 慢速分配的一般流程是:唤醒内存页面回收线 程一尝试低水位分配一忽略水位分配一压缩内存分 配一直接回收内存分配一杀死线程分配(称为OOM killer)一压缩内存分配。 在Linux伙伴系统中.每个order都被分为五种不 同的类型,它们被统称为MIGRATE—TYPES,即迁移类
型。MIGRATE TYPES是反碎片的一种机制,其原理是 将伙伴系统的内存页分为可移动、不可移动和可回收 等几种类型。同一类型的页只能放在同一个区域,如不 可回收的页不能放在可移动类型区域。 MIGRATEUNMOVABLE是不可移动页,在内存 中有固定位置。不能移动,核心内核分配的大部分内存 属于此类。MIGRATE—RECLAIMABLE是可回收页,不 能移动,但可以删除,Kswapd内核线程在有交换页面 需要时对此区域进行操作,如内存欠缺,Kswapd会将 某些处于进程中的页面与swap空间交换。 MIGRATE—MOVABLE是可移动又可回收页,用户空间
程序使用此类,通过页表映射实现,若应用程序虚拟地 址空间有变化,只需变化页表即可。MIGRATE_RESERVE 是在系统剩余内存很少且要求又比较紧急时才用到的区 域。MIGRATE—ISOLATE在非一致内存访问NUMA (non—uniform memo ̄access)架构上使用,它是一种 特殊的虚拟区域.用于跨越NUMA节点移动物理内 存页.系统不能通过这个区域申请内存。 图2是从内存为2 GB的Linux系统中得到的 内存分配信息。在图2中,前面几行是每个迁移类 型可用内存的页数,最后一行是每个迁移类型的总 页数
图2 2 Gb内存分配图 2.2内存回收策略 (1)定期检查 系统的内存使用量是由kswapd进程定期检查的, kswapd进程在后台运行,当它检测到系统固定的阈值 大于空闲的物理页面数时,系统就会进行页面回收。 (2)内存不足 在某些情况下.操作系统会突然需要通过伙伴系 统为用户进程分配大量内存,或是需要新建一个较大 的缓冲区,而此时若没有满足要求的物理内存,操作系 统就需要尽快执行页面回收操作.释放出部分内存空 间。这种页面回收方式也被称作“直接页面回收”,它采 用页面回收算法(PFRA)。PFRA以获取页框并使它空 余为目的.它根据页框所包含的内容而使用不同的 处理方式。页框的内容分为不可回收页面、可交换页 面、可同步页面和可丢弃页面。许多种属于进程的用 户态、磁盘和高速缓存内存的页必须通过PFRA处 理,处理时都根据试探法的几条准则进行,处理流程 如图3所示。 谢文娣,冷先进,金建:一种Linux内存管理机制 ・33・ ShrinkA ̄age—
list 0
——’l可以回收的页面 :在交换缓存中、\ 塑匿名页 !,—/ 、、丫
霎 竺 ! 合 I否 <=== I否
< 磊
孺 髓页 炳的 是 是 数据回写
释放干净页面 图3 PFRA处理流程 系统在通过内存回收策略回收页面后也无法满足 内存的需求时,会做出OOM(out of memory)killer的 决策。这是一种内存耗尽时管理内存的处理机制:操作 系统会挑选正在运行中最恰当的一个进程,将其杀掉 并将它所占用的页面全部释放。 内存回收机制主要依赖于pages—min、pages_low 和pages_high三个字段。这三个字段在每个zone的描 述符中都有各自的定义:pages_min是区域预留的页面 数目,pages_lOW是控制进行页面回收的最小阈值, pages—high是控制进行页面回收的最大阈值。如果 pages—min大于空闲的物理页面数.那么系统运行会有 较大的压力,需要进行页面回收。如果pages_lOW高于 空闲的物理页面数,那么页面回收操作就会在系统内 核中开始进行。pages_high低于空闲的物理页面数则 是内存区域最理想的状态。 3问题与解决方案 3.1内存管理问题 系统在初始化时会根据内存的大小计算出一个回 收内存的阈值,用来控制系统的空闲内存。阈值越低. 内存回收开始的越晚,空闲内存越小。其计算规则是: min~free—kbytes=sqrt(1owmem—kbytes 16)=4 sqrt lowmem—kbytes) 其中lowmem—kbytes是指系统内存大小。这种规则计 算出来的阈值的范围为128 K~64 M。由于 rain—free—kbytes不是随着内存的增大而线性增大,因 此也无需按线性预留出过多的内存,只要能保证系统 的紧急使用量即可。 Linux为内存的使用设置了三种内存水位标记, watermark[high]、watermark[1ow]和watermark[rain]。它 们所标记的含义分别为:剩余内存在hi 以上,表示 内存剩余较多。目前内存使用压力不大;在high到高 于low的范围内,表示目前剩余内存使用存在一定压 力:在low到高于min的范围内,表示内存开始有使用 压力,剩余内存不多;min是最小的水位标记,当剩余 内存达到这个状态时,就说明使用面临很大压力。小于 min的这部分内存是内核保留给特定情况使用的,一 般不会分配。内存回收行为是基于剩余内存的水位标 记进行决策的:当系统剩余内存低于watermark[1ow] 的时候,内核的kswapd开始起作用,进行内存回收,直 到剩余内存达到watermark[high]的时候停止。如果内 存消耗导致剩余内存达到或超过watermark[min],就 会触发直接回收(direct reclaim)。 min—free—
kbytes的主要用途是计算影响内存回收
的三个参数watermark[minflow/high],等同于 page_min、page 1OW和page_high。 page_min=watermark[min]=min free——kbytes page_low=watermark[1ow]=watermark[min] 5/4 page—high=watermark[high]=watermark[min] 3/2 min_free—