page_alloc migratetype_names

📅 发布时间:2026/10/6 2:50:32
page_alloc migratetype_names
定义了几个与迁移类型、内存水位、内存规整defrag、NUMA 节点相关的全局变量。逐块拆解。一、migratetype_names[]—— 迁移类型名称表const char * const migratetype_names[MIGRATE_TYPES] { Unmovable, Movable, Reclaimable, HighAtomic, #ifdef CONFIG_CMA CMA, #endif #ifdef CONFIG_MEMORY_ISOLATION Isolate, #endif };作用和zone_names[]类似这是迁移类型索引到可读名称的映射表用于打印、/proc/pagetypeinfo等。类型const char * const [...]指向const char的常量指针数组指针本身和字符串内容都不可修改比zone_names[]的char * const更严格zone_names指向的字符串也是字面量但类型上没标const char。各项含义索引名字含义MIGRATE_UNMOVABLEUnmovable不可移动页内核数据结构、页表等最容易造成碎片MIGRATE_MOVABLEMovable可移动页用户态匿名页、文件页缓存可规整迁移MIGRATE_RECLAIMABLEReclaimable可回收页如 slab 缓存可被回收而非迁移MIGRATE_HIGHATOMICHighAtomic高优先级原子分配保留区供GFP_ATOMIC等紧急分配MIGRATE_CMACMA连续内存分配器Contiguous Memory Allocator区域条件编译MIGRATE_ISOLATEIsolate被隔离的页块用于内存热插拔/规整条件编译反碎片的核心思想内核把空闲页按迁移类型分到不同链表分配时尽量同类型分配避免可移动页混进不可移动页块这样可移动页块保持连续、可整块迁移/回收减少碎片。当某类型不够时__rmqueue_fallback()才去偷其他类型的页块可能破坏反碎片所以尽量少用。与sysctl_lowmem_reserve_ratio的对比数组索引维度用途zone_names[]zone打印 zone 名sysctl_lowmem_reserve_ratio[]zone低端保留比例migratetype_names[]迁移类型打印迁移类型名三者都是按枚举索引的配置/名字表。二、内存水位与 min_free_kbytesint min_free_kbytes 1024; int user_min_free_kbytes -1; static int watermark_boost_factor __read_mostly 15000; static int watermark_scale_factor 10;这几个变量控制zone 水位watermark的计算即保留多少空闲内存。1.min_free_kbytes 1024全局最小值系统至少要保留1024 KB1 MB空闲内存。是WMARK_MIN的基础每个 zone 的WMARK_MIN按 zone 大小比例分配min_free_kbytes再基于WMARK_MIN计算WMARK_LOW、WMARK_HIGH。用户可通过/proc/sys/vm/min_free_kbytes调整。2.user_min_free_kbytes -1用户显式设置的值初始-1表示用户未设置。用于区分内核根据内存大小自动计算的min_free_kbytes用户通过 sysctl手动设定的值。若用户设过重启/热插拔时不应被自动计算覆盖所以单独存一份用户意图。3.watermark_boost_factor 15000__read_mostly水位提升因子默认 15000即150%因为单位是百分比 ×100。用于在内存碎片化严重/规整失败时临时抬高水位让回收更积极给规整留出空间。相关机制boost_watermark()在should_compact_retry()等路径触发。/proc/sys/vm/watermark_boost_factor可调。4.watermark_scale_factor 10默认水位间距因子默认 10即0.1%。决定WMARK_LOW与WMARK_MIN、WMARK_HIGH与WMARK_LOW之间的间距间距 ≈ zone_managed_pages * watermark_scale_factor / 10000间距越大kswapd 越早被唤醒、回收越积极但空闲内存保留也越多。/proc/sys/vm/watermark_scale_factor可调。水位三档回顾free pages ^ | WMARK_HIGH ── 高于此kswapd 停止回收 | WMARK_LOW ── 低于此kswapd 开始回收 | WMARK_MIN ── 低于此直接回收/规整甚至 OOM --------------------------------min_free_kbytes决定WMARK_MIN的基准watermark_scale_factor决定三档之间的间距watermark_boost_factor在需要时临时抬高水位。三、defrag_modeint defrag_mode;控制内存规整compaction行为模式的开关。相关 sysctl/proc/sys/vm/compaction_proactiveness等不同版本语义有差异。用于决定是否启用主动规整、规整的积极程度等。默认 0表示默认行为。不同内核版本defrag_mode的具体含义略有不同但都属于内存规整策略的全局配置。四、movable_zone—— ZONE_MOVABLE 的来源 zone/* movable_zone is the real zone pages in ZONE_MOVABLE are taken from */ int movable_zone; EXPORT_SYMBOL(movable_zone);含义ZONE_MOVABLE是一个虚拟 zone它的页不是独立物理内存而是从某个真实 zone里划出来的。movable_zone记录这个真实 zone 的索引通常是ZONE_NORMAL或ZONE_HIGHMEM。注释说得很清楚real zone pages in ZONE_MOVABLE are taken from。为什么需要它ZONE_MOVABLE用于内存热插拔可移动页能整块迁移走方便下线内存减少碎片可移动页集中管理便于规整hugetlb 大页需要连续内存放 MOVABLE 更易满足。但它的物理页来自真实 zone所以分配/统计时需要知道来源 zone。例如迁移类型 fallback、水位计算、页归属判断都要用到movable_zone。设置时机内核启动参数kernelcore/movablecore指定 MOVABLE 大小初始化时据此从某个真实 zone 划出 MOVABLE并记录movable_zone。EXPORT_SYMBOL导出给模块如 CMA、hugetlb 相关模块可能需要知道来源 zone。五、NUMA 节点数量变量MAX_NUMNODES 1#if MAX_NUMNODES 1 unsigned int nr_node_ids __read_mostly MAX_NUMNODES; unsigned int nr_online_nodes __read_mostly 1; EXPORT_SYMBOL(nr_node_ids); EXPORT_SYMBOL(nr_online_nodes); #endif条件编译MAX_NUMNODES 1只在可能多节点NUMA 或CONFIG_NODES_SHIFT 0时才定义。单节点MAX_NUMNODES 1时不需要编译期就确定只有一个节点。1.nr_node_idsunsigned int nr_node_ids __read_mostly MAX_NUMNODES;实际存在的节点 ID 数量上限稀疏节点编号下的最大 ID 1。初始为MAX_NUMNODES最宽松启动时根据固件探测收紧。用途分配node_data[]、node_states等数组时确定大小遍历节点时作为边界允许节点 ID 稀疏比如只有 node 0 和 node 3此时nr_node_ids 4但nr_online_nodes 2。2.nr_online_nodesunsigned int nr_online_nodes __read_mostly 1;在线节点数量实际有内存/CPU 且已上线的节点个数。初始 1至少 node 0启动时随节点上线增加。用途判断是否真的多节点nr_online_nodes 1决定是否启用 NUMA 相关优化如 per-node 分配、NUMA balancing统计信息展示。两者区别变量含义例子node 0,3 在线nr_node_ids最大节点 ID 1数组维度4nr_online_nodes实际在线节点数2__read_mostlyEXPORT_SYMBOL启动时确定、运行期几乎只读放 read-mostly 段。导出给模块使用。六、小结表变量类型/默认作用migratetype_names[]const char * const []迁移类型名称表min_free_kbytesint/ 1024系统保留的最小空闲内存KBuser_min_free_kbytesint/ -1用户显式设置值-1 表示未设watermark_boost_factorint/ 15000临时抬高水位的因子watermark_scale_factorint/ 10水位间距因子defrag_modeint/ 0内存规整模式movable_zoneint/ 未初始化ZONE_MOVABLE 页的真实来源 zonenr_node_idsunsigned int/ MAX_NUMNODES最大节点 ID 1nr_online_nodesunsigned int/ 1在线节点数一句话总结这段定义了迁移类型名称表migratetype_names[]以及一组控制内存水位与规整的全局参数min_free_kbytes、user_min_free_kbytes、watermark_boost_factor、watermark_scale_factor、defrag_mode、记录ZONE_MOVABLE来源真实 zone 的movable_zone以及多节点下的nr_node_ids最大节点 ID1和nr_online_nodes在线节点数——它们共同构成 zone/迁移类型/水位/NUMA 的基础配置多数在启动时确定、运行期只读。