原文:https://access.redhat.com/solutions/406773?translation-out-of-date=en

环境

  • Red Hat Enterprise Linux(RHEL,所有版本)

问题

  • 需要/proc/meminfo输出的解释。
  • 想比较free -kcat /proc/meminfo的输出。

解决方案

比较输出
  • 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.txtDocumentation/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中添加了新的参数为CmaTotalCmaFree

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来验证相同。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐