
1. 快速
内存回收:处于get_page_from_freelist()函数中,在遍历zonelist过程中,对每个zone都在
分配前进行判断,如果分配后zone的空闲内存数量 <阀值 + 保留页框数量,那么此zone就会进行快速内存
回收。其中阀值可能是min/low/high的任何一种,因为在快速内存分配,慢速内存分配和oom分配过程中如果回收的页框足够,都会调用到get_page_from_freelist()函数,所以快速内存回收不仅仅发生在快速内存分配中,在慢速内存分配过程中也会发生。2. 直接内存回收:处于慢速分配过程中,直接内存回收只有一种情况下会使用,在慢速分配中无法从zonelist的所有zone中以min阀值分配页框,并且进行异步内存压缩后,还是无法分配到页框的时候,就对zonelist中的所有zone进行一次直接内存回收。注意,直接内存回收是针对zonelist中的所有zone的,它并不像快速内存回收和kswapd内存回收,只会对zonelist中空闲页框不达标的zone进行内存回收。在直接内存回收中,有可能唤醒flush内核线程。3. kswapd内存回收:发生在kswapd内核线程中,每个node有一个swapd内核线程,也就是kswapd内核线程中的内存回收,是只针对所在node的,并且只会对分配了order页框数量后空闲页框数量 <此zone的high阀值 + 保留页框数量的zone进行内存回收,并不会对此node的所有zone进行内存回收。Linux2.6以后,使用pdflush kernel thread替代了bdflush,pdflush两个主要功能:1.dirty pages写回磁盘,2.超过30S(/proc/sys/vm/dirty_writeback_centisecs)的pages写回磁盘,防止数据丢失
触动机制:
1.进程或者手工调用sync().
2.grow_buffers( )分配buffer page失败
3.free_more_memory() or try_to_free_pages() reclaim失败
4.mempool_alloc()分配失败
5.更多场景,当进程dirty pages达到阈值时,/proc/sys/vm/dirty_background_ratio(默认10%),调用 background_writeout()回收。
pdflush调用background_writeout(),指定刷新nr_pages。
过程中,当脏页在/proc/sys/vm/dirty_ratio(默认30%)以下时,停止刷新,如果脏页比例还在30%以上,往page_cache写将block。
刷新内存范围包括page cache dirty pages,super block dirty pages,device dirty pages等。
评论列表(0条)