环境
- 红帽企业 Linux(所有版本)
问题
- 我需要对/proc/meminfo输出的解释。
- 我想比较free -k与cat /proc/meminfo的输出。
解决方案
- 有关free命令输出的更多信息,请参阅如何查看 Red Hat Enterprise Linux 中的系统内存利用率?
- RHEL 7 及更高版本有一个额外的字段MemAvailable调用/proc/meminfo
- RHEL 7 及更高版本的命令输出略有变化
比较输出
- 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/cacheline 的计算:
MemAvailable: 543584 kB
free -kto的匹配输出/proc/meminfo
下表显示了如何使free输出与/proc/meminfoRed Hat Enterprise Linux 5、6、7、8 和 9 中的字段匹配。
free output |
对应/proc/meminfo领域 |
Mem: total |
MemTotal |
Mem: used |
MemTotal - MemFree |
Mem: free |
MemFree |
Mem: shared(现在可以忽略。没有任何意义。) |
不适用 |
Mem: buffers |
Buffers |
Mem: cached |
Cached |
-/+ buffers/cache: used |
MemTotal - (MemFree + Buffers + Cached) |
-/+ buffers/cache: free |
MemFree + Buffers + Cached |
Swap: total |
SwapTotal |
Swap: used |
SwapTotal - SwapFree |
Swap: free |
SwapFree |
下表显示了如何使free输出与/proc/meminfoRed Hat Enterprise Linux 7.1 或更高版本 (procps-ng 3.3.10) 中的字段匹配。
free output |
对应/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。
- MemTotal:总可用内存
- MemFree:系统未使用的物理内存量
- Buffers:缓冲区缓存中的内存,因此相对临时存储原始磁盘块。这不应该变得非常大。
- Cached:pagecache 中的内存(Diskcache 和 Shared Memory)
- SwapCached:内存存在于主内存中,但也存在于交换文件中。(如果需要内存,则该区域不需要再次换出,因为它已经在交换文件中。如果机器内存不足,这可以节省 I/O 并提高性能。)
仅限 RHEL 7、8 和 9
- 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 页面也是 Unevictable。
内存统计
RHEL 5、6、7、8 和 9。
- SwapTotal:可用的总交换空间
- SwapFree:剩余可用交换空间
- Dirty:等待写回磁盘的内存
- Writeback:正在主动写回磁盘的内存
- AnonPages:映射到用户空间页表的非文件支持页
- Mapped:已映射的文件,例如库
- Slab:内核数据结构缓存
- PageTables:专用于最低级别页表的内存量。如果很多进程连接到同一个共享内存段,这可能会增加到一个很高的值。
- NFS_Unstable:NFS 页面发送到服务器,但尚未提交到存储
- Bounce:用于块设备的内存bounce buffers
- CommitLimit:根据过量使用率 ( vm.overcommit_ratio),这是系统上当前可分配的内存总量。仅当启用了严格的过量使用记帐(模式 2 in )时才遵守此限制vm.overcommit_memory。
- Committed_AS:当前在系统上分配的内存量。提交的内存是进程分配的所有内存的总和,即使它还没有被它们“使用”。
- VmallocTotal:vmalloc 内存区域的总大小
- VmallocUsed:使用的vmalloc区域的数量
- VmallocChunk:vmalloc 区域的最大连续块,它是空闲的
- HugePages_Total:内核分配的大页数(用 定义vm.nr_hugepages)
- HugePages_Free:进程未分配的大页数
- HugePages_Rsvd:已承诺从池中分配但尚未分配的大页数。
- Hugepagesize:a 的大小hugepage(在基于 Intel 的系统上通常为 2MB)
红帽企业 Linux 7、8、9
- Percpu:专用于每个 cpu 对象的内存量。为了可扩展性和内存访问速度优化,许多特定于内核的对象被分解,以便为系统上的每个 CPU(每个 CPU)拥有该对象的副本。这些对象可以在启动时静态分配,也可以在系统运行时动态分配;例如,cgroups 经常创建动态的 per-cpu 对象分配。
RHEL 9
- CmaTotal:为当前内核保留的连续内存区域总量。
- CmaFree:当前内核可以自由使用的连续内存区域。
注意:RHEL9在 /proc/meminfo 中添加的新参数 CmaTotal和CmaFree
RHEL 6、7、8 和 9。
- Shmem:使用的共享内存总量(在多个进程之间共享,因此包括 RAM 磁盘、SYS-V-IPC 和 BSD,如 SHMEM)
- 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 的有效性。DirectMap*因此,如果 RAM 的数量没有改变,并且大多数内存都计算在DirectMap1G和/或上,那么 的总和应该是恒定的DirectMap2M。这与hugepages.
注意DirectMap1G:此值仅在/proc/meminfo相应的 CPU 硬件支持的情况下可用。您可以通过检查标志“pdpe1gb”来验证/proc/cpuinfo。DirectMap1G 只会在 CPU 硬件启用了“pdpe1gb”标志的系统上可见。