如何通过阅读源代码了解 vmstat 中的指标

简介:

如何通过阅读源代码了解 vmstat 中的指标


vmstat -a 命令能看到 active memory 和 inactive memory,但是它们是什么意思呢?

 
 
  1. $ vmstat -a
  2. procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
  3. r b swpd free inact active si so bi bo in cs us sy id wa st
  4. 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 中获取的数据:

 
 
  1. $ grep -i act /proc/meminfo
  2. Active: 1767928 kB
  3. Inactive: 1373760 kB

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

 
 
  1. fs/proc/meminfo.c:
  2. ==================
  3. 0023 static int meminfo_proc_show(struct seq_file *m, void *v)
  4. 0024 {
  5. ...
  6. 0032 unsigned long pages[NR_LRU_LISTS];
  7. ...
  8. 0051 for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
  9. 0052 pages[lru] = global_page_state(NR_LRU_BASE + lru);
  10. ...
  11. 0095 "Active: %8lu kB\n"
  12. 0096 "Inactive: %8lu kB\n"
  13. 0097 "Active(anon): %8lu kB\n"
  14. 0098 "Inactive(anon): %8lu kB\n"
  15. 0099 "Active(file): %8lu kB\n"
  16. 0100 "Inactive(file): %8lu kB\n"
  17. ...
  18. 0148 K(pages[LRU_ACTIVE_ANON] + pages[LRU_ACTIVE_FILE]),
  19. 0149 K(pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]),
  20. 0150 K(pages[LRU_ACTIVE_ANON]),
  21. 0151 K(pages[LRU_INACTIVE_ANON]),
  22. 0152 K(pages[LRU_ACTIVE_FILE]),
  23. 0153 K(pages[LRU_INACTIVE_FILE]),

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

LRU list 是 Linux 内核的内存页面回收算法Page Frame Reclaiming Algorithm所使用的数据结构,LRU 是 Least Recently Used 的缩写词。这个算法的核心思想是:回收的页面应该是最近使用得最少的

为了实现这个目标,最理想的情况是每个页面都有一个年龄项,用于记录最近一次访问页面的时间,可惜 x86 CPU 硬件并不支持这个特性,x86 CPU 只能做到在访问页面时设置一个标志位 Access Bit,无法记录时间。

所以 Linux 内核使用了一个折衷的方法:它采用了 LRU list 列表,把刚访问过的页面放在列首,越接近列尾的就是越长时间未访问过的页面,这样,虽然不能记录访问时间,但利用页面在 LRU list 中的相对位置也可以轻松找到年龄最长的页面。

Linux 内核设计了两种 LRU list: active list 和 inactive list, 刚访问过的页面放进 active list,长时间未访问过的页面放进 inactive list,这样从 inactive list 回收页面就变得简单了。内核线程 kswapd 会周期性地把 active list 中符合条件的页面移到 inactive list 中,这项转移工作是由 refill_inactive_zone() 完成的。这段代码的意思是统计所有的 LRU list,其中Active Memory 等于 ACTIVE_ANON 与 ACTIVE_FILE 之和,Inactive Memory 等于 INACTIVE_ANON 与 INACTIVE_FILE 之和。

LRU_list

LRU list 示意图

vmstat 看到的 active/inactive memory 就分别是 active list 和 inactive list 中的内存大小。如果 inactive list 很大,表明在必要时可以回收的页面很多;而如果 inactive list 很小,说明可以回收的页面不多。

Active/inactive memory 是针对用户进程所占用的内存而言的,内核占用的内存(包括 slab)不在其中。

至于在源代码中看到的 ACTIVE_ANON 和 ACTIVE_FILE,分别表示 anonymous pages 和 mapped pages。用户进程的内存页分为两种:与文件关联的内存(比如程序文件、数据文件所对应的内存页)和与文件无关的内存(比如进程的堆栈,用 malloc 申请的内存),前者称为 file pages 或 mapped pages,后者称为 anonymous pages。file pages 在发生换页(page-in 或 page-out)时,是从它对应的文件读入或写出;anonymous pages 在发生换页时,是对交换区进行读/写操作。



本文来自云栖社区合作伙伴“Linux中国”

原文发布时间为:2013-04-02.


相关文章
|
SQL 自然语言处理 前端开发
wc 统计已过时,cloc 每一行代码都有效
我们通常用代码量来评判一个程序员技术的高低或一个项目的大小,阅读新项目源码时,也需要了解其代码量,心里有个预期。那如何统计代码量呢?
wc 统计已过时,cloc 每一行代码都有效
|
Java Linux
【收集】【Linux】常出没的指令(持续更新...)
【收集】【Linux】常出没的指令(持续更新...)
92 0
【收集】【Linux】常出没的指令(持续更新...)
|
NoSQL 测试技术
性能测试必备知识(8)- 深入理解“进程状态”
性能测试必备知识(8)- 深入理解“进程状态”
98 0
性能测试必备知识(8)- 深入理解“进程状态”
|
测试技术 Linux
性能测试必备知识(2)- 查看 Linux 的 CPU 相关信息
性能测试必备知识(2)- 查看 Linux 的 CPU 相关信息
93 0
|
测试技术 Linux 调度
性能测试必备知识(6)- 如何查看“CPU 上下文切换”
性能测试必备知识(6)- 如何查看“CPU 上下文切换”
675 0
性能测试必备知识(6)- 如何查看“CPU 上下文切换”
|
测试技术 Linux 调度
性能测试必备知识(7)- 深入理解“CPU 使用率”
性能测试必备知识(7)- 深入理解“CPU 使用率”
491 0
性能测试必备知识(7)- 深入理解“CPU 使用率”
|
存储 缓存 监控
性能测试必备知识(10)- Linux 是怎么管理内存的?
性能测试必备知识(10)- Linux 是怎么管理内存的?
148 0
性能测试必备知识(10)- Linux 是怎么管理内存的?
|
监控 Linux Windows
Linux常用命令 - top命令详解(重点)
Linux常用命令 - top命令详解(重点)
181 0
利用 strace 分析网络不通问题案例
本章节分享利用 strace 分析网络不通问题的案例
利用 strace 分析网络不通问题案例

相关实验场景

更多