避免物理内存碎片化 - ZONE_MOVABLE

在2.6.20-rc6中,mel Gorman提交了的patch引入了ZONE_MOVABLE,引入这个pseudo zone的目的是为了防止zone内存碎片化

ZONE_MOVABLE表示这个zone仅能被带有__GFP_HIGHMEM和__GFP_MOVABLE标志的分配使用。这就使得所有non-movable页面都限制在单一的内存区,而movable的分配则由其他的内存区满足。这个patch可以和基于链表的防碎片patch一起使用。

Movable zone的大小由内核参数"kernelcore="指定。这个参数指定了多少内存分配给ZONE_MOVALBE。在ZONE_MOVABLE zone内的页面都可以做页面迁移或者页面回收。

当我们选择一个zone的页面用于ZONE_MOVABLE时,需要考虑两点:

首先,仅仅位于最高内存zone的内存可用于ZONE_MOVABLE。对于x86 arm平台,是ZONE_HIGHMEM;对于ppc64则是ZONE_DMA;对于x86_64则是ZONE_DMA32.

其次,内核使用的内存可能平坦的分布在多个NUMA节点。如果这些节点的尺寸不相同,就会导致内核在不同节点上使用的内存数量不同。

缺省情况下,这个zone不会被用作huge pages分配,因为huge pages分配是固定的和non-migratable。提供了一个sysctl hugepages_treat_as_movable允许在ZONE_MOVABLE上执行huge pages分配。这就意味着当系统执行了这个系统调用后,huge page pool的尺寸包含了ZONE_MOVABLE的尺寸。

除了hugh pages可以是non-ovable,作者不再引入其他可能会导致ZONE_MOVABLE外碎片的分配。




你可能感兴趣的:(linux,kernel,memory)