-
-
Notifications
You must be signed in to change notification settings - Fork 6.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
从 Linux 2.6.18 内核的 iostat 更新到 4.18.0 内核的 iostat。并参数说明和示例
- Loading branch information
Showing
1 changed file
with
156 additions
and
52 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,74 +1,178 @@ | ||
iostat | ||
=== | ||
# iostat | ||
|
||
监视系统输入输出设备和CPU的使用情况 | ||
iostat命令被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。 | ||
iowait 指在一个采样周期内有百分之几的时间是属于以下情况:CPU处于空闲状态并且至少有一个未完成的磁盘IO请求。 | ||
|
||
## 补充说明 | ||
## 安装 iostat | ||
|
||
**iostat命令** 被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。 | ||
iostat包含在**sysstat**包内。如果你没有,你首先需要安装它。 | ||
在 RedHat / CentOS / Fedora | ||
|
||
### 语法 | ||
```bash | ||
yum install sysstat | ||
``` | ||
|
||
在 Debian / Ubuntu / Linux Mint | ||
|
||
```bash | ||
sudo apt-get install sysstat | ||
``` | ||
|
||
```shell | ||
## 语法 | ||
|
||
```bash | ||
iostat(选项)(参数) | ||
``` | ||
|
||
### 选项 | ||
|
||
```shell | ||
-c:仅显示CPU使用情况; | ||
-d:仅显示设备利用率; | ||
-k:显示状态以千字节每秒为单位,而不使用块每秒; | ||
-m:显示状态以兆字节每秒为单位; | ||
-p:仅显示块设备和所有被使用的其他分区的状态; | ||
-t:显示每个报告产生时的时间; | ||
-V:显示版号并退出; | ||
-x:显示扩展状态。 | ||
### 选项 | ||
|
||
```bash | ||
# iostat --help | ||
Usage: iostat [ options ] [ <interval> [ <count> ] ] | ||
Options are: | ||
[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -s ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ] | ||
[ -j { ID | LABEL | PATH | UUID | ... } ] [ --human ] [ -o JSON ] | ||
[ [ -H ] -g <group_name> ] [ -p [ <device> [,...] | ALL ] ] | ||
``` | ||
参数说明: | ||
``` | ||
-c 输出CPU统计信息。不能与-d参数同时使用。 | ||
-d 输出设备和分区的I/O统计信息。不能与-c参数同时使用。(默认的参数是-d)。 | ||
-h 让人类更容易阅读设备使用情况报告。--human使用此选项隐式启用。 | ||
-k 用“kbytes/秒”代替“块/秒”显示统计信息。 | ||
-m 用“mbytes/秒”代替“块/秒”显示统计信息。 | ||
-t 打印显示的每份报告的时间。 | ||
-V 显示版本号并退出。 | ||
-x 显示扩展统计信息。不能与参数-p同时使用。 | ||
-y 如果在给定时间间隔内显示多条记录,则省略自系统启动以来的第一份统计报告。 | ||
-z 告诉 iostat 忽略在样本期间没有活动的设备的输出。 | ||
-j 显示持久的设备名称。选项ID、LABEL等指定持久名称的类型。 | ||
--human 以人类可读格式打印大小(例如1.0k, 1.2M等)。使用此选项显示的单位取代与度量相关的任何其他默认单位(例如千字节,扇区…)。 | ||
-o 以JSON (Javascript Object Notation)格式显示统计数据。JSON输出字段顺序未定义,未来可能会添加新字段。 | ||
-H 该选项必须与-g一起使用,表示只显示组的全局统计信息,而不显示组中单个设备的统计信息。 | ||
-p 选项显示系统使用的块设备及其所有分区的统计信息。如果在命令行中输入一个设备名,那么将显示该设备及其所有分区的统计信息。最后,ALL关键字表示必须显示系统定义的所有块设备和分区的统计信息,包括那些从未使用过的设备和分区。如果在此选项之前定义了选项-j,则可以使用所选的持久名称类型指定在命令行上输入的设备。 | ||
``` | ||
### 参数 | ||
interval 刷新时间间隔 | ||
count 刷新次数 | ||
## 运行示例 | ||
### 示例1 | ||
```bash | ||
# iostat | ||
Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 08/28/2024 _x86_64_ (2 CPU) | ||
|
||
avg-cpu: %user %nice %system %iowait %steal %idle | ||
3.30 0.01 1.90 0.12 0.00 94.68 | ||
|
||
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn | ||
vda 7.85 84.22 36.59 1081853831 470049100 | ||
|
||
``` | ||
### 参数 | ||
第一部分包含了CPU报告 | ||
| 性能指标 | 含义 | | ||
| --- | --- | | ||
| %user | 显示在用户级(应用程序)执行时发生的CPU利用率百分比。 | | ||
| %nice | 显示在具有nice优先级的用户级别执行时发生的CPU利用率百分比。 | | ||
| %system | 显示在系统级(内核)执行时发生的CPU利用率百分比。 | | ||
| %iowait | 显示在系统有未完成的磁盘I/O请求期间CPU空闲的时间百分比。 | | ||
| %steal | 显示虚拟机监控程序为另一个虚拟处理器提供服务时,一个或多个虚拟CPU在非自愿等待上花费的时间百分比。 | | ||
| %idle | 显示CPU空闲且系统没有未完成的磁盘I/O请求的时间百分比。 | | ||
第二部分包含了设备利用率报告 | ||
| 性能指标 | 含义 | | ||
| --- | --- | | ||
| Device | 此列给出了 /dev 目录中列出的设备(或分区)名称。 | | ||
| tps | 表示每秒向设备发出的传输次数。传输是对设备的 I/O 请求。多个逻辑请求可合并为对设备的一个 I/O 请求。传输大小不确定。 | | ||
| kB_read/s | 表示每秒从设备读取的数据量,以块数(千字节、兆字节)表示。块相当于扇区,因此大小为 512 字节。 | | ||
| kB_wrtn/s | 表示写入设备的数据量,以每秒块数(千字节、兆字节)表示。 | | ||
| kB_read | 读取的数据块总数(千字节、兆字节)。 | | ||
| kB_wrtn | 写入的数据块总数(千字节、兆字节)。 | | ||
### 示例2 | ||
以更友好的显示方式显示 IO 信息,使用`-y`忽略第一份统计。并每隔 1 秒重新一次,共5次。 | ||
* 间隔时间:每次报告的间隔时间(秒); | ||
* 次数:显示报告的次数。 | ||
```bash | ||
# iostat -hdy 1 5 | ||
Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 08/28/2024 _x86_64_ (2 CPU) | ||
|
||
### 实例 | ||
tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device | ||
64.00 288.0k 308.0k 288.0k 308.0k vda | ||
|
||
用`iostat -x /dev/sda1`来观看磁盘I/O的详细情况: | ||
tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device | ||
12.00 0.0k 84.0k 0.0k 84.0k vda | ||
|
||
```shell | ||
iostat -x /dev/sda1 | ||
Linux 2.6.18-164.el5xen (localhost.localdomain) | ||
2010年03月26日 | ||
tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device | ||
15.00 0.0k 36.0k 0.0k 36.0k vda | ||
|
||
avg-cpu: %user %nice %system %iowait | ||
%steal %idle | ||
0.11 0.02 0.18 0.35 | ||
0.03 99.31 | ||
tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device | ||
28.00 0.0k 76.0k 0.0k 76.0k vda | ||
|
||
tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device | ||
11.00 0.0k 100.0k 0.0k 100.0k vda | ||
|
||
Device: tps Blk_read/s Blk_wrtn/s | ||
Blk_read Blk_wrtn | ||
sda1 0.02 0.08 | ||
0.00 2014 4 | ||
``` | ||
详细说明:第二行是系统信息和监测时间,第三行和第四行显示CPU使用情况(具体内容和mpstat命令相同)。这里主要关注后面I/O输出的信息,如下所示: | ||
### 示例3 | ||
```bash | ||
# iostat -xd 1 | ||
Linux 4.18.0-477.13.1.el8_8.x86_64 (node1) 08/28/2024 _x86_64_ (2 CPU) | ||
|
||
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 | ||
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 | ||
|
||
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 | ||
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 | ||
|
||
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 | ||
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 | ||
|
||
标示 | 说明 | ||
--- | --- | ||
Device | 监测设备名称 | ||
rrqm/s | 每秒需要读取需求的数量 | ||
wrqm/s | 每秒需要写入需求的数量 | ||
r/s | 每秒实际读取需求的数量 | ||
w/s | 每秒实际写入需求的数量 | ||
rsec/s | 每秒读取区段的数量 | ||
wsec/s | 每秒写入区段的数量 | ||
rkB/s | 每秒实际读取的大小,单位为KB | ||
wkB/s | 每秒实际写入的大小,单位为KB | ||
avgrq-sz | 需求的平均大小区段 | ||
avgqu-sz | 需求的平均队列长度 | ||
await | 等待I/O平均的时间(milliseconds) | ||
svctm | I/O需求完成的平均时间 | ||
%util | 设备带宽的使用率,达到100%表示饱和,达到性能瓶颈,如果是支持处理并发请求的设备则不代表性能瓶颈。 | ||
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 | ||
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 | ||
|
||
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 | ||
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 | ||
|
||
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 | ||
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 | ||
|
||
``` | ||
从这里你可以看到,iostat 提供了非常丰富的性能指标。第一列的 Device 表示磁盘设备的名字,其他各列指标,虽然数量较多,但是每个指标的含义都很重要。 | ||
| 性能指标 | 含义 | | ||
| --- | --- | | ||
| r/s | 设备每秒完成的读取请求数(合并后)。 | | ||
| w/s | 设备每秒完成的写入请求数(合并后)。 | | ||
| rkB/s | 每秒从设备读取的扇区数(千字节、兆字节)。 | | ||
| wkB/s | 每秒写入设备的扇区数(千字节、兆字节)。 | | ||
| rrqm/s | 每秒合并到设备的排队 I/O 请求数。 | | ||
| wrqm/s | 每秒合并到设备的写入请求数。 | | ||
| %rrqm | 在发送到设备之前合并在一起的读取请求的百分比。 | | ||
| %wrqm | 发送到设备前合并在一起的写入请求的百分比。 | | ||
| r_await | 向设备发出的读取请求获得服务的平均时间(毫秒)。这包括请求在队列中花费的时间和为请求提供服务的时间。 | | ||
| w_await | 向待服务设备发出写入请求的平均时间(毫秒)。这包括请求在队列中花费的时间和为请求提供服务的时间。 | | ||
| aqu-sz | 向设备发出的请求的平均队列长度。注意:在以前的版本中,该字段被称为 avgqu-sz。 | | ||
| rareq-sz | 向设备发出的读取请求的平均大小(千字节)。 | | ||
| wareq-sz | 向设备发出的写入请求的平均大小(千字节)。 | | ||
| svctm | 向设备发出的 I/O 请求的平均服务时间(毫秒)。警告!不要再相信这个字段了。 未来的 sysstat 版本将删除此字段。 | | ||
| %util | 向设备发出 I/O 请求所用时间的百分比(设备带宽利用率)。 对于串行服务请求的设备,当该值接近 100%,设备就会饱和。 但对于以并行方式提供请求的设备,如 RAID 阵列和现代固态硬盘,该数值并不能反映其性能极限。 | | ||
当 %iowait 升高,需要重点关注以下指标: | ||
- avgrq-sz: 向设备发出请求的平均大小(单位:扇区) | ||
- avgqu-sz: 向设备发出请求的队列平均长度。也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小.如果数据拿的大,IO 的数据会高 | ||
- r_await: 向服务设备发出读取请求的平均时间(单位:毫秒)。包括请求入队的时间以及设备处理请求的时间 | ||
- w_await: 向服务设备发出写请求的平均时间(单位:毫秒)。包括请求入队的时间以及设备处理请求的时间 | ||
- %util:一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈 | ||
- %svctm:平均每次设备 I/O 操作的服务时间 (毫秒)。一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU |