Translated message

A translation of this page exists in English.

解释 Red Hat Enterprise Linux 的 /proc/meminfo 和 free 输出

Solution Verified - Updated -

Environment

  • Red Hat Enterprise Linux(所有版本)

Issue

  • 我需要 /proc/meminfo 输出的解释。
  • 我想将 free -k 的输出与 cat /proc/meminfo 进行比较。
  • 我想将 sar -r ALL 的输出与 cat /proc/meminfo 进行比较。

Resolution

比较输出

  • 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 中得到与 /proc/meminfo 字段匹配的 free 输出。

free output 对应的 /proc/meminfo 字段
Mem: total MemTotal
Mem: used MemTotal - MemFree [1]
Mem: free MemFree
Mem: shared(现在可忽略。它没有意义。) 不适用
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)中得到与 /proc/meminfo 字段匹配的 free 输出。

free output 对应的 /proc/meminfo 字段
Mem: total MemTotal
Mem: used MemTotal - MemFree - Buffers - Cached - Slab [1]
Mem: free MemFree
Mem: shared Shmem
Mem: buff/cache Buffers + Cached + Slab [2]
Mem:available MemAvailable
Swap: total SwapTotal
Swap: used SwapTotal - SwapFree
Swap: free SwapFree

[1] 从 RHEL9.1 及之后的版本开始,free output 中的 used 会按照 MemTotal - MemAvailable 计算。
[2] Buffers + Cached + SReclaimable 在至少 RHEL9.1 中

sar -r ALL 的输出匹配到 /proc/meminfo

下表显示了如何在 Red Hat Enterprise Linux 8 中得到与 /proc/meminfo 字段匹配的 sar -r ALL 输出。

sar output 对应的 /proc/meminfo 字段
kbmemfree MemFree
kbavail MemAvailable
kbmemused MemTotal - MemFree
%memused (MemTotal - MemFree) / MemTotal * 100
kbbuffers Buffers
kbcached Cached
kbcommit Committed_AS
%commit Committed_AS / (MemTotal + SwapTotal) * 100
kbactive Active
kbinact Inactive
kbdirty Dirty
kbanonpg AnonPages
kbslab Slab
kbkstack KernelStack
kbpgtbl PageTables
kbvmused VmallocUsed

在 Red Hat Enterprise Linux 9 及更新的版本中,kbmemused%memused 的公式已被改变。

sar output 对应的 /proc/meminfo 字段
kbmemused MemTotal - (MemFree + Buffers + Cached + Slab)
%memused (MemTotal - (MemFree + Buffers + Cached + Slab)) / MemTotal * 100

Root Cause

  • 分析内存消耗

Diagnostic Steps

大部分内容来自于内核文档 (Documentation/filesystems/proc.txtDocumentation/vm/hugetlbpage.txt)

高级别统计

RHEL 5, 6, 7, 8, 9 和 10。
  • MemTotal: 可用内存总量
  • MemFree: 没有被系统使用的物理内存量
  • Buffers: 缓存中的内存,原始磁盘块的相对临时存储。这不应该很大。
  • 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): 最近使用的页缓存内存,在需要前通常不会被回收
  • Inactive(file): 可回收的页缓存内存,没有很大的性能影响
  • Unevictable: 由于各种原因而无法被交换出去的无法访问的页
  • Mlocked: 使用 mlock() 系统调用锁定到内存的页面。Mlocked 页也是无法访问的。

内存统计信息

RHEL 5, 6, 7, 8, 9 和 10。
  • SwapTotal: 可用的总 swap 空间
  • SwapFree: 剩余的 swap 空间
  • 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)
Red Hat Enterprise Linux 7, 8, 9 & 10
  • Percpu: 专用于每 cpu 对象的内存量。为了扩展性和内存访问速度优化,许多特定于内核的对象被已这种方式中止,以便系统上的每个 CPU 都有一份该对象的副本(每 cpu)。这些对象可以在引导时静态分配或在系统运行期间动态分配;例如,cgroups 通常创建动态的每 cpu 对象分配。
    • 注意 :RHEL 7.8 及更新的版本提供了 /proc/meminfo 中的 Percpu 统计。
RHEL 9 和 10
  • CmaTotal: 为当前内核保留的连续内存区域的总数。
  • CmaFree: 当前内核可自由使用的连续内存区域。

备注:RHEL 9 的 /proc/meminfo 中添加了新参数,CmaTotalCmaFree

RHEL 6、7、8、9 和 10。
  • 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 进行计算。这与 hugepages 无关。
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