1. buddy_info
buddy info 描述了当前可用内存的分布情况
# cat /proc/buddyinfo
Node 0, zone DMA 4 4 3 3 3 3 2 0 1 1 2
Node 0, zone Normal 140 90 34 5201 2816 556 29 0 0 0 0
Node 0, zone HighMem 0 2542 1859 253 961 3568 560 19 1 0 0
可以看到这份信息里面包含3个zone, DMA, Normal, HighMem, 高通平台没有去这样分,默认DMA zone就代表所有内存空间
DMA 行第3列表示有4个 2^2 × page_size 的内存块可以用
HighMem的第4列表示253个 2^3 × page_size 的内存块可以用
以此类推,越是往后的空间,就越是连续,数目越多,就代表这个大小的连续空间越多,当大的连续空间很少的时候,也就说明,内存碎片已经非常多了。
全部加起来就是当前free状态的内存size
2. extfrag_index
extfrag_index 表示的是内存分配失败是由于内存不足还是碎片化引起。
和extfrag_index 直接关联的是一个叫 extfrag_threshold 的阈值, 这个参数的取值范围是0-1000,在内存不足时候,系统会讲当前的碎片指数(fragmentation index)和extfrag_threshold比较,
fragmentation index:
-1000 表示分配可以成功
0 就表示分配失败和内存不足关联更大
1000 表示分配失败主要和碎片化有关,数值越接近1000
如果大于extfrag_threshold, kswapd就会触发memory compaction . 所以, 这个值设置接近1000, 说明系统在内存碎片的处理倾向于把旧的页换出, 以符合申请的需要; 而设置接近0, 表示系统在内存碎片的处理倾向于做memory compaction.
下面是extfrag_index的例子,extfrag_index的是除以1000以后的值
extfrag_threshold 是 500,一般默认都是500
0-3列分配会成功
4-10列分配会失败因为external fragmentation的缘故,就会触发做memory compaction
$ adb shell cat /proc/sys/vm/extfrag_threshold
500
------ BUDDYINFO (/proc/buddyinfo) ------
Node 0, zone DMA 1329 7078 1782 84 0 0 0 0 0 0 0
------ FRAGMENTATION INDEX (/sys/kernel/debug/extfrag/extfrag_index) ------
Node 0, zone DMA -1.000 -1.000 -1.000 -1.000 0.859 0.930 0.965 0.983 0.992 0.996 0.998
3. unusable_index
unusable_index展示了某类大小的内存(order)有多少free内存是没有使用的。它表示对某order分配内存的时候,由于碎片化原因接近失败的程度
------ BUDDYINFO (/proc/buddyinfo) ------
Node 0, zone DMA 1329 7078 1782 84 0 0 0 0 0 0 0
------ FRAGMENTATION INDEX (/sys/kernel/debug/extfrag/extfrag_index) ------
Node 0, zone DMA -1.000 -1.000 -1.000 -1.000 0.859 0.930 0.965 0.983 0.992 0.996 0.998
------ UNUSABLE INDEX (/sys/kernel/debug/extfrag/unusable_index) ------
Node 0, zone DMA 0.000 0.057 0.665 0.971 1.000 1.000 1.000 1.000 1.000 1.000 1.000
order-0 页面分配可以使用其所有的free内存,不太会因为内存碎片化的原因导致失败
order-3 页面分配可以成功,但很可能因为碎片化原因导致失败
order-4 - 10 页面分配不会成功了