1.diskstats统计

io统计主要读取/proc/diskstats节点

rd_ios:merge后读操作的次数

rd_merges合并读操作的次数。如果两个读操作读取相邻的数据块时,可以被合并成一个,rd_sectors读取的扇区数量。

d_ticks 读操作消耗的时间(以毫秒为单位)。每个读操作从__make_request()开始计时,到__blk_mq_end_request()为止,包括了在队列中等待的时间。

wr_ios:merge写操作的次数。

wr_merges:合并写操作的次数。

wr_sectors:写入的扇区数量。

wr_ticks:写操作消耗的时间(以毫秒为单位)。

in_flight: 当前未完成的I/O数量。在I/O请求进入队列时该值加1,在I/O结束时该值减1。
io_ticks:该设备用于处理I/O的时间(每个request耗时累加)。
time_in_queue:对字段io_ticks的加权值,ime_in_queue是用当前的I/O数量乘以自然时间。虽然该字段的名称是time_in_queue,但并不真的只是在队列中的时间,其中还包含了硬盘处理I/O的时间。iostat在计算avgqu-sz时会用到这个字段。iostat(1)是以/proc/diskstats为基础计算出来的,因为/proc/diskstats并未把队列等待时间和硬盘处理时间分开,所以凡是以它为基础的工具都不可能分别提供disk service time以及与queue有关的值。

2.iostat计算

“Δ”表示两次取样之间的差值,“Δt”表示采样周期。

tps:每秒I/O次数=[(Δrd_ios+Δwr_ios)/Δt]

r/s:每秒读操作的次数=[Δrd_ios/Δt]

w/s:每秒写操作的次数=[Δwr_ios/Δt]

rkB/s:每秒读取的千字节数=[Δrd_sectors/Δt]*[512/1024]

wkB/s:每秒写入的千字节数=[Δwr_sectors/Δt]*[512/1024]

rrqm/s:每秒合并读操作的次数=[Δrd_merges/Δt]

wrqm/s:每秒合并写操作的次数=[Δwr_merges/Δt]

avgrq-sz:每个I/O的平均扇区数=[Δrd_sectors+Δwr_sectors]/[Δrd_ios+Δwr_ios]

avgqu-sz:平均未完成的I/O请求数量=[Δtime_in_queue/Δt]

(平均未完成的I/O请求数量。)

await:每个I/O平均所需的时间=[Δrd_ticks+Δwr_ticks]/[Δrd_ios+Δwr_ios]

(不仅包括硬盘设备处理I/O的时间,还包括了在kernel队列中等待的时间。)

r_await:每个读操作平均所需的时间=[Δrd_ticks/Δrd_ios]

不仅包括硬盘设备读操作的时间,还包括了在kernel队列中等待的时间。

w_await:每个写操作平均所需的时间=[Δwr_ticks/Δwr_ios]

不仅包括硬盘设备写操作的时间,还包括了在kernel队列中等待的时间。

%util:该硬盘设备的繁忙比率=[Δio_ticks/Δt]

表示该设备有I/O(即非空闲)的时间比率,不考虑I/O有多少,只考虑有没有。

svctm:已被废弃的指标,没什么意义,svctm=[util/tput]

3.评估IO瓶颈

主要使用await,rwait,rwait反映IO平均处理时间,具体时间需要参照硬盘说明书,一般不超过10毫秒。

util 100%不能真实反映磁盘的饱和度,只能代表有IO一直在处理,那怎么描述磁盘的饱和度?

可以使用avgqu-sz对比硬件队列深度来衡量磁盘的饱和度

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐