柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

linux性能检测之iostat详解

iostat同样也是sysstat包里面的一个工具,前面记录了内存,负载,CPU,进程等的专门检测工具,这里记录一个专门监控磁盘I/O的命令用法。

一、iostat介绍

1.1 简介

        iostat主要用于监控系统设备的IO负载情况。iostat - 报告中央处理单元(CPU)统计信息和设备和分区的输入/输出统计信息。 iostat命令用于通过观察设备的平均传输速率的时间来监控系统输入/输出设备的负载。 iostat命令生成报告可用于更改系统配置以更好地平衡物理磁盘之间的输入/输出负载。

       iostat命令生成两种类型的报告,即CPU利用率报告和设备利用率报告。


1.2 格式

iostat  [  -c  ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ] [ -j { ID | LABEL | PATH | UUID | ... } ] [ [ -T ] -g group_name ] [ -p [ device [,...] | ALL ] ] [ device [...] | ALL ] [interval [ count ] ]


博文来自:www.51niux.com

1.3 选项

-c : 显示CPU利用率报告。

-d : 显示设备利用率报告。

-g group_name { device [...] | ALL }: 显示一组设备的统计信息。 iostat命令报告列表中每个单独设备的统计信息,然后显示为group_name的组的全局统计信息列表中的所有设备。 ALL关键词意味着系统定义的所有块设备都应包含在组中。
-h : 使设备利用率报告更容易被人阅读。

-j { ID | LABEL | PATH | UUID | ... } [ device [...] | ALL ]:显示持久的设备名称。选项ID,LABEL等指定持久名称的类型。这些选项不受限制,只有具有所需持久性名称的目录是必需的存在于/ dev / disk中。可选地,可以在所选择的持久名称类型中指定多个设备。由于持久设备名称通常很长,因此选项-h将被隐式启用选项。

-k : 显示每秒千字节的统计信息。

-m : 以兆字节/秒显示统计信息。

-N : 显示任何设备映射器设备的注册设备映射器名称。用于查看LVM2统计信息。

-p [ { device [,...] | ALL } :   -p选项显示块设备及系统使用的所有分区的统计信息。如果在命令行上输入了设备名称,那么它的统计信息及其所有parti-显示。最后,ALL关键字表示必须为系统定义的所有块设备和分区显示统计信息,包括从未使用的块设备和分区。如果在此选项之前定义选项-j,可以使用所选的持久名称类型指定在命令行中输入的设备。

-T : 此选项必须与选项-g一起使用,并指示仅显示组的全局统计信息,而不显示组中各个设备的统计信息。
-t : 打印显示的每个报告的时间。时间戳格式可能取决于S_TIME_FORMAT环境变量的值.

-V:打印版本号,然后退出。
-x : 显示扩展统计信息。

-y:如果以给定的间隔显示多条记录,则自系统引导后省略具有统计信息的第一个报告。

-z:告诉iostat在采样期间为任何没有活动的设备省略输出。

文件:
/ proc/stat 包含系统统计信息。
/ proc/uptime 包含系统正常运行时间。
/ proc/diskstats 包含磁盘统计信息。
/sys 包含块设备的统计信息。
/proc/self/mountstats 包含网络文件系统的统计信息。
/dev/disk  包含持久的设备名称。


博文来自:www.51niux.com

二、示例

2.1 默认显示

# iostat  #默认生成CPU利用率报告和磁盘I/O报告(就是iostat -c 和iostat -dk的合体)
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain)     03/27/17     _x86_64_    (12 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle  #CPU利用率报告iostat命令生成的第一个报告是CPU利用率报告。对于多处理器系统,CPU值是所有处理器之间的全局平均值         

                  0.73    0.00    0.16    0.00    0.00   99.10

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn   #设备利用率报告, iostat命令生成的第二个报告是设备利用率报告。设备报告提供每个物理设备或分区的统计信息。阻止设备和分区
哪些统计信息可以在命令行中输入。如果没有输入设备和分区,则会显示系统使用的每个设备的统计信息,并提供该信息内核维护它的统计信息。如果在命令行中给出了ALL关键字,则会显示系统定义的每个设备的统计信息,包括从未定义的设备用过的。默认情况下,传输速率显示为1K块,除非设置了环境变量POSIXLY_CORRECT,在这种情况下使用512字节块。

sda               3.27         3.19         7.47    1315464    3076288
dm-0              3.24         3.18         7.46    1308406    3074240
sdi               0.00         0.00         0.00        520          0
sdb               0.35         0.03        11.00      13919    4528941
# %user:  显示在用户级(应用程序)执行时执行的CPU利用率的百分比。

#%nice:  显示在优先级高的用户级别执行时CPU利用率的百分比。

# %system:  显示在系统级(内核)执行时发生的CPU利用率百分比。

#%iowait: 显示CPU或CPU空闲时间的百分比,在此期间系统有一个未完成的磁盘I / O请求。

#%steal : 显示管理程序正在维护另一个虚拟处理器时虚拟CPU或CPU在非自愿等待中花费的时间百分比。

#%idle:显示CPU或CPU空闲时间的百分比,并且系统没有未完成的磁盘I / O请求。

#Device: 此列给出/ dev目录中列出的设备(或分区)名称。

#tps : 指示发送到设备的每秒传输次数。 传输是对设备的I / O请求。 多个逻辑请求可以组合成单个I / O请求装置。 传输的大小不确定。

#kB_read/s : 指示以每秒多个块(千字节,兆字节)表示的从设备读取的数据量。块数量相当于扇区数量的一半,因为扇区大小为512字节。因为块的大小为1024byte,这里是块的数量,显示单位最小是千字节。1024byte*1024=1KB,所以这里最小单位又代表的是KB,所以这里的3.19就相当于3.19KB,也就是每秒读取3.19K。

#kB_wrtn/s : 指示以每秒多个块(千字节,兆字节)往设备写入的数据量。同理这里就是每秒写入7.47KB。

#kB_read : 读取的总块数(千字节,兆字节)。

#kB_wrtn : 写入的总块数(千字节,兆字节)。

#iostat -dN 1 200 #如果实时滚动起来的话,kB_read/s =kB_read,kB_wrtn/s=kB_wrtn,就看kB_read/s(MB_read/s)和kB_wrtn/s(MB_wrtn/s)就行了。当然第一次报告还是iostat 的内容,后面的199次才是实时的内容。

# iostat -dNy 1 200  #在加上-y参数,第一次的报告就不会打印了,省略具有统计信息的第一个报告,就会直接显示实时的信息。


2.2 -g的用法

#iostat -g kvm_data {sdb,sdc,sdd}  #这里创建了一个kvm_data组,后面{}将要汇总的设备用逗号隔开,然后就会显示设备的各自信息以及设备组的汇总信息。
Linux 3.10.0-123.el7.x86_64 (localhost.localdomain)       2017年03月27日  _x86_64_        (24 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.42    0.00    0.96    0.00    0.00   97.62

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sdb               0.25         0.15         3.04    1564511   32030442
sdc               0.00         0.00         0.00       4269        196
sdd               0.60         0.03         6.76     367339   71222003
 kvm_data         0.85         0.18         9.80    1936119  103252641

# iostat  -g kvm_data ALL  #就是显示所有设备I/O的汇总信息,iostat 9版本不具备这种功能

# iostat -T -g kvm_data {sdb,sdc,sdd}  #-T和-g是混合到一起使用的,这样只会显示kvm_data的统计信息,也就是只显示汇总信息,而不显示分设备的信息。

#iostat -T -g kvm_data {sdb,sdc,sdd}
Linux 3.10.0-123.el7.x86_64 (localhost.localdomain)       2017年03月27日  _x86_64_        (24 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.42    0.00    0.96    0.00    0.00   97.61

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
 kvm_data         0.85         0.18         9.79    1936183  103291473


3. -j的用法

# iostat  -j PATH  sda  #-j 指定PATH 参数,后面跟sda盘符,就可以显示sda的pci名称,如果要查看UUID就将PATH变为UUID
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain)     03/27/17     _x86_64_    (12 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.73    0.00    0.16    0.00    0.00   99.10

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
pci-0000:03:00.0-scsi-0:2:0:0
                  3.27         3.17         7.48    1315464    3099720

# iostat  -j PATH  ALL  #就是将所有设备的pci名称都显示出来,注意PATH,UUID等只能用一种,不能同时使用。


4. -N、-m和-x的用法

# iostat  -dxNm 1 2 #-N主要用来显示lvm2的统计信息,-m是将输出单位从KB变为MB,-x是显示扩展信息,1是1秒刷新一次,2是一共刷新2次.
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain)     03/27/17     _x86_64_    (12 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.02    0.09    3.18     0.00     0.01     6.51     0.00    0.32    6.07    0.15   0.12   0.04
centos-root       0.00     0.00    0.09    3.15     0.00     0.01     6.56     0.00    0.32    6.17    0.15   0.13   0.04
sdi               0.00     0.00    0.00    0.00     0.00     0.00    13.33     0.00    0.71    0.72    0.00   0.71   0.00
sdb               0.00     1.01    0.01    0.34     0.00     0.01    63.26     0.01   24.95    6.39   25.29   0.31   0.01

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00   12.00     0.00     0.03     4.67     0.00    0.08    0.00    0.08   0.08   0.10
centos-root       0.00     0.00    0.00   12.00     0.00     0.03     4.67     0.00    0.00    0.00    0.00   0.00   0.00
sdi               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

#rrqm/s :  每秒排队等待到设备的读取请求的数量。

#wrqm/s : 每秒排队等待到设备的写入请求数。

#r/s : 对于设备,每秒完成的读请求数(合并后)。

#w/s : 对于设备,每秒完成的写请求数(合并后)。

#rMB/s ( rkB/s): 从设备每秒读取的数据量,这里是兆字节(默认是千字节)。

#wMB/s(wkB/s) : 设备每秒写入的数据量,这里是兆字节(默认是千字节)。

#avgrq-sz:发给设备的请求的平均大小(以扇区为单位)。

#avgqu-sz:发送到设备的请求的平均队列长度。

#await : 发给设备的I/O请求的平均时间(以毫秒为单位)。这包括请求在队列中花费的时间以及为维护请求所花费的时间。

#r_await : 发送到要投放的设备的读取请求的平均时间(以毫秒为单位)。这包括请求在队列中花费的时间以及为维护请求所花费的时间。

#w_await : 发送到要投放的设备的写请求的平均时间(以毫秒为单位)。这包括请求在队列中花费的时间以及为维护请求所花费的时间。

#svctm: 发送到设备的I/O请求的平均服务时间(以毫秒为单位)。警告!不要再相信这个领域了。此字段将在未来的sysstat版本中被删除。

#%util : 向设备发出I/O请求所耗费的时间百分比(设备的带宽利用率)。当该值接近100%时说明设备读写已经到了瓶颈了。

注意:

如果不加-m参数,显示的是扇区数而没有rMB/s和wMB/s。 rsec/s:表示扇区数(读),wsec/s:表示扇区数(写)。


博文来自:www.51niux.com

5.-t的用法

# iostat  -dmt 1 3  #加上-t就是在每段的输出头部打印时间
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain)     03/27/17     _x86_64_    (12 CPU)

03/27/17 15:17:02
Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda               3.27         0.00         0.01       1284       3127
dm-0              3.23         0.00         0.01       1277       3125
sdi               0.00         0.00         0.00          0          0
sdb               0.34         0.00         0.01         13       4422

03/27/17 15:17:03
Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda              11.00         0.00         0.01          0          0
dm-0             11.00         0.00         0.01          0          0
sdi               0.00         0.00         0.00          0          0
sdb               0.00         0.00         0.00          0          0

03/27/17 15:17:04
Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda               0.00         0.00         0.00          0          0
dm-0              0.00         0.00         0.00          0          0
sdi               0.00         0.00         0.00          0          0
sdb               0.00         0.00         0.00          0          0


6.-z和-d的用法

如果你要查看的机器是一个宿主机,上面可能有24块盘,如果你只想查看活动的盘,因为iostat默认是将所有的设备都打印出来嘛,不管其有没有读写情况。那么就可能采取管道grep的形式了。

#iostat  -dNzy 1 10  #-z的用途就是将那些没有活动的设备不打印出来,这样我们就会只显示有I/O读写的设备了。
Linux 3.10.0-123.el7.x86_64 (localhost.localdomain)       2017年03月27日  _x86_64_        (24 CPU)

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn  #从设备上面看,已经不是连续的了,只将有活动的设备I/O情况打印了出来
sdm               3.00         0.00        12.00          0         12
sdn               5.00         0.00        48.00          0         48


上面我们也使用了-d,但是使用的是-d的默认参数,就是将所有的磁盘设备都打印出来而不去打印CPU的统计信息,如果我们想打印指定设备的I/O情况呢?

# iostat -dx {sda,sdb} 1 2  #多个磁盘设备{设备1,设备2},后面是1秒刷新一次,刷新两次。这里我们是打印盘符sda和sdb的磁盘统计信息。
Linux 3.10.0-514.6.1.el7.x86_64 (localhost.localdomain)     03/27/17     _x86_64_    (12 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.02    0.09    3.18     3.06     7.47     6.45     0.00    0.31    6.07    0.15   0.12   0.04
sdb               0.00     0.97    0.01    0.33     0.03    10.55    63.26     0.01   24.95    6.39   25.29   0.31   0.01

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00


#上面这个命令还是很有用的,比如我们要测试两台机器一个做了lvm一个没有做,他们之间的IO读写影响呢?主要是针对多盘,比如12快盘或者24快盘的时候,肯定好多不活动的盘符我们就不希望显示了。

两台机器同时执行:#iostat -m -dx sd{b,c,d,e,f,g,h,i,j} 1 100

blob.png

#如上图这样查看是不是更清晰一点呢,上面是做了lvm的,下面是没有做lvm单盘挂载的存储服务器。

作者:忙碌的柴少 分类:linux性能检测工具 浏览:1746 评论:0
留言列表
发表评论
来宾的头像