vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。
一、vmstat命令简单用法
[root@localhost ~]# vmstat 2 1 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 17 0 5114092 824896 152508 1647704 0 0 1 38 0 0 99 1 1 0 0
2表示每个两秒采集一次服务器状态,1表示采集一次。
二、vmstat返回结果含义
[root@localhost ~]# vmstat 2 6 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 90 0 5108036 501140 159128 1953048 0 0 1 38 0 0 99 1 1 0 0 42 0 5108036 500328 159132 1953492 0 0 0 154 4944 32704 99 0 1 0 0 23 0 5108028 500336 159140 1953984 16 0 16 1000 4671 31510 99 0 1 0 0 20 0 5108028 495740 159156 1954308 0 0 0 44 4683 32490 99 0 0 0 0 17 0 5107996 495356 159176 1954628 0 0 0 956 4924 32816 100 0 0 0 0 21 0 5107996 495480 159184 1955112 0 0 0 6 4632 30949 100 0 0 0 0
在上面的命令中,每2s采集一次数据,总共采集6次结束。
procs
r:表示运行队列(就是说多少个进程真的分配到CPU),当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队 列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
b:表示阻塞的进程
memory
可以使用命令查看服务器的内存信息:
# cat /proc/meminfo
swpd:虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free:空闲的物理内存的大小
buff:Linux/Unix系统是用来存储目录里面有什么内容,权限等的缓存
cache:cache直接用来记忆我们打开的文件,给文件做缓冲
swap
si:每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
so:每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
io
bi:块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte
bo:块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
system
in:每秒CPU的中断次数,包括时间中断
cs:每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的 数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或 者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核 空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的 时间少了,CPU没有充分利用,是不可取的。
us:用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
cpu
sy:系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id:空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wa:等待IO CPU时间。
st:Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.
三、vmstat选项
vmstat [-a] [-n] [delay [ count]] vmstat [-f] [-s] [-m] vmstat [-S unit] vmstat [-d] vmstat [-p disk_partition] vmstat [-V]
[-a]
显示 活动(active)和 非活动(inactive)的内存。
[root@localhost ~]# 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 21 0 4967788 42880 1520052 10006484 0 0 1 38 0 0 99 1 1 0 0
[-n]
只显示头信息,不周期性显示。这里没有测试出-n的作用,貌似有和没有,结果都一样。
[-f]
显示自开机以来forks的总数,包括fork、vfork和clone system calls,总数和tasks创建的数量是一致的。
[root@localhost ~]# vmstat -f 14859691 forks
[-s]
显示各种事件计数器表和内存统计信息,这显示不重复。
[root@localhost ~]# vmstat -s 12296092 total memory 12253332 used memory 10025748 active memory 1496224 inactive memory 42760 free memory 150184 buffer memory 2291928 swap cache 8385920 total swap 4967456 used swap 3418464 free swap 7370236747 non-nice user cpu ticks 100426 nice user cpu ticks 15924721 system cpu ticks 44507677 idle cpu ticks 180918 IO-wait cpu ticks 359319 IRQ cpu ticks 24376961 softirq cpu ticks 0 stolen cpu ticks 47630567 pages paged in 2863042186 pages paged out 1042307 pages swapped in 2022082 pages swapped out 3796748541 interrupts 24399669 CPU context switches 1414397902 boot time 14860006 forks
[-m]
显示slabinfo
[-S unit]
unit表示返回值中数字的单位
k:1000
K:1024 (默认为K)
m:1000000
M:1048576
比较:k和K
[-d]
显示磁盘数据(disk statistics)
[root@localhost ~]# vmstat -d disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectors ms total merged sectors ms cur sec ram0 0 0 0 0 0 0 0 0 0 0 ram1 0 0 0 0 0 0 0 0 0 0 ram2 0 0 0 0 0 0 0 0 0 0 ram3 0 0 0 0 0 0 0 0 0 0 ram4 0 0 0 0 0 0 0 0 0 0 ram5 0 0 0 0 0 0 0 0 0 0 ram6 0 0 0 0 0 0 0 0 0 0 ram7 0 0 0 0 0 0 0 0 0 0 ram8 0 0 0 0 0 0 0 0 0 0 ram9 0 0 0 0 0 0 0 0 0 0 ram10 0 0 0 0 0 0 0 0 0 0 ram11 0 0 0 0 0 0 0 0 0 0 ram12 0 0 0 0 0 0 0 0 0 0 ram13 0 0 0 0 0 0 0 0 0 0 ram14 0 0 0 0 0 0 0 0 0 0 ram15 0 0 0 0 0 0 0 0 0 0 cciss/c0d0 2063193 1232311 43446915 20089385 18545671 34543612 424731298 4742899 0 6714 cciss/c0d1 3460050 466721 51812099 9271428 328915899 333788431 5301510802 534921888 0 13434 md0 0 0 0 0 0 0 0 0 0 0
[ -D ]
显示磁盘统计表(disk table)
[root@localhost /]# vmstat -D 19 disks 8 partitions 5523524 total reads 1699437 merged reads 95265054 read sectors 29383985 milli reading 347485112 writes 368357613 merged writes 5726634996 written sectors 539699320 milli writing 0 inprogress IO 20151 milli spent IO
[-p]
显示磁盘分区数据(disk partition statistics )
查看磁盘分区:
[root@localhost /]# fdisk -l Disk /dev/cciss/c0d0: 146.7 GB, 146778685440 bytes 255 heads, 63 sectors/track, 17844 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/cciss/c0d0p1 * 1 522 4192933+ 83 Linux /dev/cciss/c0d0p2 523 1566 8385930 82 Linux swap / Solaris /dev/cciss/c0d0p3 1567 3132 12578895 83 Linux /dev/cciss/c0d0p4 3133 17844 118174140 5 Extended /dev/cciss/c0d0p5 3133 4176 8385898+ 83 Linux /dev/cciss/c0d0p6 4177 5220 8385898+ 83 Linux /dev/cciss/c0d0p7 5221 17844 101402248+ 83 Linux Disk /dev/cciss/c0d1: 146.7 GB, 146778685440 bytes 255 heads, 63 sectors/track, 17844 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/cciss/c0d1p1 * 1 17844 143331898+ 83 Linux
vmstat 使用: [root@localhost /]# vmstat -p /dev/cciss/c0d0p1 cciss/c0d0p1 reads read sectors writes requested writes 86632 1701410 4119989 9299028
[-V]
显示版本信息
[root@localhost ~]# vmstat -V procps version 3.2.7