这些proc接口主要在arm64 linux4.9版本操作系统下验证过.
伙伴系统相关proc接口
cat /proc/pagetypeinfo
slab分配器相关
/proc/slabinfo:查看内核中所有slab cache的相关数据信息
/ # cat /proc/slabinfo
slabinfo - version: 2.1
# name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> >
zswap_entry 0 0 360 22 2 : tunables 0 0 0 : slabdata 0 0 0
sw_flow_stats 0 0 448 18 2 : tunables 0 0 0 : slabdata 0 0 0
......
......
......
dma-kmalloc-64 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-32 0 0 336 24 2 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-16 0 0 320 25 2 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-8 0 0 312 26 2 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-192 0 0 496 16 2 : tunables 0 0 0 : slabdata 0 0 0
dma-kmalloc-96 0 0 400 20 2 : tunables 0 0 0 : slabdata 0 0 0
kmem_cache_node 213 216 448 18 2 : tunables 0 0 0 : slabdata 12 12 0
kmem_cache 216 224 576 28 4 : tunables 0 0 0 : slabdata 8 8 0
zone水线相关proc接口
/proc/sys/vm/min_free_kbytes:
查看或手动设置min_free_kbytes值,控制zone区域min水线值
/proc/sys/vm/watermark_scale_factor:
该值可以控制zone区域low和highg水线值,会根据zone实际内存比例来调节两个水线值,调节更加灵活
ZONE保留内存相关proc接口
/proc/sys/vm/lowmem_reserve_ratio:
显示每个节点低zone区域为高zone区域预留内存的比例值
cat /proc/zoneinfo:
能够查看各个zone为同节点高端zone预留的内存(protection:字段)
内存回收相关proc接口
/proc/zoneinfo:
可以通过"/proc/zoneinfo"查看这4种lru链表在node的各个zone上的分布
/proc/meminfo:
更丰富的信息则包含在"/proc/meminfo"中,比如"Dirty"表示修改后还没有write back的页面,"Writeback"表示正在执行I/O操作进行回写的页面,还有就
是系统所有"active"和"inactive"的page cache和anonymous page的统计数据
/proc/sys/vm/swappiness:
如果/proc/sys/vm/swappiness的值为0,那么内核在启动内存回收时,将完全忽略anonymous pages,这将带来一个好处,就是内核只需要扫描page cache
对应的inactive list(LRU_ACTIVE_FILE)就可以了,根本不用扫描anonymous pages对应的 inactive list(LRU_ACTIVE_ANON),这样能极大的节约内
存回收时花在扫描LRU链表上的时间。但是,swappiness设置为0只适用于系统中page cache比较多的场景,如果系统中anonymous pages比page cache多很
多,只回收page cache的话,可能无法满足direct relaim或者kswapd的需求。这时本来系统中还有很多anonymous pages可供回收以释放内存,由于
swappiness的限制,内核也许只有选择OOM killer了,所以用户在设置swappiness参数的时候,需要对自己的应用场景和内存的使用情况有比较深入的了解,
要不然你可能会困惑:明明available的内存还很多啊,为啥老有进程被OOM kill呢。
/proc/sys/vm/min_unmapped_ratio:
该proc参数表示每个内存节点中最小映射页占页总数的百分比。在zone_reclaim_mode模式下,只有当相关区域的内存使用达到这个百分比,才会发生区域内
存回收:
1.在zone_reclaim_mode设置为4的时候,内核会比较所有的file-backed和匿名映射页,包括swapcache占用的页以及tmpfs文件的总内存使用是否超过
这个百分比。
2.其他设置的情况下,只比较基于一般文件的未映射页,不考虑其他相关页。
比如在内存紧张时触发快速内存回收过程中会进行如下判断:
if (node_pagecache_reclaimable(pgdat) > pgdat->min_unmapped_pages) {
....//进行内存回收操作
}
pgdat->min_unmapped_pages为pgdat节点页总数乘上/proc/sys/vm/min_unmapped_ratio,若pgdat节点中可回收的page cache页总数大于pgdat->min_unmapped_pages时,才会对pgdat进行快速内存回收,否则跳过快速内存回收.
/proc/sys/vm/laptop_mode
该参数只会作用于直接内存回收流程
1. echo 0 > /proc/sys/vm/laptop_mode:允许直接内存回收对匿名页lru链表中的页进行回写操作,并且允许直接内存回收唤醒flush内核线程
2. echo N > /proc/sys/vm/laptop_mode(N未非0正整数):直接内存回收不允许对lru链表中匿名页进行回写操作
/proc/sys/vm/zone_reclaim_mode
该proc参数只作用于快速内存回收流程中。该参数用于控制当一个zone区域的内部内存耗尽时,是否能从本地节点内的zone进行快速内存回收操作。
zone_reclaim_mode是用来控制内存zone回收模式,在内存分配中,用来管理当一个内存区域内部的内存耗尽时,是从其内部进行内存回收来满足分配还是直接从其它内存区域中分配内存。如在快速内存回收流程中:
1. zone_reclaim_mode = 0 :关闭zone_reclaim模式,就是快速内存回收不能从zonelist中的本地zone进行内存回收操作,只能从其他zone或NUMA节
点回收内存.
2.zone_reclaim_mode = 1 :表示打开zone_reclaim模式,这样快速内存回收只会发生在本地节点内.
3.zone_reclaim_mode = 2 :在本地回收内存时,可以将cache中的脏数据写回硬盘,以回收内存
4.zone_reclaim_mode = 4 :在打开zone_reclaim模式的基础上,内存回收过程中允许用swap方式回收内存
对于NUMA环境,zone_reclaim_mode参数可能对应用和系统的的性能有较大的影响,默认情况下zone_reclaim模式是关闭。比如运行的应用是一个文件服务器或数据库服务器,进程对cache速度的依赖度要高于进程本身对内存速度的依赖,若打开zone_reclaim模式进程效率会极大降低。所以内核这时更愿意让进程从其他节点去申请使用内存,而不愿意清理本地的cache。所以当系统中大部分进程的内存需求远远大于对缓存的需求时,这种场景下系统应尽量地避免内存访问跨节点进行,因此需要打开zone_reclaim模式。此时当zone内存紧张时,快速内存回收会优先回收本地节点的zone区域,能有效避免进程跨节点访问。
若打开zone_reclaim模式,且允许cache中脏数据的回写操作。此时若某个zone内存不满足水线阈值,触发快速内存回收,那么脏数据回写会导致该节点上的很多进程的性能受到影响,降低节点进程性能。但是这样会增加节点间的隔离性,某个节点上进程的性能不会因为另外一个节点上进程内存回收导致性能下架。
手动释放内存缓存proc接口
当内存紧张时,linux os中用户可以利用/proc/sys/vm/drop_caches接口对系统缓存进行手动释放,drop_caches接受以下三种值.
#To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
#To free reclaimable slab objects (includes dentries and inodes):
echo 2 > /proc/sys/vm/drop_caches
#To free slab objects and pagecache:
echo 3 > /proc/sys/vm/drop_caches
注意:drop_caches接口是手动释放缓存,而不是回收缓存.释放较回收而言是比较轻量级的操作. 当内存紧张时,linux可以通过内存回收将一些脏页,正在回写的页或被用户pte映射的页做相关处理后,回收到伙伴系统.而drop_caches只能对那些干净的,不处在回写状态的和未映射用户pte的文件缓存页进行释放操作,而所谓释放操作也仅仅是将上述类型的文件缓存页从对应的文件缓存区中移除,并将页的引用计数设置为1.被drop_caches处理过的页能够立马被释放到伙伴系统中.(drop_caches内存释放整个处理过程比较轻量级,不涉及脏页回写,回写等待,迁移到伙伴系统等在内存回收流程中的复杂操作)
内存规整相关proc接口
echo 1 > /proc/sys/vm/compact_memory
&&
echo 1 > /sys/devices/system/node/nodexx/compact