内存碎片化六

在 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:当前空闲内存。

    • BuffersCached:当前缓存的内存。

  • 查看页分配区域:可以查看 /proc/buddyinfo 来获取详细的页分配和空闲情况,特别是不同区域(DMA、Normal 等)的内存页状态。


6. 用户空间内存分配(用户空间内存分配器)

用途:虽然主要用于内核空间内存管理,但用户空间的内存分配器(如 malloc())在内核中也是重要的部分。它用于分配用于应用程序的内存。

如何查看

  • mallocfree 调用的内存分配情况:通常可以通过工具如 valgrind 来分析用户空间的内存使用情况(虽然这主要是调试工具)。


总结:查看不同内存分配机制

内存分配机制查看方式关键工具或文件
Buddy 系统 /proc/buddyinfo 查看物理内存页分配情况
Slab 分配器 slabtop 查看 Slab 缓存分配情况
SLUB 分配器 slabtop 查看 SLUB 内存分配情况
SLOB 分配器 slabtop/proc/slabinfo 查看 SLAB 类型分配情况
页分配器 /proc/meminfo/proc/buddyinfo 查看内存页分配情况
用户空间内存 valgrind 等工具 分析用户空间内存分配

通过这些工具,你可以更好地理解和管理 Linux 内核中的内存分配机制,帮助定位内存使用的问题并优化系统性能。

posted on 2025-03-31 19:47  吃草的青蛙  阅读(34)  评论(0)    收藏  举报

导航