深入分析diskstats

深入分析diskstats
背景
内核很多重要子系统均通过proc文件的方式,将自身的一些统计信息输出,方便最终用户查看各子系统的运行状态,这些统计信息被称为metrics。 直接查看metrics并不能获取到有用的信息,一般都是由特定的应用程序(htop/sar/iostat等)每隔一段时间读取相关metrics,并进行相应计算,给出更具用户可读性的输出。 常见的metrics文件有:

cpu调度统计信息的/proc/stat
cpu负载统计信息的/proc/loadavg
通用块设备层也有一个重要的统计信息

/proc/diskstats 内核通过diskstats文件,将通用块设备层的一些重要指标以文件的形式呈现给用户。
因为本文档牵涉到通用块设备层很多细节,建议先了解IO调度器的相关知识。

初探diskstats
首先来看下diskstats里面都有些什么,下面截取的是一个diskstats文件内容:

cat /proc/diskstats

8 0 sda 8567 1560 140762 3460 0 0 0 0 0 2090 3440
8 1 sda1 8565 1557 140722 3210 0 0 0 0 0 1840 3190
8 16 sdb 8157 1970 140762 2940 0 0 0 0 0 1710 2890
8 17 sdb1 8155 1967 140722 2900 0 0 0 0 0 1670 2850
8 32 sdc 8920 1574 206410 7870 430 0 461 250 0 6820 8120
8 33 sdc1 8918 1571 206370 7840 430 0 461 250 0 6790 8090
8 48 sdd 209703 1628 341966 1318450 3109063 331428 943042901 9728000 0 8943570 11015280
8 49 sdd1 209701 1625 341926 1318200 3109063 331428 943042901 9728000 0 8943320 11015030
虽然如上面提到的,这些数字看上去完全没有规律。不过若想研究内核通用块设备层的统计实现方式,还是得一个一个字段的分析。

简单的说,每一行对应一个块设备,分别有ram0-ram15、loop0-loop7、mtdblock0-mtdblock5,剩下的sdxx就是硬盘和分区了。 这里以sda设备的数据为例,分别列举各字段的意义:

1
8 0 sda 8567 1560 140762 3460 0 0 0 0 0 2090 3440
根据内核文档iostats.txt中描述,各字段意义如下:

域 Value Quoted 解释
F1 8 major number 此块设备的主设备号
F2 0 minor mumber 此块设备的次设备号
F3 sda device name 此块设备名字
F4 8567 reads completed successfully 成功完成的读请求次数
F5 1560 reads merged 读请求的次数
F6 140762 sectors read 读请求的扇区数总和
F7 3460 time spent reading (ms) 读请求花费的时间总和
F8 0 writes completed 成功完成的写请求次数
F9 0 writes merged 写请求合并的次数
F10 0 sectors written 写请求的扇区数总和
F11 0 time spent writing (ms) 写请求花费的时间总和
F12 0 I/Os currently in progress 次块设备队列中的IO请求数
F13 2090 time spent doing I/Os (ms) 块设备队列非空时间总和
F14 3440 weighted time spent doing I/Os (ms) 块设备队列非空时间加权总和
基本上都是数量、时间的累加值,按照读、写分开统计。

你可能感兴趣的:(深入分析diskstats)