如何测量linux下命令的IOPS



我正在研究一个模拟模型,我想确定存储IOPS容量何时成为瓶颈(例如HDD有~150 IOPS,而SSD可以有150,000)。因此,我试图想出一种方法来对命令(git)中的一些不同操作(推、拉、合并、克隆)的IOPS进行基准测试。

到目前为止,我已经找到了像iostat这样的工具,但是,我不确定如何将报告限制为单个命令所做的事情。

我能想到的最好的主意是确定我的HDD IOPS容量,使用实际命令上的时间,看看它持续了多长时间,乘以IOPS,这些就是我的IOPS:

HDD ->150 IOPS
time df -h
real    0m0.032s
150 * .032 = 4.8 IOPS

但是,这当然是非常愚蠢的,因为执行的持续时间可能与CPU使用率有关,而不是与HDD使用率有关,所以除非当时HDD的使用率是100%,否则测量这样的事情是没有意义的。

那么,如何度量一个命令的IOPS呢?

在典型的Linux系统上有多个time(1)命令;默认是bash(1)内置的,这是比较基本的。还有/usr/bin/time,您可以通过完全像这样调用它来运行它,或者通过使用反斜杠作为前缀来告诉bash(1)不要使用别名和内置程序:time。Debian在默认安装的"time"包中有它,Ubuntu可能是相同的,其他发行版将非常相似。

以类似于shell内置的方式调用它已经更加冗长和信息丰富,尽管可能更不透明,除非您已经熟悉这些数字的真正含义:

$ time df
[output elided]
0.00user 0.00system 0:00.01elapsed 66%CPU (0avgtext+0avgdata 864maxresident)k
0inputs+0outputs (0major+261minor)pagefaults 0swaps

然而,我想提醒您注意手册页,其中列出了-f选项来定制输出格式,特别是%w格式,它计算进程放弃其CPU时间片的次数I/O:

$ time -f 'ios=%w' du Maildir >/dev/null
ios=184
$ time -f 'ios=%w' du Maildir >/dev/null
ios=1

注意,第一次运行为I/O停止了184次,但第二次运行只停止了一次。第一个数字是可信的,因为我的~/Maildir中有124个目录:读取目录和inode大约为每个目录提供两个IOPS,少一点是因为一些inode可能彼此相邻并在一次操作中读取,再加上一些额外的映射到du(1)二进制文件,共享库等等。

由于Linux的磁盘缓存,第二个数字当然要低一些。最后一步是刷新缓存。Sync(1)是一个熟悉的命令,它将脏写操作刷新到磁盘,但不刷新读缓存。您可以通过将3写入/proc/sys/vm/drop_caches来刷新它。(其他值偶尔也有用,但这里需要3。)作为非根用户,最简单的方法是:
echo 3 | sudo tee /proc/sys/vm/drop_caches

结合/usr/bin/time应该允许您构建您需要的脚本来对您感兴趣的命令进行基准测试。

作为次要的题外,tee(1)被使用是因为它不起作用:

sudo echo 3 >/proc/sys/vm/drop_caches

的原因吗?虽然echo(1)作为根运行,但是重定向是作为普通用户帐户运行的,它没有对drop_caches的写权限。Tee(1)有效地将重定向作为根。

iotop命令用于收集Linux操作系统下进程的I/O使用情况。默认情况下,它是一个交互式命令,但您可以使用-b/--batch以批处理模式运行它。此外,您还可以使用-p/--pid创建进程列表。因此,可以使用以下命令监视git命令的活动:

$ sudo iotop -p $(pidof git) -b

您可以使用-d/--delay更改延迟

可以使用pidstat:
pidstat -d 2
更具体地说,pidstat -d 2 | grep COMMANDpidstat -C COMMANDNAME -d 2

pidstat命令用于监视当前由Linux内核管理的单个任务。对于使用选项-p选择的每个任务,或者对于使用选项-p ALL的Linux内核管理的每个任务,它都会写入标准输出活动。不选择任何任务相当于指定-p ALL,但只有活动任务(统计值非零的任务)将出现在报告中。pidstat命令还可用于监视所选任务的子进程。

-C comm只显示命令名中包含stringcomm的任务。该字符串可以是正则表达式

最新更新