文档章节

解读vmstat中的ACTIVE/INACTIVE MEMORY

linuxprobe16
 linuxprobe16
发布于 2016/11/07 09:46
字数 999
阅读 13
收藏 0

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()完成的。
解读vmstat中的ACTIVE/INACTIVE MEMORY解读vmstat中的ACTIVE/INACTIVE MEMORY
vmstat看到的active/inactive memory就分别是active list和inactive list中的内存大小,如果inactive list很大,表明在必要时可以回收的页面很多;而如果inactive list很小,说明可以回收的页面不多,Active/inactive memory是针对用户进程所占用的内存而言的,内核占用的内存(包括slab)不在其中。
至于在源代码中看到的ACTIVE_ANONACTIVE_FILE,分别表示anonymous pagesmapped pages。用户进程的内存页分为两种:与文件关联的内存(比如程序文件、数据文件所对应的内存页)和与文件无关的内存(比如进程的堆栈,用malloc申请的内存),前者称为file pages或mapped pages,后者称为anonymous pages,File pages在发生换页(page-in或page-out)时,是从它对应的文件读入或写出;anonymous pages在发生换页时,是对交换区进行读/写操作。

免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好:http://www.linuxprobe.com/

本文转载自:http://www.linuxprobe.com/vmstat-active-inactive-memory.html

共有 人打赏支持
linuxprobe16
粉丝 11
博文 778
码字总数 171013
作品 0
河东
vmstat是Virtual Meomory Statistics(虚拟内存统计)

用来纪录 processes, memory, paging, block IO, traps, 与 cpu activity [root@raclinux1 ~]# vmstat --help usage: vmstat [-V] [-n] [delay [count]] -V prints version. -n causes the ......

JieZhu
2012/12/22
0
0
vmstat 等Linux性能命令中文参考

本文主要介绍基于Linux的 sar (System Accounting Report) 及 vmstat , iostat ,prstat 等工具。Windows请参考使用资源监视器(可以在任务管理器调出)和命令typeperf。 性能监控特别关注CPU、...

磁针石
2015/06/27
0
1
bugreport打印的dmsg 谁能帮忙解读一下

<4>[81167.356545]zygote invoked oom-killer: gfpmask=0xd0, order=2, oomadj=-16, oomscoreadj=-941^M <4>[81167.356627] Backtrace: ^M <4>[81167.356676] [] (dump_backtrace+0x0/0x110)......

iceword
2013/02/27
604
1
/proc/meminfo详解

/proc/meminfo Explained "Free," "buffer," "swap," "dirty." What does it all mean? If you said, "something to do with the Summer of '68", you may need a primer on 'meminfo'. The ......

alfredliukai
2015/08/05
0
0
LINUX上MYSQL优化三板斧

现在MySQL运行的大部分环境都是在Linux上的,如何在Linux操作系统上根据MySQL进行优化,我们这里给出一些通用简单的策略。这些方法都有助于改进MySQL的性能。 闲话少说,进入正题。 一、CPU...

没人给撸就自己撸码
2014/01/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

6. Python3源码—List对象

6.1. List对象 List对象是“变长对象”。 6.1.1. Python中的创建 Python中List对象最重要的创建方法为PyList_New,如下Python语句最终会调用到PyList_New: test = [1, 2, 3, 4, 5] 6.1.2. ...

Mr_zebra
7分钟前
0
0
nginx屏蔽指定接口(URL)

Step1:需求 web平台上线后,需要屏蔽某个服务接口,但又不想重新上线,可以采用nginx屏蔽指定平台接口的办法 Step2:具体操作 location /dist/views/landing/UNIQUE_BEACON_URL { re...

Linux_Anna
15分钟前
0
0
tomcat高并发配置调优

作者:Joker-pan 原文:https://blog.csdn.net/u011622226/article/details/72510385?utm_source=copy --------------------- tomcat 解压就使用的,配置都没动过,肯定不能支持高并发了; ...

imbiao
34分钟前
0
0
mysql 联结,级联查询总结区分

其实我对 数据库的级联或者联结查询一直都是会用,项目能查询出来自己想要的结果即可。 毕竟SQL使用复杂的查询毕竟比较少,而且不难使用。 至于区分他们,我还真的有点模糊。 在看 《SQL必知...

之渊
50分钟前
1
0
区块链入门教程分享区块链POW证明代码实现demo

兄弟连区块链入门教程分享区块链POW证明代码实现demo 这里强调一下区块链的协议分层 应用层 合约层 激励机制 共识层 网络层 数据层 上 一篇主要实现了区块链的 数据层,数据层主...

兄弟连区块链入门教程
57分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部