/proc/meminfo 文件详解

详解 Linux /proc/meminfo 常见字段含义,包括 MemTotal、MemFree、MemAvailable、Cached、Slab、CommitLimit、HugePages 等内存监控指标,帮助理解 Linux 内存使用与排障。

作者 快猫运营团队

Linux 系统监控里,很多基础信息都来自 /proc 目录。CPU 信息、内存信息、磁盘情况、IO 情况、网卡流量,都可以在 /proc 下找到对应入口。其中,内存信息主要来自 /proc/meminfo

/proc/meminfo 字段很多,新手常见困惑是:哪些字段表示真实可用内存,哪些字段是缓存,哪些字段和 Swap、Slab、HugePages 有关。本文按监控和排障视角整理这些字段的中文含义。

核心要点摘要

  • /proc/meminfo 是 Linux 内存监控的重要数据来源,字段单位大多是 kB。
  • 判断系统是否还有可用内存时,MemAvailable 通常比 MemFree 更接近真实情况。
  • CachedBuffersSlab 等字段不等于“内存泄漏”,其中一部分可能会被系统回收。
  • Swap、Dirty、Writeback、CommitLimit、Committed_AS 等字段适合排查换页、写回和内存承诺问题。
  • HugePages、DirectMap 等字段更偏向内核、虚拟内存和大页场景,普通业务排障不一定每天都会用到。

/proc/meminfo 是什么

/proc/meminfo 是 Linux 内核暴露的内存状态文件。监控系统读取它,可以得到系统总内存、空闲内存、缓存、Swap、Slab、HugePages 等信息。

对监控系统来说,这些字段不是孤立的。比如只看 MemFree,很容易误以为机器内存不足;结合 MemAvailableCachedBuffersSReclaimable 等字段,才能更合理地判断系统还能承载多少新进程或新请求。

常用内存字段

  1. MemTotal:系统总内存的大小(单位:kB)。
  2. MemFree:当前可用的空闲内存大小(单位:kB)。
  3. MemAvailable:估算的可以被新启动应用程序使用的内存量(单位:kB),比 MemFree 更能反映实际可用内存。
  4. Buffers:用作缓存页缓冲区的内存大小(单位:kB)。
  5. Cached:用作页缓存的内存大小(单位:kB),用于存放已打开文件的数据。
  6. SwapCached:已经被交换出去但仍然在交换缓存中的内存大小(单位:kB),如果需要,可以较快换回内存。

这几个字段是日常看 Linux 内存时最常用的一组。简单说,MemTotal 看总量,MemAvailable 看可用量,CachedBuffers 看文件系统相关缓存,SwapCached 看和交换空间相关的缓存状态。

Active、Inactive 与匿名页/文件页

  1. Active:最近使用过的内存大小(单位:kB)。
  2. Inactive:最近未使用的内存大小(单位:kB)。
  3. Active(anon):最近使用的匿名内存大小(单位:kB),不包括文件页。
  4. Inactive(anon):最近未使用的匿名内存大小(单位:kB),不包括文件页。
  5. Active(file):最近使用的文件页内存大小(单位:kB)。
  6. Inactive(file):最近未使用的文件页内存大小(单位:kB)。
  7. Unevictable:无法被换出的内存大小(单位:kB)。
  8. Mlocked:被 mlock 系统调用锁定的内存大小(单位:kB)。

anon 指匿名页,通常和进程堆、栈等不直接对应文件的数据有关;file 指文件页,通常和文件缓存有关。UnevictableMlocked 表示不能被正常回收或换出的内存,排查内存无法释放时可以关注。

Swap、脏页与写回字段

  1. SwapTotal:交换空间的总大小(单位:kB)。
  2. SwapFree:当前可用的空闲交换空间大小(单位:kB)。
  3. Dirty:等待被写回到磁盘上的脏页内存大小(单位:kB)。
  4. Writeback:正在被写回到磁盘上的内存大小(单位:kB)。
  5. AnonPages:不属于任何文件的匿名内存页大小(单位:kB)。
  6. Mapped:已被映射到用户空间的内存大小(单位:kB)。
  7. Shmem:用于共享内存的总大小(单位:kB)。

如果系统出现明显 IO 抖动,DirtyWriteback 可以帮助判断是否有大量脏页等待落盘或正在落盘。如果系统频繁使用 Swap,则需要结合 SwapTotalSwapFreeSwapCached 和业务进程内存使用情况一起看。

内核内存、Slab 与页表

  1. KReclaimable:可回收的内核内存大小(单位:kB)。
  2. Slab:内核数据结构缓存的总大小,可以分为 SReclaimableSUnreclaim
    • SReclaimable:可回收的 slab 内存大小(单位:kB)。
    • SUnreclaim:不可回收的 slab 内存大小(单位:kB)。
  3. KernelStack:内核堆栈的内存大小(单位:kB)。
  4. PageTables:用于页表的内存大小(单位:kB)。
  5. NFS_Unstable:不稳定的 NFS 页面大小(单位:kB)。
  6. Bounce:用于块设备的临时缓冲区内存大小(单位:kB)。
  7. WritebackTmp:临时用来写回文件系统的内存大小(单位:kB)。

Slab 是排查内核内存占用时常看的字段。它并不都代表不可回收内存,SReclaimable 表示可回收部分,SUnreclaim 表示不可回收部分。

内存承诺与虚拟内存字段

  1. CommitLimit:系统内存承诺的上限(单位:kB)。
  2. Committed_AS:已经承诺分配的内存总大小(单位:kB)。
  3. VmallocTotal:虚拟内存的总大小(单位:kB)。
  4. VmallocUsed:已使用的虚拟内存大小(单位:kB)。
  5. VmallocChunk:最大的连续虚拟内存块大小(单位:kB)。
  6. Percpu:每个 CPU 的内存大小(单位:kB)。
  7. HardwareCorrupted:硬件损坏的内存大小(单位:kB)。

CommitLimitCommitted_AS 适合用来观察系统内存承诺压力。它们反映的是“承诺分配”的视角,不等同于物理内存已经实际占用。

HugePages 与 DirectMap 字段

  1. AnonHugePages:巨大页的匿名内存大小(单位:kB)。
  2. ShmemHugePages:共享内存的巨大页大小(单位:kB)。
  3. ShmemPmdMapped:使用 PMD 映射的共享内存大小(单位:kB)。
  4. HugePages_Total:巨大页的总数。
  5. HugePages_Free:空闲的巨大页数。
  6. HugePages_Rsvd:保留的巨大页数。
  7. HugePages_Surp:额外的巨大页数。
  8. Hugepagesize:每个巨大页的大小(单位:kB)。
  9. Hugetlb:用于巨大页的内存总大小(单位:kB)。
  10. DirectMap4k:4k 映射的内存大小(单位:kB)。
  11. DirectMap2M:2M 映射的内存大小(单位:kB)。
  12. DirectMap1G:1G 映射的内存大小(单位:kB)。

HugePages 相关字段主要用于观察大页配置和使用情况。DirectMap 字段则反映不同页大小的直接映射内存情况。

排查 Linux 内存问题时先看哪些字段

如果只是快速判断机器内存是否紧张,可以先看:

  • MemTotal:总内存。
  • MemAvailable:估算可用内存。
  • CachedBuffers:文件缓存和缓冲区。
  • SwapFreeSwapCached:Swap 使用情况。
  • DirtyWriteback:是否有较多脏页或写回压力。
  • SlabSReclaimableSUnreclaim:内核缓存是否异常增长。

更细的定位再结合进程级内存、IO、应用指标和系统日志一起判断。

结论

/proc/meminfo 的每个字段都提供了一个观察 Linux 内存状态的角度。日常监控不需要把所有字段都做成告警,但理解它们的含义,有助于判断内存不足、Swap 使用、脏页写回、Slab 增长和 HugePages 配置等问题。

最常见的误区是只看 MemFree。在 Linux 里,缓存可以被回收,真正判断可用内存时更应该关注 MemAvailable,再结合缓存、Swap 和业务进程状态综合分析。

FAQ

Q1:MemFree 很低是不是代表 Linux 内存不够了? A:不一定。Linux 会把一部分空闲内存用于缓存。判断可用内存时,MemAvailable 通常比 MemFree 更有参考价值。

Q2:Cached 很高是否说明应用有内存泄漏? A:不能直接这么判断。Cached 主要表示页缓存,用于存放已打开文件的数据,其中一部分可以在需要时被回收。

Q3:Slab 很高应该看什么? A:可以进一步看 SReclaimableSUnreclaim。前者表示可回收的 slab 内存,后者表示不可回收的 slab 内存。

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云