内存碎片化六
在 Linux 内核中,内存分配机制有多种,不同机制针对不同的内存需求和分配方式。下面是主要的内存分配机制及其如何查看它们的使用情况:
1. Buddy 系统(Buddy System)
用途:主要用于 物理内存页的分配和回收,并管理不连续的内存块。它通过合并和分裂内存页来避免碎片化。
如何查看:
-
查看 Buddy 系统分配情况:使用
/proc/buddyinfo
来查看 Buddy 系统内存页的分配情况,尤其是各个区域(DMA、DMA32、Normal)的内存分配。cat /proc/buddyinfo
输出示例:
Node 0, zone DMA 1 1 1 0 0 0 0 0 0 0 0 Node 0, zone DMA32 1032 512 257 128 60 30 15 7 3 1 0 Node 0, zone Normal 20480 10240 5120 2560 1280 640 320 160 80 40 20
关键字段解释:
-
区域(zone):DMA、DMA32、Normal 表示不同内存区域。
-
空闲页(free):显示每种大小的空闲页数。
-
最低、平均和最大页面数量:每个分配区的空闲页面数。
-
2. Slab 分配器
用途:用于内核对象(如进程控制块、网络数据包等)的内存分配。它通过内存缓存池(Slab Cache)来高效管理内存。
如何查看:
-
使用
slabtop
:查看 Slab 缓存的使用情况和各类对象分配的详细信息。slabtop
输出示例:
Active / Total Objects (% used) : 46450478 / 52429181 (88.6%) Active / Total Slabs (% used) : 1448140 / 1448140 (100.0%) Active / Total Caches (% used) : 85 / 116 (73.3%) Active / Total Size (% used) : 9415977.82K / 10397845.84K (90.6%)
关键字段:
-
Active / Total Slabs:显示 Slab 分配器的活动和总 Slab 数量。
-
Active / Total Objects:显示 Slab 中已分配和总共的对象数。
-
-
/proc/slabinfo
:显示每个 Slab Cache 的具体信息。cat /proc/slabinfo
输出示例:
kmalloc-64 10 1024 64 512 40 kmalloc-128 15 2048 128 1024 50
3. Slub 分配器(SLUB)
用途:SLUB 是一种优化的 Slab 分配器,广泛用于现代 Linux 系统。它的目标是提高 Slab 缓存的效率并减少内存碎片。
如何查看:
-
SLUB 的信息可以通过
slabtop
和/proc/slabinfo
查看,和 Slab 分配器类似。 -
另外,SLUB 分配器在 Linux 内核 2.6.23 及以后版本中默认启用,您可以查看
/proc/slabinfo
来查看 SLUB 的分配情况。
4. SLOB(Simple List of Blocks)
用途:一种简化的 Slab 分配器,适用于内存受限的嵌入式系统,通常用在小型内存设备中。
如何查看:
-
SLOB 与 Slab 和 SLUB 相似,使用
slabtop
或/proc/slabinfo
查看当前分配情况。 -
它通常被用作内存比较小的系统或嵌入式设备,您可以通过内核配置文件(如
make menuconfig
)启用或禁用 SLOB。
5. 页分配器(Page Allocator)
用途:页分配器是负责 页(通常为 4KB)分配 和回收的内存管理组件。它处理的内存范围从单个页到更大的内存块。
如何查看:
-
/proc/meminfo
:查看系统的内存状态,包括页分配的信息。cat /proc/meminfo
关键字段:
-
MemTotal:系统的总内存。
-
MemFree:当前空闲内存。
-
Buffers、Cached:当前缓存的内存。
-
-
查看页分配区域:可以查看
/proc/buddyinfo
来获取详细的页分配和空闲情况,特别是不同区域(DMA、Normal 等)的内存页状态。
6. 用户空间内存分配(用户空间内存分配器)
用途:虽然主要用于内核空间内存管理,但用户空间的内存分配器(如 malloc()
)在内核中也是重要的部分。它用于分配用于应用程序的内存。
如何查看:
-
malloc
和free
调用的内存分配情况:通常可以通过工具如valgrind
来分析用户空间的内存使用情况(虽然这主要是调试工具)。
总结:查看不同内存分配机制
内存分配机制 | 查看方式 | 关键工具或文件 |
---|---|---|
Buddy 系统 | /proc/buddyinfo |
查看物理内存页分配情况 |
Slab 分配器 | slabtop |
查看 Slab 缓存分配情况 |
SLUB 分配器 | slabtop |
查看 SLUB 内存分配情况 |
SLOB 分配器 | slabtop 或 /proc/slabinfo |
查看 SLAB 类型分配情况 |
页分配器 | /proc/meminfo 或 /proc/buddyinfo |
查看内存页分配情况 |
用户空间内存 | valgrind 等工具 |
分析用户空间内存分配 |
通过这些工具,你可以更好地理解和管理 Linux 内核中的内存分配机制,帮助定位内存使用的问题并优化系统性能。