如何监控现代 Linux 上存储 iops 的大小?
我可以使用 iostat 等命令监控存储 iops 的数量。但是我想知道工作负载生成的 iops 的大小。
比如,在最后 X 秒内有:5 iops 4K、10 iops 8K、20 iops 16K ...
我对块设备级别的监视感兴趣(例如:/dev/sda),但是在任何其他级别也很有趣。
答案1
低级
在低级别,您可以从 获取此信息/sys/block/X/stat
,该信息已记录在案这里。
示例内容如下所示:
10465 3250 759844 27528 4400 2983 546848 66306 0 9754 93792
我们想要的字段是用于读取的列 1 和 3,以及用于写入的列 5 和 7。两者的计算方法是相同的,所以我只讨论读取。
第 1 列是读取次数(您表示您已经能够监控),第 3 列是读取的扇区数。一个扇区为 512 字节。因此,用这些来计算读取的大小,您只需这样做$col3 * 512 / $col1
。
该文件中的数字是自磁盘上线以来的总数。因此,要计算一段时间内的平均读取大小,您只需读取文件两次,然后使用以下方法进行计算:($col3_t2 - $col3_t1) * 512 / ($col1_t2 - $col1_t1)
。
请注意,上述方法为您提供了在应用程序级别执行的 OP 的大小(描述并不准确,但足够接近)。内核可以将多个操作合并在一起,因此在磁盘上执行的操作数量更少。对此的计算是:$col3 * 512 / ($col1 - $col2)
。并获取一段时间内的值:($col3_t2 - $col3_t1) * 512 / (($col1_t2 - $col1_t1) - ($col2_t2 - $col2_t1))
高水平
iostat
也可以给你价值,但不太准确。它不区分写入或读取,并且仅提供扇区值,而不是字节值(因此再次乘以 512)。但命令是iostat -x -d
,要查看的列是avgrq-sz
。