Linux 系统监控里,很多基础信息都来自 /proc 目录。CPU 信息、内存信息、磁盘情况、IO 情况、网卡流量,都可以在 /proc 下找到对应入口。其中,内存信息主要来自 /proc/meminfo。
/proc/meminfo 字段很多,新手常见困惑是:哪些字段表示真实可用内存,哪些字段是缓存,哪些字段和 Swap、Slab、HugePages 有关。本文按监控和排障视角整理这些字段的中文含义。
核心要点摘要
/proc/meminfo是 Linux 内存监控的重要数据来源,字段单位大多是 kB。- 判断系统是否还有可用内存时,
MemAvailable通常比MemFree更接近真实情况。 Cached、Buffers、Slab等字段不等于“内存泄漏”,其中一部分可能会被系统回收。- Swap、Dirty、Writeback、CommitLimit、Committed_AS 等字段适合排查换页、写回和内存承诺问题。
- HugePages、DirectMap 等字段更偏向内核、虚拟内存和大页场景,普通业务排障不一定每天都会用到。
/proc/meminfo 是什么
/proc/meminfo 是 Linux 内核暴露的内存状态文件。监控系统读取它,可以得到系统总内存、空闲内存、缓存、Swap、Slab、HugePages 等信息。
对监控系统来说,这些字段不是孤立的。比如只看 MemFree,很容易误以为机器内存不足;结合 MemAvailable、Cached、Buffers、SReclaimable 等字段,才能更合理地判断系统还能承载多少新进程或新请求。
常用内存字段
- MemTotal:系统总内存的大小(单位:kB)。
- MemFree:当前可用的空闲内存大小(单位:kB)。
- MemAvailable:估算的可以被新启动应用程序使用的内存量(单位:kB),比
MemFree更能反映实际可用内存。 - Buffers:用作缓存页缓冲区的内存大小(单位:kB)。
- Cached:用作页缓存的内存大小(单位:kB),用于存放已打开文件的数据。
- SwapCached:已经被交换出去但仍然在交换缓存中的内存大小(单位:kB),如果需要,可以较快换回内存。
这几个字段是日常看 Linux 内存时最常用的一组。简单说,MemTotal 看总量,MemAvailable 看可用量,Cached 和 Buffers 看文件系统相关缓存,SwapCached 看和交换空间相关的缓存状态。
Active、Inactive 与匿名页/文件页
- Active:最近使用过的内存大小(单位:kB)。
- Inactive:最近未使用的内存大小(单位:kB)。
- Active(anon):最近使用的匿名内存大小(单位:kB),不包括文件页。
- Inactive(anon):最近未使用的匿名内存大小(单位:kB),不包括文件页。
- Active(file):最近使用的文件页内存大小(单位:kB)。
- Inactive(file):最近未使用的文件页内存大小(单位:kB)。
- Unevictable:无法被换出的内存大小(单位:kB)。
- Mlocked:被
mlock系统调用锁定的内存大小(单位:kB)。
anon 指匿名页,通常和进程堆、栈等不直接对应文件的数据有关;file 指文件页,通常和文件缓存有关。Unevictable 和 Mlocked 表示不能被正常回收或换出的内存,排查内存无法释放时可以关注。
Swap、脏页与写回字段
- SwapTotal:交换空间的总大小(单位:kB)。
- SwapFree:当前可用的空闲交换空间大小(单位:kB)。
- Dirty:等待被写回到磁盘上的脏页内存大小(单位:kB)。
- Writeback:正在被写回到磁盘上的内存大小(单位:kB)。
- AnonPages:不属于任何文件的匿名内存页大小(单位:kB)。
- Mapped:已被映射到用户空间的内存大小(单位:kB)。
- Shmem:用于共享内存的总大小(单位:kB)。
如果系统出现明显 IO 抖动,Dirty 和 Writeback 可以帮助判断是否有大量脏页等待落盘或正在落盘。如果系统频繁使用 Swap,则需要结合 SwapTotal、SwapFree、SwapCached 和业务进程内存使用情况一起看。
内核内存、Slab 与页表
- KReclaimable:可回收的内核内存大小(单位:kB)。
- Slab:内核数据结构缓存的总大小,可以分为
SReclaimable和SUnreclaim。- SReclaimable:可回收的 slab 内存大小(单位:kB)。
- SUnreclaim:不可回收的 slab 内存大小(单位:kB)。
- KernelStack:内核堆栈的内存大小(单位:kB)。
- PageTables:用于页表的内存大小(单位:kB)。
- NFS_Unstable:不稳定的 NFS 页面大小(单位:kB)。
- Bounce:用于块设备的临时缓冲区内存大小(单位:kB)。
- WritebackTmp:临时用来写回文件系统的内存大小(单位:kB)。
Slab 是排查内核内存占用时常看的字段。它并不都代表不可回收内存,SReclaimable 表示可回收部分,SUnreclaim 表示不可回收部分。
内存承诺与虚拟内存字段
- CommitLimit:系统内存承诺的上限(单位:kB)。
- Committed_AS:已经承诺分配的内存总大小(单位:kB)。
- VmallocTotal:虚拟内存的总大小(单位:kB)。
- VmallocUsed:已使用的虚拟内存大小(单位:kB)。
- VmallocChunk:最大的连续虚拟内存块大小(单位:kB)。
- Percpu:每个 CPU 的内存大小(单位:kB)。
- HardwareCorrupted:硬件损坏的内存大小(单位:kB)。
CommitLimit 和 Committed_AS 适合用来观察系统内存承诺压力。它们反映的是“承诺分配”的视角,不等同于物理内存已经实际占用。
HugePages 与 DirectMap 字段
- AnonHugePages:巨大页的匿名内存大小(单位:kB)。
- ShmemHugePages:共享内存的巨大页大小(单位:kB)。
- ShmemPmdMapped:使用 PMD 映射的共享内存大小(单位:kB)。
- HugePages_Total:巨大页的总数。
- HugePages_Free:空闲的巨大页数。
- HugePages_Rsvd:保留的巨大页数。
- HugePages_Surp:额外的巨大页数。
- Hugepagesize:每个巨大页的大小(单位:kB)。
- Hugetlb:用于巨大页的内存总大小(单位:kB)。
- DirectMap4k:4k 映射的内存大小(单位:kB)。
- DirectMap2M:2M 映射的内存大小(单位:kB)。
- DirectMap1G:1G 映射的内存大小(单位:kB)。
HugePages 相关字段主要用于观察大页配置和使用情况。DirectMap 字段则反映不同页大小的直接映射内存情况。
排查 Linux 内存问题时先看哪些字段
如果只是快速判断机器内存是否紧张,可以先看:
MemTotal:总内存。MemAvailable:估算可用内存。Cached、Buffers:文件缓存和缓冲区。SwapFree、SwapCached:Swap 使用情况。Dirty、Writeback:是否有较多脏页或写回压力。Slab、SReclaimable、SUnreclaim:内核缓存是否异常增长。
更细的定位再结合进程级内存、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:可以进一步看 SReclaimable 和 SUnreclaim。前者表示可回收的 slab 内存,后者表示不可回收的 slab 内存。
