Linux-使用vmstat和iostat/iotop命令进行Linux性能监控
vmstat和iostat两个命令都适用于所有主要的类unix系统(Linux/unix/FreeBSD/Solaris)。
磁盘IO是服务器性能的一个重要指标,下面介绍两个常用的观察IO的命令,iostat我一般用来查看磁盘的IO,以及在测试磁盘时做一个监控工具,iotop在排查服务器问题时,可以用来找到某些异常程序!下面都会做一个简要的介绍!
博文中使用的操作系统为:
[xgj@entel2 ~]$ cat /etc/redhat-release
CentOS release 6.5 (Final)
[xgj@entel2 ~]$
在Linux系统中安装sysstat
如果vmstat和iostat命令在你的系统中不可用,请安装sysstat软件包。vmstat,sar和iostat命令都包含在sysstat(系统监控工具)软件包中。iostat命令生成CPU和所有设备的统计信息。你可以从http://sebastien.godard.pagesperso-orange.fr/download.html下载源代码包编译安装sysstat,但是我们建议通过YUM命令进行安装。
#yum -y install sysstat
- vmstat - 内存,进程和分页等的简要信息。
- iostat - CPU统计信息,设备和分区的输入/输出统计信息。
Linux下vmstat命令的6个范例
1. 列出活动和非活动的内存
如下范例中输出6列。vmstat的man页面中解析的每一列的意义。最重要的是内存中的free属性和交换分区中的si和so属性。
[xgj@entel2 ~]$ 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 1 5560648 432300 60687632 69192544 0 0 16 24 0 0 1 1 98 1 0
[xgj@entel2 ~]$
- Free – 空闲的内存空间
- si – 每秒从磁盘中交换进内存的数据量(以KB为单位)。
- so – 每秒从内存中交换出磁盘的数据量(以KB为单位)。
注意:如果你不带参数的执行vmstat命令,它会输出自系统启动以来的总结报告。
2. 每X秒执行vmstat,共执行N次
下面命令将会每2秒中执行一次vmstat,执行6次后自动停止执行。
[xgj@entel2 ~]$ 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
2 1 5596576 396640 1747456 113387648 0 0 16 24 0 0 1 1 98 1 0
0 1 5598864 385620 1747464 113398368 0 1144 10956 11130 13465 24846 1 1 94 4 0
0 1 5599376 412456 1747480 113369968 0 256 9040 8690 13822 24798 1 1 94 4 0
0 1 5599772 422664 1747480 113359576 0 198 10252 9540 13831 24521 1 1 94 4 0
1 0 5599772 386808 1747504 113400336 0 0 10760 9584 13634 24454 1 1 94 4 0
0 1 5599976 377404 1747504 113408784 0 102 10252 9982 13895 24758 2 1 94 4 0
[xgj@entel2 ~]$
3. 带时间戳的vmstat命令
带-t参数执行vmstat命令,该命令将会在每一行输出后都带一个时间戳,如下所示。
[xgj@entel2 ~]$ vmstat -t 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 5606336 441880 1747820 113351312 0 0 16 24 0 0 1 1 98 1 0 2017-01-19 19:37:01 BOT
2 1 5606336 420764 1747820 113373088 0 0 11144 10248 13626 24692 1 1 94 4 0 2017-01-19 19:37:02 BOT
1 1 5606332 394668 1747836 113394960 32 0 11700 10752 14271 25457 2 1 93 4 0 2017-01-19 19:37:03 BOT
[xgj@entel2 ~]$
4. 统计各种计数器
vmstat命令的-s参数,将输出各种事件计数器和内存的统计信息。
[xgj@entel2 ~]$ vmstat -s
132223776 total memory
131831080 used memory
69132688 active memory
60717320 inactive memory
392696 free memory
1748412 buffer memory
113362880 swap cache
16777212 total swap
5624704 used swap
11152508 free swap
124326607 non-nice user cpu ticks
11823 nice user cpu ticks
94812107 system cpu ticks
17320027017 idle cpu ticks
127489886 IO-wait cpu ticks
327 IRQ cpu ticks
1298224 softirq cpu ticks
0 stolen cpu ticks
2848730960 pages paged in
4254100177 pages paged out
287406 pages swapped in
1893055 pages swapped out
3780708913 interrupts
737819991 CPU context switches
1477424738 boot time
51132198 forks
[xgj@entel2 ~]$
5. 磁盘统计信息
vmstat的-d参数将会输出所有磁盘的统计信息。
[xgj@entel2 ~]$ 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
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
sdb 22221426 22382 5487009964 44045589 45506192 152270 4023259784 401825121 0 111140
sda 5793066 784038 211341364 38795413 208224442 81100325 4485833433 1269735263 0 715938
dm-0 31239 0 630834 147239 57173 0 3474960 3407531 0 345
dm-1 288499 0 2307992 2150847 1894999 0 15159944 124189941 0 1598
dm-2 29840 0 1503610 145689 2668937 0 71531824 81253517 0 11178
dm-3 1011 0 8082 1904 69 0 464 685 0 1
dm-4 5306 0 42442 7200 2696005 0 31951584 42201059 0 21685
dm-5 1020 0 8154 2128 1324 0 12168 19261 0 8
dm-6 229541 0 3241218 659663 98793 0 790712 7317801 0 348
dm-7 220706 0 4067906 741873 6904210 0 76988648 149072927 0 42371
dm-8 918 0 7338 1650 30 0 152 275 0 1
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
dm-9 6466 0 740538 16764 11926 0 95712 186257 0 109
dm-10 24533644 0 5508246266 59711348 131753441 0 5139101144 3639924222 0 517566
dm-11 3018872 0 173300066 36321168 134949598 0 3174908528 3964229623 0 334654
[xgj@entel2 ~]$
6. 以MB为单位输出统计信息
vmstat的-S和-M参数(大写和MB)将会以MB为单位输出。vmstat默认以KB为单位输出统计信息。
[xgj@entel2 ~]$ vmstat -S M 1 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 1 5503 403 1725 110653 0 0 16 24 0 0 1 1 98 1 0
2 1 5503 398 1725 110659 0 0 3088 5012 13901 25028 1 1 94 4 0
0 1 5503 391 1725 110665 0 0 3600 4800 13976 24952 1 1 94 4 0
0 2 5503 385 1725 110672 0 0 3080 4272 13583 24804 1 1 94 4 0
0 1 5503 378 1726 110679 0 0 3600 4940 14160 25357 1 0 94 4 0
[xgj@entel2 ~]$ free -m
total used free shared buffers cached
Mem: 129124 128713 411 0 1728 110639
-/+ buffers/cache: 16345 112779
Swap: 16383 5503 10880
[xgj@entel2 ~]$
linux下的iostat命令的6个范例
常用-x和-d选项
iostat是一个统计设备IO和和CPU的工具。最常用的是-x和-d选项
一般我们需要持续观察IO状况:
[xgj@entel2 ~]$ iostat -x 1 2
每1秒钟显示一次报告,显示两次
man中文手册
1.直接执行iostat不接参数,是指系统从启动到现在为止的统计数据。
2.间隔参数代表每次报告的间隔时间,同样第一条是系统从启动到现在为止的统计数据,后续的每条都是iostat执行间隔时间内的统计数据。
3.iostat创建3种类型报告,cpu使用率,设备使用率,网络文件系统报告。
4.cpu使用率报告:
(1).%user:用户态所占用的CPU使用率百分比(应用程序)。
(2).%nice:用户态执行nice优先级所占用的CPU使用率百分比。
(3).%system:内核态所占用的CPU使用率百分比(内核)
(4).%iowait:CPU处于idle状态等待磁盘IO请求所占用的百分比。
(5).%steal:当hypervisor服务另一个(虚拟)CPU时,(虚拟)CPU强制等待的时间占比。
(6).%idle:没有磁盘请求时,CPU的空闲时间占比。
5.设备使用率报告:
(1).Device:监测的设备或分区名称
(2).tps:代表每秒的传输数(transfer),传输数可以是单个的IO请求或合并多个逻辑请求到单个IO请求。
(3).Blk_read/s:每秒读取的block数,block相当于扇区的大小,即512字节。旧内核可能不确定。
(4).Blk_wrtn/s:每秒写入的block数。
(5).Blk_read:总读取的block数。
(6).Blk_wrtn:总写入的block数。
(7).kB_read/s kB_wrtn/s kB_read kB_wrtn MB_read/s MB_wrtn/s MB_read MB_wrtn: 同上,只是单位不同
(8).rrqm/s:每秒合并的读请求数。
(9).wrqm/s:每秒合并的写请求数。
(10).r/s:每秒读请求数。
(11).w/s:每秒写请求数。
(12).rsec/s:每秒的读扇区数。
(13).wsec/s:每秒的写扇区数。
(14).rkB/s:每秒读的kB数。
(15).wkB/s:每秒写的kB数。
(16).rMB/s:每秒读的MB数。
(17).wMB/s:每秒写的MB数。
(18).avgrq-sz:平均请求的大小(扇区)。
(19).avgqu-sz:平均队列长度。
(20).await:IO请求发送给设备和设备执行请求的时间(毫秒)。
(21).svctm:设备执行请求的时间(毫秒),此项不准,不可信。
(22).%util:I/O请求发送到设备期间,占用CPU时间的百分比。
监测NFS的统计数据 iostat -n 1
6.网络文件系统(NFS)报告
显示每个挂载的网络文件系统统计数据
(1).Filesystem:挂载的NFS服务器的主机名和目录
(2).rBlk_nor/s:使用read(2)系统调用接口读取的block数,block大小是512byte。
(3).wBlk_nor/s:使用write(2)系统调用接口写入的block数,block大小是512byte。
(4).rBlk_dir/s:使用O_DIRECT标志位读取的block数。
(5).wBlk_dir/s:使用O_DIRECT标志位写入的block数。
(6).rBlk_svr/s:NFS客户端通过NFS读请求从服务端读取的block数。
(7).wBlk_svr/s:NFS客户端通过NFS写请求往服务端写入的block数。
(8).rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s rMB_nor/s wMB_nor/s rMB_dir/s wMB_dir/s rMB_svr/s wMB_svr/s,同上,单位不同而已
(9).ops/s:每秒到文件系统的总操作数
(10).rops/s:每秒到文件系统的读操作数
(11).wops/s:每秒到文件系统的写操作数
选项:
-c 显示CPU使用率报告。
-d 显示设备使用率报告。
-h 使-n的NFS报告对人更易读。
-k 使统计数据以KB来表示,而不是扇区。
-m 使统计数据以MB来表示,而不是扇区。
-N 显示注册的设备映射名字,在使用逻辑卷LVM2时很好用。
-n 显示网络文件系统报告
-p [ { device [,…] | ALL } ] 后面接要监测的设备,例如sda
-t 显示时间戳,时间戳的格式受 S_TIME_FORMAT 环境变量影响。
-V 显示版本号然后退出
-x 显示扩展的统计数据,需要/proc/diskstats,挂载的sysfs,/proc/partitions等支持。
-z 如果统计时间内没有活动,iostat就不输出
环境
iostat命令会受以下环境变量影响
S_TIME_FORMAT 如果这个环境变量存在,会影响iostat的时间戳格式,遵循ISO 8601格式
例子
iostat 显示自启动以来的CPU和设备的报告。
iostat -d 2 每2秒间隔持续显示报告
iostat -d 2 6 每2秒间隔持续显示报告,显示6次
iostat -x hda hdb 2 6 为hda和hdb显示报告,每2秒间隔,显示6次
iostat -p sda 2 6 为sda及子分区显示报告,每2秒间隔,显示6次
BUGS
/proc 文件系统必须以挂载,iostat依赖它。扩展的统计数据只对2.5以上的内核可用。
svctm已经没有意义,由于I/O统计是通过block层计算出来的,我们并不知道磁盘驱动器什么时候开始处理一个请求。
因此,下一个版本将删除svctm这项。
文件
/proc/stat 包含系统统计数据
/proc/uptime 包含系统uptime.
/proc/partitions 包含磁盘统计数据,2.5内核支持
/proc/diskstats 包含磁盘统计数据,2.5内核支持
/sys contains 块设备的统计数据 (post 2.5 kernels).
/proc/self/mountstats 包含网络文件系统统计数据
1. 输出CPU和输入/输出(I/O)的统计信息
不带参数的iostat命令将会输出CPU和每个分区的输出/输出的统计信息,如下所示。
2. 只输出CPU的统计信息
iostat命令的-c参数仅输出CPU的统计信息,如下所示。
[xgj@entel2 ~]$ iostat -c
Linux 3.10.5-3.el6.x86_64 (entel2) 01/19/2017 _x86_64_ (24 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.70 0.00 0.54 0.72 0.00 98.03
[xgj@entel2 ~]$
3. 只输出磁盘的输入/输出统计信息
iostat命令的-d参数仅输出磁盘的所有分区的输入/输出的统计信息,如下所示。
4. 只输出某个磁盘的输入/输出统计信息
在默认情况下iostat命令会输出所有分区的统计信息,但是若在iostat命令后加上-p参数和磁盘设备名,该命令将会仅输出列出的磁盘的输入/输出统计信息,如下所示。
5. 输出逻辑卷管理(LVM)的统计信息
iostat命令的-N(大写)参数将会输出LVM(LVM是linux环境下对磁盘分区进行管理的一种机制,是磁盘分区和文件系统间的一个逻辑层)的统计信息,如下所示。
6. iostat版本信息
iostat的-V(大写)参数将会输出iostat的版本信息,如下所示。
[xgj@entel2 ~]$ iostat -V
sysstat version 9.0.4
(C) Sebastien Godard (sysstat <at> orange.fr)
[xgj@entel2 ~]$
iotop
官网:http://guichaz.free.fr/iotop/
需要用root用户执行
在某些场景下,我们需要找到占用IO特别大的进程,然后关闭它,需要知道PID或者进程名称,这就需要用到iotop。iotop是一个检测Linux系统进程IO的工具,界面类似top,如下图。
[xgj@entel2 ~]$ iotop
Netlink error: Operation not permitted (1)
The Linux kernel interfaces that iotop relies on now require root privileges
or the NET_ADMIN capability. This change occurred because a security issue
(CVE-2011-2494) was found that allows leakage of sensitive data across user
boundaries. If you require the ability to run iotop as a non-root user, please
configure sudo to allow you to run iotop as root.
Please do not file bugs on iotop about this.
[xgj@entel2 ~]$ sudo iotop
iotop和top一样,也可以通过键入相应键,触发排序选项,例如按o可以在IO活动进程和所有进程之间切换。可以通过左右箭头,选择响应的列进行数据排序。
手册:
名称
iotop - 简单的top类I/O监视器 总览
iotop [OPTIONS] 描述
iotop根据Linux内核(需要2.6.20及以上)来监测I/O,并且能显示当前进程/线程的I/O使用率。
Linux内核build的时候,需要开启CONFIG_TASK_DELAY_ACCT和CONFIG_TASK_IO_ACCOUNTING选项,这些选项依赖于CONFIG_TASKSTATS。
在采样周期里,iotop按列显示每个进程/线程的I/O读写带宽,同时也显示进程/线程做swap交换和等待I/O所占用的百分比。
每一个进程都会显示I/O优先级(class/level),另外在最上面显示每个采样周期内的读写带宽。
使用左右箭头来改变排序,r用来改变排序顺序,o用来触发–only选项,p用来触发–processes选项。
a用来触发–accumulated选项,q用来退出,i用来改变进程或线程的监测优先级,其它任继健是强制刷新。选项
–version 显示版本号然后退出
-h, –help 显示帮助然后退出
-o, –only 只显示正在产生I/O的进程或线程。除了传参,可以在运行过程中按o生效。
-b, –batch 非交互模式,一般用来记录日志
-n NUM, –iter=NUM 设置监测的次数,默认无限。在非交互模式下很有用
-d SEC, –delay=SEC 设置每次监测的间隔,默认1秒,接受非整形数据例如1.1
-p PID, –pid=PID 指定监测的进程/线程
-u USER, –user=USER 指定监测某个用户产生的I/O
-P, –processes 仅显示进程,默认iotop显示所有线程
-a, –accumulated 显示累积的I/O,而不是带宽
-k, –kilobytes 使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用。
-t, –time 加上时间戳,非交互非模式。
-q, –quiet 禁止头几行,非交互模式。有三种指定方式。
-q 只在第一次监测时显示列名
-qq 永远不显示列名。
-qqq 永远不显示I/O汇总