概述

iostat 用于输出CPU和磁盘I/O相关的统计信息。iostat manual page

应用

命令格式

iostat [ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ] [ -j { ID | LABEL | PATH | UUID | … } [ device […] | ALL ] ] [ device […]
| ALL ] [ -p [ device [,…] | ALL ] ] [ interval [ count ] ]
*注意*以上是基于sysstat9.0.2版本,不同版本命令使用是有区别的如v7.0.4的使用格式为
iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -n ] [ -h ] [ device [ … ] | ALL ] [ -p [ device | ALL ] ] [ interval [ count ] ]
所以请使用之前使用man查一下帮助手册,以免用错参数~

选项说明

Optionsdetails
-c仅显示CPU统计信息.
-d仅显示磁盘统计信息.
-h通过-n选项使NFS报告更容易阅读
-j{ ID | LABEL | PATH | UUID | … } [ device […] | ALL ] 显示固定的设备名称。选项有ID、LABEL、PATH、UUID等,可以为固定的名字指定一个类型。这些选项没有任何约束,唯一的前提是使用的目录必须存在/dev/disk。通常可以指定多个设备块为同一个固定的类型名称
-k以KB为单位显示每秒的磁盘请求数。默认单位块。只有在内核2.4以后的版本中才生效
-m以MB为单位显示每秒的磁盘请求数。默认单位块。只有在内核2.4以后的版本中才生效
-N为任何设备映射显示设备映射器注册名称。堆于查看LVM2统计数据非常有用
-n显示NFS报告,此选项只在内核2.6.17+才能正常工作
-p[ { device [,…] | ALL } ]-p选项显示系统使用的数据块设备和所有的分区统计信息。如果在命令行上传入设备名称参数,统计显示它和它的所有分区。最后,关键字ALL,统计显示所有定义的块设备和分区系统,包括那些从未被使用。如果在该选项之前使用选项-j,可以在命令行中指定固定的类型的设备名。只有在内核2.5+以后的版本才能生效
-t为显示的报告打印时间。时间戳的格式依赖环境变量S_TIME_FORMAT。
-V在退出的时候打印版本号。
-x显示扩展信息。此选项需要内核在2.5以上,因为依赖/proc/diskstats文件或者挂载sysfs获取统计信息。
-y若指定时间间隔统计多次报告输出将忽略从启动到第一次统计的之间报告信息,即忽略常规选项的第一次报告输出
-z在采样期间设备没有任何活动iostat将不输出报告

参数说明

参数参数说明
interval为取样时间间隔
count为输出次数,若指定了取样时间间隔且省略此项,将不断产生统计信息

输出选项说明

avg-cpu 部分输出项说明

输出选项含义
%user在用户级别运行所使用的 CPU 的百分比。
%nicenice 操作所使用的 CPU 的百分比。
%system在核心级别(kernel)运行所使用 CPU 的百分比。
%iowaitCPU 等待硬件 I/O 所占用 CPU 的百分比。
%steal当管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
%idleCPU 空闲时间的百分比。

Device 部分基本输出项说明

输出选项含义
tps每秒钟物理设备的I/O传输总量。
Blk_read读入的数据总量,单位为块。
Blk_wrtn写入的数据总量,单位为块。
kB_read读入的数据总量,单位为KB。
kB_wrtn写入的数据总量,单位为KB。
MB_read读入的数据总量,单位为MB。
MB_wrtn写入的数据总量,单位为MB。
Blk_read/s每秒从驱动器读入的数据量,单位为 块/s。
Blk_wrtn/s每秒向驱动器写入的数据量,单位为 块/s。
kB_read/s每秒从驱动器读入的数据量,单位为KB/s。
kB_wrtn/s每秒向驱动器写入的数据量,单位为KB/s。
MB_read/s每秒从驱动器读入的数据量,单位为MB/s。
MB_wrtn/s每秒向驱动器写入的数据量,单位为MB/s。

Device 部分扩展输出项说明

输出选项含义
rrqm/s将读入请求合并后,每秒发送到设备的读入请求数。
wrqm/s将写入请求合并后,每秒发送到设备的写入请求数。
r/s每秒发送到设备的读入请求数。
w/s每秒发送到设备的写入请求数。
rsec/s每秒从设备读入的扇区数。
wsec/s每秒向设备写入的扇区数。
rkB/s每秒从设备读入的数据量,单位为 KB/s。
wkB/s每秒向设备写入的数据量,单位为 KB/s。
rMB/s每秒从设备读入的数据量,单位为 MB/s。
wMB/s每秒向设备写入的数据量,单位为 MB/s。
avgrq-sz发送到设备的请求的平均大小,单位为扇区。
avgqu-sz发送到设备的请求的平均队列长度。
awaitI/O请求平均执行时间。包括发送请求和执行的时间。单位为毫秒。
svctm发送到设备的I/O请求的平均执行时间。单位为毫秒。
%util在I/O请求发送到设备期间,占用CPU时间的百分比。用于显示设备的带宽利用率。当这个值接近100%时,表示设备带宽已经占满。

排查问题参考

主要检查是否存在io方面的问题

r/s,w/s:每秒发生(读/写)请求的数量 ,两个数量加起来就是tps 或者说 IOPS
rkB/s,wkB/s:指磁盘的吞吐量。

可以使用time dd测试磁盘的普遍吞吐量

avgrq-sz: 每次IO请求的数据大小,指的数据尺寸=吞吐量/io次数
avgqu-sz:每次IO请求时,平均的队深度。如果 I/O 请求压力持续超出磁盘处理能力,该值将增加
await:I/O的平均等待时间(单位毫秒),包括:排队时间 和 服务时间(真正处理io的时间),指等待时间

!!!!!注意以下两个值!!!!!

svctm

svctm:I/O的平均服务时间(单位毫秒),也就是被await包括的 存储真正处理IO的时间

服务时间包括:磁头寻道时间(目前平均为3毫秒)+旋转延迟时间(磁盘转速相关)+数据传输时间(简单计算时可忽略不计)

  • 旋转延迟时间:以旋转一周时间的1/2表示=60/转数每分钟/2
    如:1.5w转,旋转延时=60/15000/2=0.002s=2ms

实时查看的svctm已经不准确,因为它并不代表真正的存储service time,因为它是计算出来的。可以使用实操验证:同一块磁盘,通过不同的压测方式,竟然得到不同的svctm,而svctm原本意义是不可变,固定的IO耗时。

验证:(测试磁盘为raid10)

fio --filename=/root/test -iodepth=1 -ioengine=sync --direct=1 --rw=write --bs=16k --size=1g --numjobs=1 --runtime=10 --group_reporting --name=test-write

iostat

fio --filename=/root/test -iodepth=1 -ioengine=sync --direct=1 --rw=write --bs=16k --size=1g --numjobs=1 --runtime=10 --group_reporting --name=test-write

iostat

计算真实svctm
通过压测工具(比如例子中使用的fio):通过设置为同步IO,numjobs=1,以及io_depth=1,压测出来的就是真实的svctm

fio --filename=/root/test -iodepth=1 -ioengine=sync --direct=1 --rw=write --bs=16k --size=1g --numjobs=1 --runtime=10 --group_reporting --name=test-write

util

%util:为设备利用率
机械硬盘,在物理层面是串行的,既同一时刻只能干一个活,虽然有各种级别的并发,但并不是真正的并行。SSD,RAID 则不同。是可以真正在物理层面上并行执行多个IO。可以一个时间物理执行多个IO。

%util的计算 有一个简单的算法:

  • 并发= (r/s + w/s) * (svctm / 1000)
  • %util = 并发* 100%

然而这个并发 是个伪命题,因为svctm也是通过计算而来的,无论怎样压测,算出来的并发都是1左右,那么自然util% 乘以出来就是100%

在sysstat网站的最新文档中也已经注明: But for devices serving requests in parallel, such as RAID arrays and modern SSDs, this number does not reflect their performance limits.

验证:

下面一组数据能够直接说明问题的存在~

  • iops为6373时:util为90
  • iops为12691时:util为99
fio --filename=/root/test -iodepth=1 -ioengine=sync --direct=1 --rw=write --bs=16k --size=1g --numjobs=1 --runtime=10 --group_reporting --name=test-write

fioRepoit
iostat

fio --filename=/root/test -iodepth=1 -ioengine=sync --direct=1 --rw=write --bs=16k --size=1g --numjobs=1 --runtime=10 --group_reporting --name=test-write

fioreport
iostat

真实的util%,调整一下公式

  • 最大并发度 = 压测满(r/s + w/s) * (真实svctm / 1000)
  • %util = 最大并发度* 100%

算出真实的最大并行度有什么用?

当util% ,svctm 都不准确时,应该参考avgqu-sz:超过处理能力的请求数目,待处理的 I/O 请求,当请求持续超出磁盘处理能力,该值将增加。

avgqu-sz参考:持续超过2就应该警示,此处的2是指最【大并发度的2倍】。如一块机械盘,串行IO(每次1个IO),那么avgqu-sz持续大于2既代表持续有2倍读写能力的IO请求在等待。那么当RAIDs 或者 SSD等并行,这里假定并行度为5.63,那么 avgqu-sz持续大于10,才代表持续有2倍读写能力的IO请求在等待。

原文链接
欢迎补充,未完待续……

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐