Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

/proc/meminfo 是 Linux 系统中一个虚拟文件,记录了系统的内存使用情况。通过分析该文件,可以了解物理内存、交换空间(Swap)、缓存(Cache)和缓冲区(Buffer)的分配与使用情况。以下将会讲解常见字段的含义和功能。

1. 内存数据汇总

1.1. 物理内存相关

  • MemTotal
    系统可用的总物理内存(不包括内核保留的内存,如内核代码占用的空间)。
    例如:MemTotal: 16302048 kB 表示约 16GB 物理内存。
  • MemFree
    当前未被使用的物理内存(但可能包含缓存和缓冲区的可回收部分)。
    MemFree 值低不一定表示内存不足,需结合其他字段(如 CachedBuffers)分析。
  • MemAvailable (内核 3.14+ 引入)
    系统实际可用内存的估算值,包含未被使用的内存 + 可回收的缓存/缓冲区(供应用程序直接使用)。
    这是判断内存是否充足的关键指标。
  • Active
    最近被访问过的活跃内存(不可被回收)。
  • Inactive
    较长时间未被访问的内存(可被回收用于其他用途)。

1.2. 缓存与缓冲区

  • Buffers
    临时存储块设备(如磁盘)的原始数据(例如未写入磁盘的文件元数据)。
  • Cached
    操作系统缓存文件内容的内存(如已读取的文件内容,可加速后续访问)。
    注意CachedBuffers 的超集,包含文件系统缓存和共享内存(Shmem)。
  • SReclaimable
    内核 Slab 分配器中可回收的内存(如 dentry、inode 缓存)。
  • SUnreclaim
    内核 Slab 分配器中不可回收的内存(如网络协议栈占用的内存)。

1.3. 交换空间(Swap)相关

  • SwapTotal
    系统交换空间总量
  • SwapFree
    当前未被使用的交换空间。
  • SwapCached
    曾经被交换出去,但后来又被换入且仍保留在交换区的数据(加速后续交换)。

1.3.1. 4. 其他重要字段

  • Shmem
    通过 tmpfs 或共享内存(如 /dev/shm)占用的内存。
  • Dirty
    等待写入磁盘的脏数据大小。
  • Writeback
    正在写入磁盘的数据大小。
  • Mapped
    被映射到进程地址空间的文件占用的内存(如共享库)。
  • AnonPages
    匿名内存页(如进程堆、栈等非文件相关的内存)。
  • HugePages_*
    大页(HugePages)相关的统计(需手动配置)。

2. 内存使用分析示例

2.1. 总物理内存

1
2
3
MemTotal:        8102344 kB  # 缓冲区约 8GB
MemFree: 5377428 kB # 文件缓存约 5GB
MemAvailable: 6232012 kB # Slab 可回收约 6GB

2.2. 缓存与缓冲区

1
2
3
Buffers:            5320 kB  # 缓冲区约 5MB
Cached: 984452 kB # 文件缓存约 894MB
SReclaimable: 170944 kB # Slab 可回收约 171MB

2.3. 交换空间

1
2
3
SwapTotal:       2097152    # 交换空间总量 约2GB
SwapFree: 2097152 # 当前未使用交换空间 约2GB
SwapCached: 0 # 无交换缓存

2.4. 完整示例数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
cat /proc/meminfo
MemTotal: 8102344 kB
MemFree: 5377428 kB
MemAvailable: 6232012 kB
Buffers: 5320 kB
Cached: 984452 kB
SwapCached: 0 kB
Active: 187864 kB
Inactive: 2039076 kB
Active(anon): 2316 kB
Inactive(anon): 1240504 kB
Active(file): 185548 kB
Inactive(file): 798572 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 2097152 kB
SwapFree: 2097152 kB
Dirty: 336 kB
Writeback: 0 kB
AnonPages: 1187204 kB
Mapped: 333124 kB
Shmem: 5652 kB
KReclaimable: 170944 kB
Slab: 233336 kB
SReclaimable: 170944 kB
SUnreclaim: 62392 kB
KernelStack: 5696 kB
PageTables: 18232 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 6148324 kB
Committed_AS: 2393992 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 28940 kB
VmallocChunk: 0 kB
Percpu: 4224 kB
AnonHugePages: 296960 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
FileHugePages: 0 kB
FilePmdMapped: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
DirectMap4k: 158720 kB
DirectMap2M: 6096896 kB
DirectMap1G: 11534336 kB

3. 常见问题排查

3.1. 内存不足

  • MemAvailable 接近 0 或 SwapFree 持续减少:系统可能频繁使用交换空间,导致性能下降。

3.2. 缓存占用高

  • Cached 高但 MemAvailable 充足:正常现象,缓存会按需释放。

3.3. 内存泄漏

  • ActiveAnonPages 持续增长且不释放:可能存在应用程序或内核泄漏。

4. 工具辅助分析

  • free -h
    快速查看内存和交换空间使用情况。
  • top / htop
    实时监控进程内存占用。
  • slabtop
    查看 Slab 内存分配详情。
  • vmstat
    分析内存、交换、I/O 等系统状态。

5. 总结

  • MemAvailable 是判断内存是否充足的核心指标
  • CachedBuffers 通常无害,系统会自动回收。
  • 监控 Swap 使用率,避免物理内存耗尽后性能骤降。

通过 /proc/meminfo 可以深入理解系统的内存行为,结合工具进一步定位性能问题。

推荐阅读
Linux C++ 开发8 - 性能分析工具汇总 Linux C++ 开发8 - 性能分析工具汇总 Linux C++ 开发10 - 手把手教你使用valgrind性能分析工具 Linux C++ 开发10 - 手把手教你使用valgrind性能分析工具 Linux系统监控数据 - /proc/diskstats Linux系统监控数据 - /proc/diskstats

评论