本文转载于http://man.linuxde.net/vmstat (截图是自己截上去的,后部分字段解释部分是个人补充)
前言:Linux系统的内存分为物理内存和虚拟内存两种。物理内存是真实的,也就是物理内存条上的内存。而虚拟内存则是采用硬盘空间补充物理内存,将暂时不使用的内存页写到硬盘上以腾出更多的物理内存让有需要的进程使用。当这些已被腾出的内存页需要再次使用时才从硬盘(虚拟内存)中读回内存。这一切对于用户来说是透明的。通常对Linux系统来说,虚拟内存就是swap分区。
vmstat命令的含义为显示虚拟内存状态(“Viryual Memor Statics”),但是它可以报告关于进程、内存、I/O等系统整体运行状态。
语法
vmstat(选项)(参数)
选项
选项 | 解释 | 实例用法 | 实例解释 |
vmstat [-a] [-n] [delay [ count]] |
-a:显示活动内页 -n:头信息仅显示一次 |
vmstat -a |
查看内存的active和inactive 注:inact和active的数据来自于/proc/meminfo |
vmstat [-f] [-s] [-m] |
-f:显示启动后创建的进程总数 -s:以表格方式显示事件计数器和内存状态 -m:显示slab信息 |
vmstat -f vmstat -s |
vmstat -f查看系统已经fork了多少次 1872 forks vmstat -s截图: 注:这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat |
vmstat [-V] | |||
vmstat [-D] | |||
vmstat [-d] | -d:报告磁盘状态 | vmstat -d |
注:这些信息主要来自于/proc/diskstats. |
vmstat [-p disk partition] | -p:显示指定的硬盘分区状态 | vmstat -p /dev/sda1 |
查看/dev/sda1磁盘的读/写
注:这些信息主要来自于/proc/diskstats |
vmstat [-S unit] | -S:输出信息的单位 |
参数
- 事件间隔:状态信息刷新的时间间隔;
- 次数:显示报告的次数。
实例
命令:vmstat 3
注:每两秒打印一次信息 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 320 42188 167332 1534368 0 0 4 7 1 0 0 0 99 0 0 0 0 320 42188 167332 1534392 0 0 0 0 1002 39 0 0 100 0 0 0 0 320 42188 167336 1534392 0 0 0 19 1002 44 0 0 100 0 0 0 0 320 42188 167336 1534392 0 0 0 0 1002 41 0 0 100 0 0 0 0 320 42188 167336 1534392 0 0 0 0 1002 41 0 0 100 0 0
截图:
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数。
命令:vmstat 2 3
注:每2秒打印一次信息,共打印3次
字段说明:
截图:
对于内存监控,需关心的指标包括:swpd、free、buff、cache、si和so,尤其需要重视的是free、si和so。很多人都会认为系统的空闲内存(free)少就代表系统性能有问题,其实并不是这样的,这还要结合si和so(内存和磁盘的页面交换)两个指标进行分析。正常来说,当物理内存能满足系统需要的话(也就是说物理内存能足以存放所有进程的数据),那么物理内存和磁盘(虚拟内存)是不应该存在频繁的页面交换操作的,只有当物理内存不能满足需要时系统才会把内存中的数据交换到磁盘中。而由于磁盘的性能是比内存慢很多的,所以如果存在大量的页面交换,那么系统的性能必然会受到很大影响。
Procs(进程)
- r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)一般r>3是比较高,r>5是高,r>10就不正常了,服务器就很危险。
- b: 等待IO的进程数量。(阻塞)
Memory(内存)
- swpd: 虚拟内存已使用大小,如swpd的值不为0,但SI,SO的值长期为0,这种情况不影响系统性能。如大于0,表示机器物理内存不足,如不是程序内存泄露的原因,应升级内存或把耗内存任务迁移到其他机器。
- free: 空闲物理内存大小。
- buff: 用作缓冲的内存大小,Linux/Unix系统用来存储,目录里有什么内容,权限等的缓存。
- cache: 用作缓存的内存大小,可使用命令清空cache:echo 3 > /proc/sys/vm/drop_caches。如果cache的值大时,说明cache处的文件数多,如频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。(Linux/Unix的聪明之处,把空闲物理内存的一部分拿来做文件和目录的缓存,为了提高程序执行性能,当程序使用内存时,buffer/cached会很快地被使用。)
Swap
- si: 每秒从交换区写到内存的大小,由磁盘调入内存(每秒从磁盘读入虚拟内存的大小)。如si>0,表示物理内存不够用或内存泄露,要查找耗内存进程解决掉。
- so: 每秒写入交换区的内存大小,由内存调入磁盘(每秒虚拟内存写入磁盘的大小)。如so>0,表示物理内存不够用或内存泄露,要查找耗内存进程解决掉。
注意:内存够用时,这2个值都是0,如这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。
IO(现在的Linux版本块的大小为1kb)
- bi: 每秒读取的块数
- bo: 每秒写入的块数,如读取文件,bo就要大于0。bi和bo一般要接近0,不然就IO过于频繁,需调整。
注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。
system(系统)
- in: 每秒中断数,包括时钟中断。
- cs: 每秒上下文切换数。例调用系统函数,要进行上下文切换。线程的切换,需进程上下文切换,cs值要越小越好,太大则考虑调低线程或进程数,例在apache和nginx这种web服务器中,一般做性能测试时进行几千并发甚至几万并发测试,选择web服务器的进程可由进程或线程的峰值一直下调,压测,直到cs到一个较小的值,这进程和线程数就是比较合适的值。系统调用也是,每次调用系统函数,代码就会进入内核空间,导致上下文切换,这很耗资源,需尽量避免频繁调用系统函数。上下文切换次数过多表示CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。
CPU(以百分比表示)
- us: 用户进程执行时间百分比(user time)
us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
- sy: 内核系统进程执行时间百分比(system time)
sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
- wa: IO等待时间百分比
wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
- id: 空闲时间百分比