目录
内存碎片分为内部碎片和外部碎片,内部碎片指内存页里面的碎片,外部碎片指空闲的内存页分散,很难找到一组物理地址连续的空间内存页,无法满足超过一页的内存分配请求。
可移动区域(ZONE_MOVABLE)是一个伪内存区域,基本思想很简:把物理内存分为两个区域,一个区域用于分配不可移动的页,另一个区域用于分配可移动的页,防止不可移动的页向可移动的页区域引入碎片。
区域大小设置:
在NUMA系统上,宏CONFIG_MOVABLE_NODE,并指定内核引导参数movable_node,那么忽略内核引导参数kernelcore和movablecore,所有可以热插拔的物理内存都可作为移动区域。
可移动区域 没有包含任何物理内存,是虚拟的内存区域。可移动区域借用最高内存区域的内存,32位系统通常是高端内存区域(ZONE_HIGHMEM),64位系统最高内存区域通常是(ZONE_NORMAL)。
从内存区域的底部扫描已分配的可移动页,从内存区域的顶部扫描空闲页,把底部的可移动页移动到顶部空闲页,在底部形成连续的空闲页。

假如有16个页,白色表示空闲页。这个内存区域已经碎片化,最大的连续页是两页。从这个区域内存分配3页就会失败,甚至分配两页也会失败,因为连续的空闲页的起始地址没有对齐到两页的整数倍。
内存碎片整理线程名“kcompactd
如果迁移扫描器和空闲扫描器相遇,那么内存碎片整理结束。
如果迁移扫描器和空闲扫描器没有相遇,但是申请或备用的迁移类型至少有一个足够大的空闲页块,那么内存碎片整理结束。
1)编译内核时
如果需要内存碎片整理功能,需要配置CONFIG_COMPACTION
2)命令行下
- //设置外部碎片的阈值
- root@ubuntu:/home/wy/misc/net# cat /proc/sys/vm/extfrag_threshold
- 500
- //是否允许内部碎片整理移动不可回收的页,1 允许
- root@ubuntu:/home/wy/misc/net# cat /proc/sys/vm/compact_unevictable_allowed
- 1
- //写入任何值触发内存碎片整理
- root@ubuntu:/home/wy/misc/net# cat /proc/sys/vm/compact_memory
- cat: /proc/sys/vm/compact_memory: Permission denied
-
参考链接
https://course.0voice.com/v1/course/intro?courseId=2&agentId=0