内存碎片化二
你的 buddyinfo 输出显示了不同 NUMA 节点(Node 0 和 Node 1)以及不同内存区域(DMA、DMA32、Normal)的高阶内存分布情况。以下是详细分析:
1. 关键数据解读
| Zone | Order 0 (4K) | Order 1 (8K) | Order 2 (16K) | Order 3 (32K) | Order 4 (64K) | Order 5 (128K) | Order 6 (256K) | Order 7 (512K) | Order 8 (1M) | Order 9 (2M) | Order 10 (4M) |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Node 0, DMA | 1 | 1 | 1 | 0 | 2 | 1 | 1 | 0 | 1 | 1 | 3 |
| Node 0, DMA32 | 415 | 483 | 7488 | 1766 | 402 | 246 | 89 | 59 | 51 | 6 | 37 |
| Node 0, Normal | 37822 | 1617 | 35 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Node 1, Normal | 585650 | 243274 | 3998 | 24 | 5 | 0 | 0 | 0 | 0 | 0 | 0 |
2. 判断是否有内存碎片
✅ Node 1 (Normal)
-
order 0-2(4K - 16K):充足(585650、243274、3998) -
order 3-4(32K - 64K):有少量(24、5) -
order 5+(128K+):几乎没有大块连续内存
❌ Node 0 (Normal)
-
order 0(4K):有 37822 -
order 1-2(8K - 16K):少量(1617、35) -
order 3+(32K+):完全没有大块连续内存
⚠️ Node 0 (DMA32)
-
order 0-2(4K - 16K):充足 -
order 3-6(32K - 256K):有一定数量 -
order 7+(512K+):高阶页数量较少
⚠️ Node 0 (DMA)
-
order 0-10数量较少,但影响不大,因为 DMA 主要用于低地址设备内存。
3. 结论
(1)碎片化程度
| 指标 | 结果 |
|---|---|
| Node 0, Normal 高阶内存(order ≥ 3) | 完全为 0,严重碎片化 |
| Node 1, Normal 高阶内存(order ≥ 5) | 基本为 0,碎片化较严重 |
| Node 0, DMA32 高阶内存(order ≥ 7) | 数量较少,可能影响大页分配 |
📌 影响:
-
Node 0(Normal 区域)已经完全碎片化,任何 大于 16K(order 2) 的内存分配都会失败。
-
Node 1(Normal 区域)大于 128K(order 5)几乎无法分配,影响大块连续内存需求(如 HugePages、内核缓存)。
-
Node 0(DMA32)高阶页较少,可能影响设备驱动、DMA 内存分配。
4. 解决方案
✅ 方法 1:手动触发内存整理
echo 1 > /proc/sys/vm/compact_memory
📌 作用:尝试整理高阶页,减少碎片化,可能恢复部分 order 3+ 级别的高阶页。
✅ 方法 2:释放 Slab 和 PageCache
echo 3 > /proc/sys/vm/drop_caches
📌 作用:释放不必要的缓存,有助于回收部分内存,但不会真正解决高阶碎片问题。
✅ 方法 3:调整 HugePages 配置
如果系统依赖 HugePages(如数据库、虚拟机等),可以手动预留:
echo 512 > /proc/sys/vm/nr_hugepages
📌 作用:预留 512 个 2M 大页,防止碎片化影响 HugePages 分配。
✅ 方法 4:关闭 Transparent HugePages
echo never > /sys/kernel/mm/transparent_hugepage/enabled
📌 作用:避免动态 HugePages 机制进一步加剧碎片化。
5. 进一步检查
1️⃣ 查看 HugePages 分配情况
cat /proc/meminfo | grep -i huge
如果 HugePages_Free 过低,可能是碎片化导致无法分配大页。
2️⃣ 检查 OOM 及内存分配失败日志
dmesg | grep -i "order"
如果看到 page allocation failure: order:4, mode:0x104020,说明高阶内存分配失败。
6. 总结
✅ 你的系统有严重的高阶内存碎片
-
Node 0(Normal)几乎没有高阶页
-
Node 1(Normal)也几乎无法分配大块连续内存
-
影响:大内存分配失败,HugePages 可能受影响
-
建议执行
compact_memory并观察order 3+是否恢复
浙公网安备 33010602011771号