Linux 内存碎片化检视之 buddy_info | extfrag_index | unusable_index

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 页面分配不会成功了

猜你喜欢

转载自blog.csdn.net/memory01/article/details/80958009