vmstat介绍
#vmstat是什么?
vmstat是一个十分有用的Linux系统监控工具,使用vmstat命令可以得到关于进程、内存、内存分页、堵塞IO、traps及CPU活动的信息。
#前言
很显然从名字中我们就可以知道vmstat是一个查看虚拟内存(Virtual Memory)使用状况的工具,但是怎样通过vmstat来发现系统中的瓶颈呢?在回答这个问题前,还是让我们回顾一下Linux中关于虚拟内存相关内容。
#虚拟内存运行原理
在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。
在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。
分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。
当系统内核发现可运行内存变少时,就会通过Page-Out来释放一部分物理内存。经管Page-Out不是经常发生,但是如果Page-out频繁不断的发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能会急剧下降。这时的系统已经运行非常慢或进入暂停状态,这种状态亦被称作thrashing(颠簸)。
使用vmstat
1.用法
vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]
-a
|
显示活跃和非活跃内存
|
-f
|
显示从系统启动至今的fork数量 。
关于fork
|
-m
|
显示slabinfo 详细信息可以用cat /proc/slabinfo查看
|
-n
|
只在开始时显示一次各字段名称
|
-s
|
显示内存相关统计信息及多种系统活动数量
|
delay
|
刷新时间间隔。如果不指定,只显示一条结果
|
count
|
刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷
|
-d
|
显示磁盘相关统计信息
|
-p
|
显示指定磁盘分区统计信息
|
-S
|
使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
|
-V
|
显示vmstat版本信息
|
#基本用法
[root@study ~]# vmstat
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 4420 147896 47740 22184 6 4 14 8 1009 13 0 2 97 1 0
#显示活跃和非活跃内存
[root@study ~]# 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
0 0 4420 147896 42060 41408 6 4 14 8 1009 13 0 2 97 1 0
字段说明:
Procs(进程)
|
r: 运行队列中进程数量,在监控的时间间隔内,运行队列里等待CPU的任务(任务)的个数,即不包含vmstat进程 procs_running-1,如果长期大于1,说明cpu不足,需要增加cpu
b: 等待IO的进程数量,在监控的时间间隔内,被资源阻塞的任务数(I/0,页面调度,等等),通常情况下是接近0的 procs_blocked,比如正在等待I/O、或者内存交换等
|
Memory(内存)
|
swpd: 使用虚拟内存大小,内存切换到swap的数量,单位KB.如果swpd的值不为0,或者比较大,比如超过了100m,只要si,so的值长期为0,系统性能还是正常的.ITPUB个人空间-x} t7w%L!R9u S
free: 可用内存大小,当前的空闲页面列表中内存数量,单位KB.ITPUB个人空间ML ?+GZ
buff: 用作缓冲的内存大小,作为buffer cache的内存数量,一般对块设备的读写才需要缓冲.单位KB
cache: 用作缓存的内存大小,作为page cache的内存数量,一般作为文件系统的cache.单位KB.如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好.[ Z M3u"Lh!Nqu
inact: 非活跃内存大小(当使用-a选项时显示)
active: 活跃的内存大小(当使用-a选项时显示)
|
Swap
|
si: 每秒从交换分区写到内存的大小
so: 每秒从内存写入交换分区的大小
|
IO
|
bi: 每秒读取的块数,数据从块设备读取的量(读磁盘),单位blocks/s
bo: 每秒写入的块数,数据写入块设备的量(写磁盘),单位blocks/s. 这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析.ITPUB个人空间V-u;F‑z5s~(u
|
system
|
in: 每秒中断数,包括时钟中断,列表示在某一时间间隔中观测到的每秒设备中断数。
cs: 每秒上下文切换数,表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
|
CPU
|
us: 列显示了用户方式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。!|B5w3s7] F9~
sy: 列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
id: 列显示了cpu处在空闲状态的时间百分比
wa: 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。
|
#高级用法
[root@study ~]# vmstat -m -n
Cache Num Total Size Pages
fib6_nodes 7 113 32 113
ip6_dst_cache 8 15 256 15
ndisc_cache 2 20 192 20
RAWv6 4 11 704 11
UDPv6 0 0 640 6
tw_sock_TCPv6 0 0 128 30
request_sock_TCPv6 0 0 128 30
TCPv6 3 3 1280 3
ip_fib_alias 14 113 32 113
ip_fib_hash 14 113 32 113
jbd_1k 0 0 1024 4
bio_map_info 100 105 1052 7
dm_mpath 0 0 1052 7
avtab_node 133862 133980 16 203
jbd_4k 0 0 4096 1
dm_uevent 0 0 2460 3
dm_tio 0 0 16 203
dm_io 0 0 20 169
scsi_cmd_cache 1 12 320 12
sgpool-128 32 32 2048 2
sgpool-64 32 32 1024 4
sgpool-32 32 32 512 8
sgpool-16 32 45 256 15
sgpool-8 33 60 128 30
scsi_io_context 0 0 104 37
ext3_inode_cache 10024 10032 492 8
ext3_xattr 216 234 48 78
journal_handle 16 169 20 169
journal_head 13 144 52 72
revoke_table 4 254 12 254
revoke_record 0 0 16 203
uhci_urb_priv 1 127 28 127
UNIX 17 18 448 9
flow_cache 0 0 128 30
msi_cache 32 113 32 113
cfq_ioc_pool 24 177 64 59
cfq_pool 30 174 136 29
crq_pool 13 84 44 84
deadline_drq 0 0 44 84
as_arq 0 0 56 67
mqueue_inode_cache 1 7 576 7
isofs_inode_cache 0 0 368 10
hugetlbfs_inode_cache 1 11 340 11
ext2_inode_cache 0 0 476 8
ext2_xattr 0 0 48 78
dnotify_cache 0 0 20 169
dquot 0 0 128 30
eventpoll_pwq 0 0 36 101
eventpoll_epi 0 0 128 30
inotify_event_cache 0 0 28 127
inotify_watch_cache 1 92 40 92
kioctx 0 0 192 20
kiocb 0 0 128 30
fasync_cache 0 0 16 203
shmem_inode_cache 355 360 436 9
posix_timers_cache 0 0 88 44
uid_cache 2 59 64 59
ip_mrt_cache 0 0 128 30
tcp_bind_bucket 2 203 16 203
inet_peer_cache 1 59 64 59
secpath_cache 0 0 32 113
xfrm_dst_cache 0 0 320 12
ip_dst_cache 82 90 256 15
arp_cache 2 20 192 20
RAW 2 7 512 7
UDP 0 0 512 7
tw_sock_TCP 0 0 128 30
request_sock_TCP 0 0 128 30
TCP 1 7 1152 7
blkdev_ioc 24 381 28 127
blkdev_queue 28 28 956 4
blkdev_requests 12 23 172 23
biovec-256 7 8 3072 2
biovec-128 7 10 1536 5
biovec-64 7 10 768 5
biovec-16 7 20 192 20
biovec-4 7 59 64 59
biovec-1 8 203 16 203
bio 256 270 128 30
utrace_engine_cache 0 0 32 113
utrace_cache 0 0 32 113
sock_inode_cache 40 40 384 10
skbuff_fclone_cache 10 10 384 10
skbuff_head_cache 73 360 192 20
file_lock_cache 4 40 96 40
Acpi-Operand 3917 4048 40 92
Acpi-ParseExt 0 0 44 84
Acpi-Parse 0 0 28 127
Acpi-State 0 0 44 84
Acpi-Namespace 2855 2873 20 169
delayacct_cache 79 234 48 78
taskstats_cache 2 53 72 53
proc_inode_cache 396 396 356 11
sigqueue 0 27 144 27
radix_tree_node 3300 3304 276 14
bdev_cache 24 28 512 7
sysfs_dir_cache 5906 5928 48 78
mnt_cache 28 30 128 30
inode_cache 1483 1507 340 11
dentry_cache 15507 15515 136 29
filp 407 860 192 20
names_cache 1 1 4096 1
avc_node 503 1368 52 72
selinux_inode_security 12319 12324 48 78
key_jar 9 30 128 30
idr_layer_cache 104 116 136 29
buffer_head 12665 12672 52 72
mm_struct 41 45 448 9
vm_area_struct 1159 1196 84 46
fs_cache 40 59 64 59
files_cache 41 50 384 10
signal_cache 70 84 512 7
sighand_cache 60 60 1344 3
task_struct 66 66 1360 3
anon_vma 405 508 12 254
pgd 27 27 4096 1
pid 79 202 36 101
size-131072(DMA) 0 0 131072 1
size-131072 0 0 131072 1
size-65536(DMA) 0 0 65536 1
size-65536 1 1 65536 1
size-32768(DMA) 0 0 32768 1
size-32768 2 2 32768 1
size-16384(DMA) 0 0 16384 1
size-16384 2 2 16384 1
size-8192(DMA) 0 0 8192 1
size-8192 4 4 8192 1
size-4096(DMA) 0 0 4096 1
size-4096 81 81 4096 1
size-2048(DMA) 0 0 2048 2
size-2048 270 270 2048 2
size-1024(DMA) 0 0 1024 4
size-1024 216 216 1024 4
size-512(DMA) 0 0 512 8
size-512 345 368 512 8
size-256(DMA) 0 0 256 15
size-256 375 375 256 15
size-128(DMA) 0 0 128 30
size-128 1998 2040 128 30
size-64(DMA) 0 0 64 59
size-32(DMA) 0 0 32 113
size-64 2811 3658 64 59
size-32 80343 80343 32 113
kmem_cache 143 150 256 15
#显示指定磁盘分区统计信息 这里显示的是sda1
[root@study ~]# vmstat -p sda1
sda1 reads read sectors writes requested writes
66 1722 19 66
[root@study ~]# vmstat -s
255412 total memory
154856 used memory
70072 active memory
59820 inactive memory
100556 free memory
48816 buffer memory
67536 swap cache
522104 total swap
4420 used swap
517684 free swap
2169 non-nice user cpu ticks
5 nice user cpu ticks
12906 system cpu ticks
2928214 idle cpu ticks
16527 IO-wait cpu ticks
1148 IRQ cpu ticks
51640 softirq cpu ticks
0 stolen cpu ticks
425306 pages paged in
218953 pages paged out
39641 pages swapped in
27408 pages swapped out
30395611 interrupts
398134 CPU context switches
1334760228 boot time
7856 forks
参数 描述 /proc/stat
non-nice user cpu ticks
|
自系统启动以来,CPU在用户态下运行非nice进程的时间,单位为jiffies user
|
nice user cpu ticks
|
自系统启动以来,CPU在用户态下运行nice进程的时间,单位为jiffies nice
|
system cpu ticks
|
自系统启动以来,CPU处于系统状态的时间,单位为jiffies sys
|
idle cpu ticks
|
自系统启动以来,CPU处于闲置状态的时间,单位为jiffies idle
|
IO-wait cpu ticks
|
自系统启动以来,CPU处理IO中断的时间,单位为jiffies iowait
|
IRQ cpu ticks
|
自系统启动以来,CPU处理硬中断的时间,单位为jiffies irq
|
softirg cpu ticks
|
自系统启动以来,CPU处理软中断的时间,单位为jiffies Softirq
|
interrupts
|
自系统启动以来,发生的所有的中断的次数目 Intr
|
CPU context switches
|
自系统启动以来,发生的上下文交换的次数 Ctxt
|
boot time
|
自系统启动以来到现在运行的时间,单位为秒。 btime
|
forks
|
自系统启动以来所创建的任务的个数目。 Process
|
#显示活跃和非活跃内存信息 单位为M
[root@study ~]# vmstat -a -n -S M
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free inact active si so bi bo in cs us sy id wa st
0 0 4 98 58 68 0 0 14 7 1009 13 0 2 97 1 0
#显示活跃和非活跃内存信息 单位为k
[root@study ~]# vmstat -a -n -S k
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free inact active si so bi bo in cs us sy id wa st
0 0 4526 102969 61296 71757 5 4 14 7 1009 13 0 2 97 1 0
#显示活跃和非活跃内存信息 单位为m
[root@study ~]# vmstat -a -n -S m
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free inact active si so bi bo in cs us sy id wa st
0 0 4 102 61 71 0 0 14 7 1009 13 0 2 97 1 0
#显示活跃和非活跃内存信息 单位为K
[root@study ~]# vmstat -a -n -S K
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free inact active si so bi bo in cs us sy id wa st
0 0 4420 100556 59876 70080 5 4 14 7 1009 13 0 2 97 1 0
#显示磁盘相关统计信息
[root@study ~]# vmstat -d -n
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
sda 45667 30484 845585 7332659 16942 37976 439170 4612088 0 258
hdc 1 0 4 18 0 0 0 0 0 0
fd0 0 0 0 0 0 0 0 0 0 0
md0 0 0 0 0 0 0 0 0 0 0
loop0 0 0 0 0 0 0 0 0 0 0
loop1 0 0 0 0 0 0 0 0 0 0
loop2 0 0 0 0 0 0 0 0 0 0
loop3 0 0 0 0 0 0 0 0 0 0
loop4 0 0 0 0 0 0 0 0 0 0
loop5 0 0 0 0 0 0 0 0 0 0
loop6 0 0 0 0 0 0 0 0 0 0
loop7 0 0 0 0 0 0 0 0 0 0
#可以看出上下文交换(cs)的次数小于中断(in)的发生次数。当系统大部分时间是空闲并且中断大部分是时间中断时,这种现象极可能发生。当时间中断发生时, 因为调度器没有什么任务可调度,所以很少发生上下文切换。
[root@study ~]# vmstat 2 4
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 4420 100196 49120 67540 5 3 14 7 1009 13 0 2 97 1 0
0 0 4420 100196 49120 67540 0 0 0 0 891 10 0 1 99 0 0
0 0 4420 100196 49120 67540 0 0 0 0 891 10 0 1 99 0 0
0 0 4420 100196 49128 67532 0 0 0 14 946 14 0 1 99 0 0
这个 vmstat 的输出那些信息值得关注?
如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。
如果bi,bo 长期不等于0,表示内存不足。
procs r: 运行的进程比较多,系统很繁忙
io bo: 磁盘写的数据量稍大,如果是大文件的写,10M以内基本不用担心,如果是小文件写2M以内基本正常
cpu us: 持续大于50,服务高峰期可以接受
cpu wa: 稍微有些高
cpu id:持续小于50,服务高峰期可以接受
CPU问题现象:
1.) 如果在processes中运行的序列(process r)是连续的大于在系统中的CPU的个数表示系统现在运行比较慢,有多数的进程等待CPU.
2.) 如果r的输出数大于系统中可用CPU个数的4倍的话,则系统面临着CPU短缺的问题,或者是CPU的速率过低,系统中有多数的进程在等待CPU,造成系统中进程运行过慢.
3.) 如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us) 系统则面临着CPU资源的短缺.
解决办法:
当发生以上问题的时候请先调整应用程序对CPU的占用情况.使得应用程序能够更有效的使用CPU.同时可以考虑增加更多的CPU. 关于CPU的使用情况还可以结合mpstat, ps aux top prstat –a等等一些相应的命令来综合考虑关于具体的CPU的使用情况,和那些进程在占用大量的CPU时间.一般情况下,应用程序的问题会比较大一些.比如一些SQL语句不合理等等都会造成这样的现象.
内存问题现象:
内存的瓶颈是由scan rate (sr)来决定的.scan rate是通过每秒的始终算法来进行页扫描的.如果scan rate(sr)连续的大于每秒200页则表示可能存在内存缺陷.同样的如果page项中的pi和po这两栏表示每秒页面的调入的页数和每秒调出的页数.如果该值经常为非零值,也有可能存在内存的瓶颈,当然,如果个别的时候不为0的话,属于正常的页面调度这个是虚拟内存的主要原理.
解决办法:
1.调节applications & servers使得对内存和cache的使用更加有效.
2.增加系统的内存.
关于内存的使用情况还可以结ps aux top prstat –a等等一些相应的命令来综合考虑关于具体的内存的使用情况,和那些进程在占用大量的内存.一般情况下,如果内存的占用率比较高,但是,CPU的占用很低的时候,可以考虑是有很多的应用程序占用了内存没有释放,但是,并没有占用CPU时间,可以考虑应用程序,对于未占用CPU时间和一些后台的程序,释放内存的占用.