解读vmstat中的ACTIVE/INACTIVE MEMORY

本文深入探讨了Linux下vmstat命令显示的Active与Inactive Memory的具体含义及其背后的实现原理,通过分析内核代码揭示了这两种内存状态的计算方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vmstat 命令能够报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息,那么我们又该如何理解其工作原理呢?
vmstat -a 命令能看到active memory 和 inactive memory

$ vmstat -a 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 1  0 138096 319560 1372408 1757848    0    0     2     3    2    3  1  0 99  0  0

但它们的含义在manpage中只给了简单的说明,并未详细解释:

inact: the amount of inactive memory. (-a option)
active: the amount of active memory. (-a option)

在此我们试图准确理解它的含义。通过阅读vmstat的源代码(vmstat.c和proc/sysinfo.c)得知,vmstat命令是直接从/proc/meminfo中获取的数据:

$ grep -i act /proc/meminfo
Active:          1767928 kB
Inactive:        1373760 kB

/proc/meminfo的数据是在以下内核函数中生成的:

fs/proc/meminfo.c:
==================
0023 static int meminfo_proc_show(struct seq_file *m, void *v)
0024 {
...
 
0032         unsigned long pages[NR_LRU_LISTS];
...
 
0051         for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
0052                 pages[lru] = global_page_state(NR_LRU_BASE + lru);
...
 
0095                 "Active:         %8lu kB\n"
0096                 "Inactive:       %8lu kB\n"
0097                 "Active(anon):   %8lu kB\n"
0098                 "Inactive(anon): %8lu kB\n"
0099                 "Active(file):   %8lu kB\n"
0100                 "Inactive(file): %8lu kB\n"
...
 
0148                 K(pages[LRU_ACTIVE_ANON]   + pages[LRU_ACTIVE_FILE]),
0149                 K(pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]),
0150                 K(pages[LRU_ACTIVE_ANON]),
0151                 K(pages[LRU_INACTIVE_ANON]),
0152                 K(pages[LRU_ACTIVE_FILE]),
0153                 K(pages[LRU_INACTIVE_FILE]),
...

这段代码的意思是统计所有的LRU list,其中Active Memory等于ACTIVE_ANON与ACTIVE_FILE之和,Inactive Memory等于INACTIVE_ANON与INACTIVE_FILE之和。

LRU list是Linux kernel的内存页面回收算法(Page Frame Reclaiming Algorithm)所使用的数据结构,LRU是Least Recently Used的缩写词,这个算法的核心思想是:回收的页面应该是最近使用得最少的,为了实现这个目标,最理想的情况是每个页面都有一个年龄项,用于记录最近一次访问页面的时间,可惜x86 CPU硬件并不支持这个特性,x86 CPU只能做到在访问页面时设置一个标志位Access Bit,无法记录时间,所以Linux Kernel使用了一个折衷的方法——它采用了LRU list列表,把刚访问过的页面放在列首,越接近列尾的就是越长时间未访问过的页面,这样,虽然不能记录访问时间,但利用页面在LRU list中的相对位置也可以轻松找到年龄最长的页面。Linux kernel设计了两种LRU list: active list 和 inactive list, 刚访问过的页面放进active list,长时间未访问过的页面放进inactive list,这样从inactive list回收页面就变得简单了。内核线程kswapd会周期性地把active list中符合条件的页面移到inactive list中,这项转移工作是由refill_inactive_zone()完成的。
LURlist
vmstat看到的active/inactive memory就分别是active list和inactive list中的内存大小,如果inactive list很大,表明在必要时可以回收的页面很多;而如果inactive list很小,说明可以回收的页面不多,Active/inactive memory是针对用户进程所占用的内存而言的,内核占用的内存(包括slab)不在其中。
至于在源代码中看到的ACTIVE_ANON和ACTIVE_FILE,分别表示anonymous pagesmapped pages。用户进程的内存页分为两种:与文件关联的内存(比如程序文件、数据文件所对应的内存页)和与文件无关的内存(比如进程的堆栈,用malloc申请的内存),前者称为file pages或mapped pages,后者称为anonymous pages,File pages在发生换页(page-in或page-out)时,是从它对应的文件读入或写出;anonymous pages在发生换页时,是对交换区进行读/写操作。

本文转载自:http://www.linuxprobe.com/vmstat-active-inactive-memory
免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好:http://www.linuxprobe.com/

<think>嗯,用户想了解如何在Linux中查看所有进程的内存使用情况。之前他们问过如何查找并终止使用特定端口的进程,现在转向内存管理,可能是在进行系统性能调优或者故障排查。我需要提供几种常用的方法,并确保步骤清晰。 首先,得考虑不同的命令工具。常用的有top、htop、ps、free、vmstat等。用户可能需要不同详细程度的信息,比如整体内存使用还是每个进程的情况。比如,ps命令可以列出进程,但需要合适的参数来显示内存。可能需要提到RSS和VSZ的区别,因为用户可能不清楚这些指标的含义。 另外,用户可能没有安装所有工具,比如htop可能需要额外安装。需要指出这点,并提供安装命令。还有/proc/meminfo也是一个重要的文件,可以查看系统内存的详细信息,但可能对于新手来说不太直观,所以可能需要解释关键指标。 要注意权限问题,有些命令可能需要sudo才能看到所有进程。比如,使用ps aux或者top时,普通用户可能看不到其他用户的进程,需要提示使用sudo。 用户可能还需要按内存排序进程,比如在top中按Shift+M,或者在ps命令中使用--sort选项。这些细节对用户排查内存泄漏问题很有帮助。 此外,free命令显示总体内存使用情况,但用户可能已经知道这个,他们的问题是关于进程级别的,所以重点还是放在进程相关的工具上。不过,结合free和进程工具,可以更全面地了解内存情况。 需要总结不同方法的优缺点,比如htop更友好但需要安装,ps适合脚本处理,top适合实时监控。用户可能有不同的使用场景,比如自动化脚本需要ps,交互式使用则推荐htop。 最后,确保回答结构清晰,分步骤说明每种方法,并给出示例命令,方便用户直接复制使用。同时提醒注意事项,比如理解内存指标的意义,避免误解数据。</think>在Linux中查看所有进程的内存使用情况,可以通过以下工具和命令实现: --- ### **1. 使用`top`命令(实时动态查看)** ```bash top ``` - **操作说明**: 1. 默认按CPU占用排序,按 `Shift + M` 切换为按内存占用排序。 2. **关键列**: - `VIRT`:虚拟内存总量(包含共享库、未分配物理内存等)。 - `RES`:实际物理内存占用(Resident Set Size,即进程实际使用的内存)。 - `%MEM`:内存占用百分比(RES占系统总物理内存的比例)。 3. 退出:按 `q` 键。 --- ### **2. 使用`htop`命令(增强版`top`,需安装)** ```bash # 安装htop(Debian/Ubuntu) sudo apt install htop # 安装htop(CentOS/RHEL) sudo yum install htop # 运行htop htop ``` - **优势**: - 彩色界面,支持鼠标操作。 - 直接按 `F6` 选择排序字段(如 `PERCENT_MEM`)。 - 显示更直观的树状进程结构。 --- ### **3. 使用`ps`命令(静态快照)** ```bash # 显示所有进程的内存占用(按内存降序排序) ps aux --sort=-%mem # 简化输出(仅显示进程名、PID、内存占用) ps -eo pid,user,%mem,command --sort=-%mem | head -n 20 ``` - **参数解析**: - `aux`:显示所有用户进程。 - `-eo`:自定义输出列(`pid`、`user`、`%mem`、`command`)。 - `--sort=-%mem`:按内存占用降序排序。 - `head -n 20`:仅显示前20个高内存进程。 --- ### **4. 使用`free`命令(查看系统整体内存)** ```bash free -h ``` - **输出示例**: ```bash total used free shared buff/cache available Mem: 7.7G 2.1G 3.2G 123M 2.4G 5.2G Swap: 2.0G 0B 2.0G ``` - **参数解析**: - `-h`:以人类可读格式(GB/MB)显示。 - **关键指标**: - `available`:系统可用内存(包含缓存和缓冲区的可分配内存)。 --- ### **5. 使用`/proc/meminfo`文件(底层内存信息)** ```bash cat /proc/meminfo ``` - **关键指标**: - `MemTotal`:系统总物理内存。 - `MemFree`:完全未使用的内存。 - `Cached`:缓存文件数据的内存(可被快速释放)。 - `SwapTotal`/`SwapFree`:交换分区总量与剩余量。 --- ### **6. 使用`vmstat`命令(统计内存使用趋势)** ```bash vmstat -s -SM # 以MB为单位显示统计信息 ``` - **输出示例**: ```bash 7872 M total memory 2145 M used memory 1234 M active memory 567 M inactive memory 3254 M free memory # ... ``` --- ### **总结与对比** | **工具** | **用途** | **适用场景** | |--------------|-------------------------------------|-----------------------------| | `top` | 实时监控进程内存和CPU | 动态观察内存变化 | | `htop` | 交互式增强版监控(需安装) | 直观查看和管理进程 | | `ps` | 静态快照,按需筛选进程 | 生成报告或脚本处理 | | `free` | 查看系统整体内存使用情况 | 快速检查内存余量 | | `/proc/meminfo` | 获取底层内存详细信息 | 开发或深度调优时使用 | --- ### **操作示例:排查高内存进程** ```bash # 1. 使用ps查找前10个高内存进程 ps -eo pid,user,%mem,command --sort=-%mem | head -n 10 # 输出示例: # PID USER %MEM COMMAND # 1234 root 25% java -Xmx4g ... # 5678 mysql 18% mysqld ... # 2. 使用top动态观察 top -u mysql # 仅监控mysql用户的进程 # 3. 结合kill释放内存(谨慎操作!) sudo kill -9 1234 # 强制终止PID=1234的进程 ``` --- ### **注意事项** 1. **内存类型区分**: - `VIRT`(虚拟内存)可能远大于物理内存(包含共享库、映射文件等)。 - `RES`(实际内存)反映进程真实占用的物理内存。 2. **缓存和缓冲区**: - Linux会利用空闲内存缓存文件数据(`Cached`/`Buffers`),这部分内存可被快速释放,无需过度担心“内存已用尽”。 3. **OOM Killer**: - 当内存耗尽时,内核会触发OOM Killer终止高内存进程,可通过 `dmesg` 查看日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值