解释 Red Hat Enterprise Linux 的 /proc/meminfo 和 free 输出
Environment
- Red Hat Enterprise Linux(所有版本)
Issue
- 我需要
/proc/meminfo
输出的解释。 - 我想将
free -k
的输出与cat /proc/meminfo
的输出进行比较。
Resolution
- 对于在 RHEL 5 之前的 Red Hat Enterprise Linux (RHEL)版本中
/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 及更高版本,提供了一个额外的字段,它会被使用,而不是对
-/+ buffer/cache
行的计算:
MemAvailable: 543584 kB
将 free -k
的输出与 /proc/meminfo
匹配
下表显示了如何在 Red Hat Enterprise Linux 5、6、7、8 和 9 中得到与 /proc/meminfo
字段匹配的 free
输出。
free 输出 |
相应的 /proc/meminfo 字段 |
---|---|
Mem: total |
MemTotal |
Mem: used |
MemTotal - MemFree |
Mem: free |
MemFree |
Mem: shared (现在可以忽略)。它没有意义。) |
N/A |
Mem: buffers |
Buffers |
Mem: cached |
Cached |
-/+ buffer/cache: used |
MemTotal -(MemFree + Buffers + Cached) |
-/+ buffer/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)中得到与 /proc/meminfo
字段匹配的 free
输出。
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 |
Root Cause
- 分析内存消耗
Diagnostic Steps
大部分资料是从内核文档中获取的(Documentation/filesystems/proc.txt
和 Documentation/vm/hugetlbpage.txt
)
高级别统计
RHEL 5、6、7、8 和 9。
MemTotal:
可用内存总量MemFree:
系统 没有 使用的物理内存量Buffers:
缓存中的内存,原始磁盘块的相对临时存储。这不应该很大。Cached:
页缓存中的内存(磁盘缓存和共享内存)SwapCached:
主内存中存在的内存,但也在交换文件中。(如果需要内存,则不需要将该区域再次交换出去,因为它已在交换文件中。这会节省 I/O,并在机器缺少内存时提高性能。)
仅限 RHEL 7、8 和 9
MemAvailable:
估算需要多少内存来启动新的应用程序,而不需要交换。- 有关
MemAvailable
的更多信息,请查看 此处 。
- 有关
详细的级别统计
RHEL 5、6、7、8 和 9。
Active:
最近使用的内存,通常不会被交换出去或回收Inactive:
最近 没有 使用的内存,且可被交换出去或回收
RHEL 6, 7, 8 和 9。
Active(anon):
最近使用的匿名内存,通常不会被交换出去Inactive (anon):
最近 没有 使用的匿名内存,可被交换出去Active(file):
最近使用的页缓存内存,在需要前通常不会被回收Inactive(file):
可回收的页缓存内存,没有很大的性能影响Unevictable:
由于各种原因而无法被交换出去的无法访问的页Mlocked:
使用mlock()
系统调用锁定到内存的页面。Mlocked 页也是无法访问的。
内存统计信息
RHEL 5、6、7、8 和 9。
SwapTotal:
可用的总 swap 空间SwapFree:
剩余的 swap 空间Dirty:
等待写到磁盘的内存Writeback:
主动写回磁盘的内存AnonPages:
映射到用户空间页表的非文件支持的页Mapped:
已映射的文件,如库Slab:
内核中的数据结构缓存PageTables :
专用于最低级别页表的内存量。如果很多进程附加到同一共享内存段上,可以将其增加到一个高值。NFS_Unstable:
发送到服务器的 NFS 页,但还没有提交到存储Bounce:
用于块设备bounce 缓冲
的内存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 :
巨页
的大小(在基于 Intel 的系统上通常为 2MB)
Red Hat Enterprise Linux 7, 8, 9
Percpu:
专用于每 cpu 对象的内存量。为了扩展性和内存访问速度优化,许多特定于内核的对象被已这种方式中止,以便系统上的每个 CPU 都有一份该对象的副本(每 cpu)。这些对象可以在引导时静态分配或在系统运行期间动态分配;例如,cgroups 通常创建动态的每 cpu 对象分配。
RHEL 9
CmaTotal :
为当前内核保留的连续内存区域的总数。CmaFree:
当前内核可自由使用的连续内存区域。
备注:在 RHEL 9
的 /proc/meminfo 中添加的作为 CmaTotal
和 CmaFree
的新参数,
RHEL 6, 7, 8 和 9 。
Shmem:
已使用的共享内存总量(在多个进程之间共享,因此包括 RAM 磁盘、SYS-V-IPC 和类似 SHMEM 的 BSD)SReclaimable:
可能被回收的 Slab 的一部分(如缓存)SUnreclaim:
在内存压力下不能被回收的 Slab 的一部分KernelStack:
内核堆栈使用的内存。这是不可回收的。WritebackTmp:
FUSE 用于临时回写缓冲区的内存HardwareCorrupted:
内核识别为损坏/不能正常工作的 RAM 量AnonHugePages:
映射到用户空间页表的非文件支持的巨页HugePages_Surp:
池中超过vm.nr_hugepages
中值的巨页数。最大超出巨页数是由vm.nr_overcommit_hugepages
控制的。DirectMap4k:
映射到内核空间 4k 页大小的内存量。DirectMap2M:
映射到内核空间 2MB 页大小的内存量。DirectMap1G.
映射到内核空间 1GB 页大小的内存量。
DirectMap*
的备注: 所有 RAM 直接映射到 64 位构架中的内核空间。如果可能,内核使用大页来提高 TLB 的效率。因此,如果 RAM 数没有改变,则 DirectMap*
的总和应该是恒定的,并且大多数内存对 DirectMap1G
和/或 DirectMap2M
进行计算。这与 巨页
无关。
DirectMap1G
的备注 :这个值仅在 /proc/meminfo
中提供,前提是相应的 CPU 硬件支持它。您可以通过检查 /proc/cpuinfo
中的标记 'pdpe1gb' 来验证。
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments