如何在linux中测量命令的IOPS?

如何在linux中测量命令的IOPS?,linux,git,command-line,benchmarking,provisioned-iops,Linux,Git,Command Line,Benchmarking,Provisioned Iops,我正在研究一个模拟模型,在这个模型中,我想确定存储IOPS容量何时成为瓶颈(例如,HDD的IOPS大约为150,而SSD的IOPS可能为150000)。因此,我正试图找到一种方法,在命令(git)中为一些不同的操作(推、拉、合并、克隆)测试IOPS 到目前为止,我已经找到了像iostat这样的工具,但是,我不知道如何将报告限制为单个命令的作用 我能想到的最好办法是确定我的HDD IOPS容量,在实际命令上使用时间,看看它能持续多久,然后乘以IOPS,这些就是我的IOPS: HDD ->15

我正在研究一个模拟模型,在这个模型中,我想确定存储IOPS容量何时成为瓶颈(例如,HDD的IOPS大约为150,而SSD的IOPS可能为150000)。因此,我正试图找到一种方法,在命令(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呢?

您可以使用pidstat:
pidstat-d2

更具体地说是
pidstat-d2 | grep命令
pidstat-C COMMANDNAME-d2

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

-C COMM仅显示命令名包含stringcomm的任务。此字符串可以是正则表达式

在一个典型的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
格式,该格式统计进程为I/O放弃CPU时间片的次数:

$ \time -f 'ios=%w' du Maildir >/dev/null
ios=184
$ \time -f 'ios=%w' du Maildir >/dev/null
ios=1
请注意,第一次运行停止I/O 184次,但第二次运行仅停止一次。第一个数字是可信的,因为my
~/Maildir
中有124个目录:读取目录和inode时,每个目录的IOPS大约为两个,少了一点,因为一些inode很可能相邻并在一次操作中读取,另外还有一些额外的IOPS用于du(1)二进制文件、共享库等中的映射

由于Linux的磁盘缓存,第二个数字当然更低。因此,最后一步是刷新缓存。sync(1)是一个熟悉的命令,它会刷新对磁盘的脏写入,但不会刷新读缓存。您可以通过将3写入
/proc/sys/vm/drop\u缓存来刷新该缓存。(其他值有时也很有用,但此处需要3。)作为非root用户,最简单的方法是:

echo 3 | sudo tee /proc/sys/vm/drop_caches
将其与
/usr/bin/time
相结合,应该允许您构建所需的脚本,以对您感兴趣的命令进行基准测试

作为小调,使用t形三通(1),因为这不起作用:

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

原因是什么?尽管echo(1)以root用户身份运行,但重定向与您的普通用户帐户一样,它没有对
drop\u缓存的写入权限。tee(1)作为root有效地执行重定向。

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

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

您可以使用
-d
/
--delay

更改延迟。您的操作系统是什么?你有没有检查过哪个是用于Unix/MacOS X/Solaris的,或者哪个可以用于Linux?这听起来很有趣,所以我在我的Ubuntu13.04上试用了它,得到了
未找到的命令:pidstat
。结果是默认情况下没有包含它,所以我必须
sudo apt获得install sysstat
。(仅提及通过谷歌搜索和/或apt文件搜索来拯救其他路人……)