解释/proc/meminfo和free输出(适用Red Hat Enterprise Linux)
本文解释了RHEL系统中/proc/meminfo文件输出的含义,并对比了不同版本下free -k命令与/proc/meminfo的对应关系。主要内容包括: 不同RHEL版本中/proc/meminfo字段的差异,如RHEL 5-6与RHEL 7+的区别 详细对比了free -k输出与/proc/meminfo字段的映射关系 重点说明了RHEL 7+新增的MemAvailable字段及其作用 解释
原文:https://access.redhat.com/solutions/406773?translation-out-of-date=en
环境
- Red Hat Enterprise Linux(RHEL,所有版本)
问题
- 需要
/proc/meminfo
输出的解释。 - 想比较
free -k
和cat /proc/meminfo
的输出。
解决方案
- 关于RHEL 5之前版本中
/proc/meminfo
字段的定义,请参见/proc/meminfo
中的每个值的含义 。 cat /proc/meminfo
中的每个字段将在诊断步骤中讨论。- RHEL 5的输出在某些设置中会有所不同。这在诊断步骤中也有标记。
- RHEL 5还有一些在RHEL 6中不再存在的字段。关于这个问题的解释,请看为什么在x86_64 RHEL 6上的/proc/meminfo中缺少LowTotal, LowFree, HighTotal和HighFree ?
- 有关
free
命令的输出的更多信息,请参阅 如何在 Red Hat Enterprise Linux 中查看系统内存使用情况? - RHEL 7 及更高版本在
/proc/meminfo
中有一个名为MemAvailable
的附加字段。 - RHEL 7及更高版本的
free
命令的输出略有变化
比较输出
free -k
输出(RHEL 5和RHEL 6):
total used free shared buffers cached
Mem: 7778104 2971960 4806144 0 211756 1071092
-/+ buffers/cache: 1689112 6088992
Swap: 4194296 0 4194296
free -k
输出(RHEL 7及更新版本):
total used free shared buff/cache available
Mem: 1012952 252740 158732 11108 601480 543584
Swap: 1048572 5380 1043192
- 从
/proc/meminfo
中提取与free -k
输出相对应的相关字段:
MemTotal: 7778104 kB
MemFree: 4806144 kB
Buffers: 211756 kB
Cached: 1071092 kB
SwapTotal: 4194296 kB
SwapFree: 4194296 kB
- 对于RHEL 7和更高版本,有一个额外的字段可用,它被用来代替计算
-/+ buffers/cache
行:
MemAvailable: 543584 kB
将free -k
的输出匹配到/proc/meminfo
下表展示了如何在 Red Hat Enterprise Linux 5、6、7、8、9 和 10 中将 free
命令的输出与 /proc/meminfo
字段进行匹配。
free 输出 |
对应的/proc/meminfo 字段 |
---|---|
Mem: total |
MemTotal |
Mem: used |
MemTotal - MemFree [1] |
Mem: free |
MemFree |
Mem: shared (现在可以忽略不计。它没有任何意义。) |
N/A |
Mem: buffers |
Buffers |
Mem: cached |
Cached |
-/+ buffers/cache: used |
MemTotal - (MemFree + Buffers + Cached) [1] |
-/+ buffers/cache: free |
MemFree + Buffers + Cached |
Swap: total |
SwapTotal |
Swap: used |
SwapTotal - SwapFree |
Swap: free |
SwapFree |
下表展示了如何在 Red Hat Enterprise Linux 7.1 或更高版本(procps-ng 3.3.10)中将 free
命令的输出与 /proc/meminfo
字段进行匹配。
[1] 注意,自RHEL9.1及以后,free 输出
中的used
是由MemTotal - MemAvailable
计算的。
free 输出 |
对应的/proc/meminfo 字段 |
---|---|
Mem: total |
MemTotal |
Mem: used |
MemTotal - MemFree - Buffers - Cached - Slab |
Mem: free |
MemFree |
Mem: shared |
Shmem |
Mem: buff/cache |
Buffers + Cached + Slab |
Mem:available |
MemAvailable |
Swap: total |
SwapTotal |
Swap: used |
SwapTotal - SwapFree |
Swap: free |
SwapFree |
根本原因
- 分析内存消耗
诊断步骤
大部分内容取自内核文档(Documentation/filesystems/proc.txt
和 Documentation/vm/hugetlbpage.txt
)
高层统计
RHEL 5、6、7、8、9 和 10
MemTotal:
总可用内存MemFree:
系统未使用的物理内存量Buffers:
缓冲缓存(buffer cache)中的内存,所以是用于原始磁盘块的相对临时存储。这个值通常不会很大。Cached:
页缓存中的内存(磁盘缓存和共享内存)SwapCached:
存在于主内存中,但也存在于交换文件中的内存。(如果需要内存,这个区域不需要再次交换,因为它已经在交换文件中。这样可以节省I/O并在机器内存不足时提高性能。)
RHEL 7、8、9 和 10
MemAvailable:
估计在不进行交换的情况下可用于启动新应用程序的内存量。- 有关
MemAvailable
的更多信息,请查看这里。
- 有关
详细级别统计
RHEL 5、6、7、8、9 和 10
Active:
最近使用过的内存,通常没有被换出或回收Inactive:
最近没有使用的内存,可以被换出或回收
RHEL 6、7、8、9 和 10
Active(anon):
最近使用较多且通常没有被换出的匿名内存Inactive(anon):
最近未使用的匿名内存,可以被换出Active(file):
最近使用过的Pagecache内存,通常在需要时才回收Inactive(file):
可以回收而不会对性能产生巨大影响的Pagecache内存Unevictable:
由于多种原因,无法被换出的页面无法被换出Mlocked:
使用‘ mlock() ’系统调用锁定到内存的页面。被锁定的页面也是不可移除的。
内存统计
RHEL 5、6、7、8、9 和 10
SwapTotal:
总可用交换空间SwapFree:
剩余的可用交换空间Dirty:
等待写回磁盘的内存Writeback:
正在主动写回磁盘的内存AnonPages:
映射到用户空间页表且与具体文件无关的页Mapped:
已被内存映射的文件,如库文件Slab:
内核数据结构缓存PageTables:
专用于最低级页表的内存量。如果大量进程附加到同一个共享内存段,该值可能会增加到较高水平。NFS_Unstable:
发送到服务器的NFS页面,但尚未提交到存储Bounce:
用于块设备bounce buffers
的内存CommitLimit:
根据超量使用比率(vm.overcommit_ratio
),这是系统当前可分配的总内存量。仅当启用严格超量使用计算(vm.overcommit_memory
中的模式2)时,才会遵守此限制。Committed_AS:
系统上当前分配的内存量。提交的内存是由进程分配的所有内存的总和,即使它还没有被它们“使用”。VmallocTotal:
vmalloc内存区域的总大小VmallocUsed:
已使用的vmalloc区域的数量VmallocChunk:
vmalloc区域中空闲的最大连续块HugePages_Total:
内核分配的巨型页数量(通过vm.nr_hugepages
定义)HugePages_Free:
未被进程分配的巨型页数量HugePages_Rsvd:
已承诺从池中分配但尚未实际分配的巨型页的数量。Hugepagesize:
一个hugepage
的大小(在Intel系统上通常为2MB)
RHEL 7、8、9 和 10
Percpu:
专用于per-cpu对象的内存量。为了提高可伸缩性和优化内存访问速度,许多特定于内核的对象被分解成这样一种方式,即为系统上的每个CPU (per-cpu)都保存一份该对象的副本。这些对象可以在引导时静态分配,也可以在系统运行时动态分配;例如,cgroup经常创建动态的per-cpu对象分配。- 注:
proc/meminfo
中的Percpu
统计在RHEL 7.8及以后的版本中可用。
- 注:
RHEL 9 和 10
CmaTotal:
为当前内核保留的连续内存区域的总量。CmaFree:
当前内核可以自由使用的连续内存区域。
*注:*在RHEL 9的/proc/meminfo中
添加了新的参数为CmaTotal
和CmaFree
RHEL 6、7、8、9 和 10
Shmem:
已使用的共享内存总数(在多个进程之间共享,因此包括RAM磁盘、SYS-V-IPC和BSD(如SHMEM))SReclaimable:
Slab中可能被回收的部分(如缓存)SUnreclaim:
Slab中在内存压力下不能回收的部分KernelStack:
内核栈使用的内存。这是不可回收的。WritebackTmp:
FUSE用于临时回写缓冲区的内存HardwareCorrupted:
内核识别为损坏/无法工作的内存数量AnonHugePages:
映射到用户空间页表且与具体文件无关的大页面HugePages_Surp:
池中的大页面数量超过vm.nr_hugepages
中的值。surplus大页面的最大数量由vm.nr_overcommit_hugepages
控制。DirectMap4k:
以4k大小页面映射到内核空间的内存量。DirectMap2M:
以2MB大小的页面映射到内核空间的内存量。DirectMap1G:
以1GB大小的页面映射到内核空间的内存量。
关于DirectMap*
的说明:在64位架构中,所有RAM直接映射到内核空间。如果可能的话,内核会使用更大大小的页面以提高TLB(转译后备缓冲区)的效率。因此,如果RAM总量不变,DirectMap*
的总和应保持不变,并且大多数内存都计入DirectMap1G
和/或DirectMap2M
。这与hugepages
(大页)无关。
对于DirectMap1G
:此值仅在/proc/meminfo
中提供,如果相应的CPU硬件支持它。可以通过检查/proc/cpuinfo
中的标志pdpe1gb
来验证相同。
更多推荐
所有评论(0)