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

duk*_*ing 11 linux git benchmarking command-line provisioned-iops

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

到目前为止,我已经找到了像iostat这样的工具,但是,我不知道如何将报告限制为单个命令的作用.

我能想到的最好的想法是确定我的硬盘IOPS容量,在实际命令上使用时间,查看它持续多长时间,乘以IOPS,这些是我的IOPS:

HDD ->150 IOPS
time df -h

real    0m0.032s

150 * .032 = 4.8 IOPS
Run Code Online (Sandbox Code Playgroud)

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

那么,我如何测量命令的IOPS?

pnd*_*ndc 11

典型的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
Run Code Online (Sandbox Code Playgroud)

但是,我想提请您注意手册页,其中列出了-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
Run Code Online (Sandbox Code Playgroud)

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

由于Linux的磁盘缓存,第二个数字当然更低.所以最后一部分是刷新缓存.sync(1)是一个熟悉的命令,它刷新对磁盘的脏写,但不刷新读缓存.您可以通过写3来冲洗那个/proc/sys/vm/drop_caches.(其他值偶尔也有用,但你想在这里使用3.)作为非root用户,最简单的方法是:

echo 3 | sudo tee /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

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

作为一个小问题,使用tee(1)因为这不起作用:

sudo echo 3 >/proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

原因?尽管echo(1)以root身份运行,但重定向与普通用户帐户一样,后者没有写入权限drop_caches.tee(1)以root身份有效地进行重定向.


Chr*_*ier 8

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

$ sudo iotop -p $(pidof git) -b
Run Code Online (Sandbox Code Playgroud)

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


tot*_*tti 6

您可以使用pidstat:
pidstat -d 2
更具体地说,pidstat -d 2 | grep COMMAND或者pidstat -C COMMANDNAME -d 2

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

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