| 
1 |  | -iostat  | 
2 |  | -===  | 
 | 1 | +# iostat  | 
3 | 2 | 
 
  | 
4 |  | -监视系统输入输出设备和CPU的使用情况  | 
 | 3 | +iostat命令被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。  | 
 | 4 | +iowait 指在一个采样周期内有百分之几的时间是属于以下情况:CPU处于空闲状态并且至少有一个未完成的磁盘IO请求。  | 
5 | 5 | 
 
  | 
6 |  | -## 补充说明  | 
 | 6 | +## 安装 iostat  | 
7 | 7 | 
 
  | 
8 |  | -**iostat命令** 被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。  | 
 | 8 | +iostat包含在**sysstat**包内。如果你没有,你首先需要安装它。  | 
 | 9 | +在 RedHat / CentOS / Fedora  | 
9 | 10 | 
 
  | 
10 |  | -###  语法  | 
 | 11 | +```bash  | 
 | 12 | +yum install sysstat   | 
 | 13 | +```  | 
 | 14 | + | 
 | 15 | +在 Debian / Ubuntu / Linux Mint  | 
 | 16 | + | 
 | 17 | +```bash  | 
 | 18 | +sudo apt-get install sysstat  | 
 | 19 | +```  | 
11 | 20 | 
 
  | 
12 |  | -```shell  | 
 | 21 | +## 语法  | 
 | 22 | + | 
 | 23 | +```bash  | 
13 | 24 | iostat(选项)(参数)  | 
14 | 25 | ```  | 
15 | 26 | 
 
  | 
16 |  | -###  选项  | 
17 |  | - | 
18 |  | -```shell  | 
19 |  | --c:仅显示CPU使用情况;  | 
20 |  | --d:仅显示设备利用率;  | 
21 |  | --k:显示状态以千字节每秒为单位,而不使用块每秒;  | 
22 |  | --m:显示状态以兆字节每秒为单位;  | 
23 |  | --p:仅显示块设备和所有被使用的其他分区的状态;  | 
24 |  | --t:显示每个报告产生时的时间;  | 
25 |  | --V:显示版号并退出;  | 
26 |  | --x:显示扩展状态。  | 
 | 27 | +### 选项  | 
 | 28 | + | 
 | 29 | +```bash  | 
 | 30 | +# iostat --help  | 
 | 31 | +Usage: iostat [ options ] [ <interval> [ <count> ] ]  | 
 | 32 | +Options are:  | 
 | 33 | +[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -s ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]  | 
 | 34 | +[ -j { ID | LABEL | PATH | UUID | ... } ] [ --human ] [ -o JSON ]  | 
 | 35 | +[ [ -H ] -g <group_name> ] [ -p [ <device> [,...] | ALL ] ]  | 
 | 36 | +```  | 
 | 37 | +
  | 
 | 38 | +参数说明:  | 
 | 39 | +```  | 
 | 40 | +-c         输出CPU统计信息。不能与-d参数同时使用。  | 
 | 41 | +-d         输出设备和分区的I/O统计信息。不能与-c参数同时使用。(默认的参数是-d)。  | 
 | 42 | +-h         让人类更容易阅读设备使用情况报告。--human使用此选项隐式启用。  | 
 | 43 | +-k         用“kbytes/秒”代替“块/秒”显示统计信息。  | 
 | 44 | +-m         用“mbytes/秒”代替“块/秒”显示统计信息。  | 
 | 45 | +-t         打印显示的每份报告的时间。  | 
 | 46 | +-V         显示版本号并退出。  | 
 | 47 | +-x         显示扩展统计信息。不能与参数-p同时使用。  | 
 | 48 | +-y         如果在给定时间间隔内显示多条记录,则省略自系统启动以来的第一份统计报告。  | 
 | 49 | +-z         告诉 iostat 忽略在样本期间没有活动的设备的输出。  | 
 | 50 | +-j         显示持久的设备名称。选项ID、LABEL等指定持久名称的类型。  | 
 | 51 | +--human    以人类可读格式打印大小(例如1.0k, 1.2M等)。使用此选项显示的单位取代与度量相关的任何其他默认单位(例如千字节,扇区…)。  | 
 | 52 | +-o         以JSON (Javascript Object Notation)格式显示统计数据。JSON输出字段顺序未定义,未来可能会添加新字段。  | 
 | 53 | +-H         该选项必须与-g一起使用,表示只显示组的全局统计信息,而不显示组中单个设备的统计信息。  | 
 | 54 | +-p         选项显示系统使用的块设备及其所有分区的统计信息。如果在命令行中输入一个设备名,那么将显示该设备及其所有分区的统计信息。最后,ALL关键字表示必须显示系统定义的所有块设备和分区的统计信息,包括那些从未使用过的设备和分区。如果在此选项之前定义了选项-j,则可以使用所选的持久名称类型指定在命令行上输入的设备。  | 
 | 55 | +```  | 
 | 56 | +
  | 
 | 57 | +### 参数  | 
 | 58 | +
  | 
 | 59 | +interval 刷新时间间隔  | 
 | 60 | +count 刷新次数  | 
 | 61 | +
  | 
 | 62 | +## 运行示例  | 
 | 63 | +
  | 
 | 64 | +### 示例1  | 
 | 65 | +
  | 
 | 66 | +```bash  | 
 | 67 | +# iostat  | 
 | 68 | +Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 	08/28/2024 	_x86_64_	(2 CPU)  | 
 | 69 | + | 
 | 70 | +avg-cpu:  %user   %nice %system %iowait  %steal   %idle  | 
 | 71 | +           3.30    0.01    1.90    0.12    0.00   94.68  | 
 | 72 | + | 
 | 73 | +Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn  | 
 | 74 | +vda               7.85        84.22        36.59 1081853831  470049100  | 
 | 75 | + | 
27 | 76 | ```  | 
28 | 77 | 
  | 
29 |  | -###  参数  | 
 | 78 | +第一部分包含了CPU报告  | 
 | 79 | +
  | 
 | 80 | +| 性能指标 | 含义 |  | 
 | 81 | +| --- | --- |  | 
 | 82 | +| %user | 显示在用户级(应用程序)执行时发生的CPU利用率百分比。 |  | 
 | 83 | +| %nice  | 显示在具有nice优先级的用户级别执行时发生的CPU利用率百分比。 |  | 
 | 84 | +| %system | 显示在系统级(内核)执行时发生的CPU利用率百分比。 |  | 
 | 85 | +| %iowait | 显示在系统有未完成的磁盘I/O请求期间CPU空闲的时间百分比。 |  | 
 | 86 | +| %steal | 显示虚拟机监控程序为另一个虚拟处理器提供服务时,一个或多个虚拟CPU在非自愿等待上花费的时间百分比。 |  | 
 | 87 | +| %idle | 显示CPU空闲且系统没有未完成的磁盘I/O请求的时间百分比。 |  | 
 | 88 | +
  | 
 | 89 | +第二部分包含了设备利用率报告  | 
 | 90 | +
  | 
 | 91 | +| 性能指标 | 含义 |  | 
 | 92 | +| --- | --- |  | 
 | 93 | +| Device | 此列给出了 /dev 目录中列出的设备(或分区)名称。 |  | 
 | 94 | +| tps | 表示每秒向设备发出的传输次数。传输是对设备的 I/O 请求。多个逻辑请求可合并为对设备的一个 I/O 请求。传输大小不确定。 |  | 
 | 95 | +| kB_read/s | 表示每秒从设备读取的数据量,以块数(千字节、兆字节)表示。块相当于扇区,因此大小为 512 字节。 |  | 
 | 96 | +| kB_wrtn/s | 表示写入设备的数据量,以每秒块数(千字节、兆字节)表示。 |  | 
 | 97 | +| kB_read | 读取的数据块总数(千字节、兆字节)。 |  | 
 | 98 | +| kB_wrtn | 写入的数据块总数(千字节、兆字节)。 |  | 
 | 99 | +
  | 
 | 100 | +### 示例2  | 
 | 101 | +
  | 
 | 102 | +以更友好的显示方式显示 IO 信息,使用`-y`忽略第一份统计。并每隔 1 秒重新一次,共5次。  | 
30 | 103 | 
  | 
31 |  | -*   间隔时间:每次报告的间隔时间(秒);  | 
32 |  | -*   次数:显示报告的次数。  | 
 | 104 | +```bash  | 
 | 105 | +# iostat -hdy 1 5  | 
 | 106 | +Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 	08/28/2024 	_x86_64_	(2 CPU)  | 
33 | 107 | 
 
  | 
34 |  | -###  实例  | 
 | 108 | +      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device  | 
 | 109 | +    64.00       288.0k       308.0k     288.0k     308.0k vda  | 
35 | 110 | 
 
  | 
36 |  | -用`iostat -x /dev/sda1`来观看磁盘I/O的详细情况:  | 
 | 111 | +      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device  | 
 | 112 | +    12.00         0.0k        84.0k       0.0k      84.0k vda  | 
37 | 113 | 
 
  | 
38 |  | -```shell  | 
39 |  | -iostat -x /dev/sda1   | 
40 |  | -Linux 2.6.18-164.el5xen (localhost.localdomain)  | 
41 |  | -2010年03月26日    | 
 | 114 | +      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device  | 
 | 115 | +    15.00         0.0k        36.0k       0.0k      36.0k vda  | 
42 | 116 | 
 
  | 
43 |  | -avg-cpu:  %user   %nice %system %iowait   | 
44 |  | -%steal   %idle    | 
45 |  | -            0.11    0.02    0.18    0.35     | 
46 |  | -0.03    99.31    | 
 | 117 | +      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device  | 
 | 118 | +    28.00         0.0k        76.0k       0.0k      76.0k vda  | 
 | 119 | + | 
 | 120 | +      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device  | 
 | 121 | +    11.00         0.0k       100.0k       0.0k     100.0k vda  | 
47 | 122 | 
 
  | 
48 |  | -Device:         tps   Blk_read/s    Blk_wrtn/s    | 
49 |  | -Blk_read   Blk_wrtn    | 
50 |  | -sda1                0.02          0.08         | 
51 |  | -0.00          2014               4   | 
52 | 123 | ```  | 
53 | 124 | 
  | 
54 |  | -详细说明:第二行是系统信息和监测时间,第三行和第四行显示CPU使用情况(具体内容和mpstat命令相同)。这里主要关注后面I/O输出的信息,如下所示:  | 
 | 125 | +### 示例3  | 
 | 126 | +
  | 
 | 127 | +```bash  | 
 | 128 | +# iostat -xd 1  | 
 | 129 | +Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 	08/28/2024 	_x86_64_	(2 CPU)  | 
 | 130 | + | 
 | 131 | +Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util  | 
 | 132 | +vda              4.64    3.21     84.14     36.59     0.28     1.07   5.64  25.01    5.86    8.23   0.05    18.12    11.41   0.44   0.34  | 
 | 133 | + | 
 | 134 | +Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util  | 
 | 135 | +vda              1.00    0.00      4.00      0.00     0.00     0.00   0.00   0.00    1.00    0.00   0.00     4.00     0.00   2.00   0.20  | 
55 | 136 | 
 
  | 
 | 137 | +Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util  | 
 | 138 | +vda              0.00   37.00      0.00    395.50     0.00    10.00   0.00  21.28    0.00    0.92   0.03     0.00    10.69   0.11   0.40  | 
56 | 139 | 
 
  | 
57 |  | -标示 | 说明  | 
58 |  | ---- | ---  | 
59 |  | -Device | 监测设备名称  | 
60 |  | -rrqm/s | 每秒需要读取需求的数量  | 
61 |  | -wrqm/s | 每秒需要写入需求的数量  | 
62 |  | -r/s | 每秒实际读取需求的数量  | 
63 |  | -w/s | 每秒实际写入需求的数量  | 
64 |  | -rsec/s | 每秒读取区段的数量  | 
65 |  | -wsec/s | 每秒写入区段的数量  | 
66 |  | -rkB/s | 每秒实际读取的大小,单位为KB  | 
67 |  | -wkB/s | 每秒实际写入的大小,单位为KB  | 
68 |  | -avgrq-sz | 需求的平均大小区段  | 
69 |  | -avgqu-sz | 需求的平均队列长度  | 
70 |  | -await | 等待I/O平均的时间(milliseconds)  | 
71 |  | -svctm | I/O需求完成的平均时间  | 
72 |  | -%util | 设备带宽的使用率,达到100%表示饱和,达到性能瓶颈,如果是支持处理并发请求的设备则不代表性能瓶颈。  | 
 | 140 | +Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util  | 
 | 141 | +vda              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   0.00   0.00  | 
73 | 142 | 
 
  | 
 | 143 | +Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util  | 
 | 144 | +vda              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   0.00   0.00  | 
 | 145 | + | 
 | 146 | +Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util  | 
 | 147 | +vda              1.00    0.00      4.00      0.00     0.00     0.00   0.00   0.00    1.00    0.00   0.00     4.00     0.00   1.00   0.10  | 
 | 148 | + | 
 | 149 | +```  | 
74 | 150 | 
  | 
 | 151 | +从这里你可以看到,iostat 提供了非常丰富的性能指标。第一列的 Device 表示磁盘设备的名字,其他各列指标,虽然数量较多,但是每个指标的含义都很重要。  | 
 | 152 | +
  | 
 | 153 | +| 性能指标 | 含义 |  | 
 | 154 | +| --- | --- |  | 
 | 155 | +| r/s | 设备每秒完成的读取请求数(合并后)。 |  | 
 | 156 | +| w/s | 设备每秒完成的写入请求数(合并后)。 |  | 
 | 157 | +| rkB/s | 每秒从设备读取的扇区数(千字节、兆字节)。 |  | 
 | 158 | +| wkB/s | 每秒写入设备的扇区数(千字节、兆字节)。 |  | 
 | 159 | +| rrqm/s | 每秒合并到设备的排队 I/O 请求数。 |  | 
 | 160 | +| wrqm/s | 每秒合并到设备的写入请求数。 |  | 
 | 161 | +| %rrqm | 在发送到设备之前合并在一起的读取请求的百分比。 |  | 
 | 162 | +| %wrqm | 发送到设备前合并在一起的写入请求的百分比。 |  | 
 | 163 | +| r_await | 向设备发出的读取请求获得服务的平均时间(毫秒)。这包括请求在队列中花费的时间和为请求提供服务的时间。 |  | 
 | 164 | +| w_await | 向待服务设备发出写入请求的平均时间(毫秒)。这包括请求在队列中花费的时间和为请求提供服务的时间。 |  | 
 | 165 | +| aqu-sz | 向设备发出的请求的平均队列长度。注意:在以前的版本中,该字段被称为 avgqu-sz。 |  | 
 | 166 | +| rareq-sz | 向设备发出的读取请求的平均大小(千字节)。 |  | 
 | 167 | +| wareq-sz | 向设备发出的写入请求的平均大小(千字节)。 |  | 
 | 168 | +| svctm | 向设备发出的 I/O 请求的平均服务时间(毫秒)。警告!不要再相信这个字段了。 未来的 sysstat 版本将删除此字段。 |  | 
 | 169 | +| %util | 向设备发出 I/O 请求所用时间的百分比(设备带宽利用率)。 对于串行服务请求的设备,当该值接近 100%,设备就会饱和。 但对于以并行方式提供请求的设备,如 RAID 阵列和现代固态硬盘,该数值并不能反映其性能极限。 |  | 
 | 170 | +
  | 
 | 171 | +当 %iowait 升高,需要重点关注以下指标:  | 
 | 172 | +
  | 
 | 173 | +- avgrq-sz:  向设备发出请求的平均大小(单位:扇区)  | 
 | 174 | +- avgqu-sz:  向设备发出请求的队列平均长度。也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小.如果数据拿的大,IO 的数据会高  | 
 | 175 | +- r_await:   向服务设备发出读取请求的平均时间(单位:毫秒)。包括请求入队的时间以及设备处理请求的时间  | 
 | 176 | +- w_await:   向服务设备发出写请求的平均时间(单位:毫秒)。包括请求入队的时间以及设备处理请求的时间  | 
 | 177 | +- %util:一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈  | 
 | 178 | +- %svctm:平均每次设备 I/O 操作的服务时间 (毫秒)。一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU  | 
0 commit comments