Linux内存管理回收机制

Linux内存管理回收机制
1.Linux内存管理简介
    Linux将所管理的内存划分为内存节点(node)、内存分区(zone)和页框(page)。
1.1.内存节点(node)
    依据CPU访问代价的不同来划分。多CPU环境下,本地和远端内存属于不同节点。
1.2.内存分区(zone)
    在内存节点上,划分多个不同分区:DMA、Normal和HighMemory(可选)。

图1内存分区结构图 图1内存分区结构图

1.2.1.DMA分区
    直接内存访问分区,通常为物理内存起始的16M。主要供外设使用,外设直接访问内存数据,无需CPU参与。
1.2.2.Normal分区
    普通分区,范围一般从物理内存的16M后的全部内存区。若有HighMemory分区时,范围为16M到896M。
1.2.3.HighMemory分区
    高端内存区,范围为896M后的全部内存区。
1.3.页框(page)
    页框是内存分区的组成部分。页框有很多属性,主要描述页框的状态、用途等
    图1中普通分区中水绿色即为页框
1.3.1页框、页和页表
    页框:操作系统将物理内存划分成固定相同大小
    页:将进程内的虚拟地址划分成固定相同大小
    页表:记录页和页框的映射关系,由操作系统维护
2.Linux内存回收原理
2.1.交换分区(Swap)
    Swap是Linux下的虚拟内存分区。一般是以普通磁盘作为载体,与Windows下的交换文件类似。在物理内存不够时,系统会将物理内存中的数据临时保存到交换分区。
2.2.内存回收
    Linux使用物理内存的原则是尽量使用,例如系统中存在的文件缓存(Page Cache)就是为了加快读写速度,而缓存在内存中。
2.2.1.回收时机
    ①系统需要时刻预留一定额度的空闲内存,以满足新的内存申请操作。
    ②申请大于空闲内存的空间
    针对第①种,Linux系统设计了kswapd后台程序,在到达一定条件时,kswapd将内存中不活跃的数据交换到Swap分区中。
    针对第②种,Linux系统会触发直接内存回收(direct reclaim)
    回收的内存对象:
        ①文件缓存(Page cache) 
        ②匿名内存
            进程的堆、栈数据等

    针对文件缓存,若有脏数据时,将脏数据写入磁盘,然后释放相关内存。
    针对匿名内存,直接将其数据交换到Swap分区,并释放内存。
2.3.内存水位标记(watermark)
    内存水位标记是用来描述系统物理内存的空闲情况和使用压力,分为三种标记:high、low、min。
    用current代表当前空闲内存时:
    ⑴watermark[current] >= watermark[high] :空闲内存很充足
    ⑵watermark[high] > watermark[current] > watermark[low]:空闲内存比较充足,有一定压力
    ⑶watermark[low] > watermark[current] > watermark[min]:空闲内存不多,有较大压力
    ⑷watermark[min] > watermark[current]:空闲内存少,有很大压力

    当系统处于第⑶种情况时,kswapd进程开始进行内存回收,直到watermark[current] >= watermark[high]时停止回收。
    当系统处于第⑷种情况时,触发内存直接回收(direct reclaim)。

Linux内存管理回收机制_第1张图片 内存回收

2.4./proc/sys/vm/min_free_bytes
    系统必须预留的最小可用空闲内存大小
    在系统初始化时会根据内存大小计算一个默认值:
    min⁡_free_kbytes = sqrt(lowmem_kbytes * 16) = 4 * sqrt(lowmem_kbytes)
    (注:lowmem_kbytes即可认为是系统内存大小)
    从上面的公司可知min_free_kbytes随着内存的增大不是线性增长,防止内存浪费

    使用min_free_bytes计算内存水位标记:
        watermark[min]=min_free_pages
        watermark[low]=watermark[min] * 5/4
        watermark[high]=watermark[min]*3/2
    min_free_bytes与内存水位标记三个值成正比关系
2.5./proc/sys/vm/swappiness
    取值范围0到100,默认60
    ①值越大,内核更偏向使用Swap分区
    ②值越小,内核更偏向使用内存
    Swappiness也会影响kswapd进行内存回收时,更偏向于回收何种内存对象。值越小,更偏向回收文件缓存,否则更偏向回收匿名内存;当swappiness=100时,回收匿名内存和文件缓存优先级相同。
 

Linux内存管理回收机制_第2张图片 Swappiness


    可以这样理解上图:
    ①当swappiness减小时,由于系统更趋向使用内存,所以更趋向于回收占用内存比较大的文件缓存,这样能提高内存的使用率
    ②当swappiness增大时,由于系统更趋向于使用Swap分区,所以会减小回收文件缓存的比例,而增加释放匿名内存的比例;swappiness=100时,文件缓存和匿名内存回收比例相等
 

你可能感兴趣的:(Linux系统调优,Linux)