我正在研究模拟模型,我想确定何时存储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
但是,这当然是非常愚蠢的,因为执行的持续时间可能与CPU使用率有关,而不是与HDD的使用有关,所以除非在那段时间内使用HDD为100%,否则测量像这一点。
那么,我如何测量命令的IOPS?
答案 0 :(得分: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
但是,我想提请您注意手册页,其中列出了用于自定义输出格式的-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次,但第二次运行仅停止一次。第一个数字是可信的,因为我的~/Maildir
中有124个目录:目录的读取和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
将其与/usr/bin/time
相结合,可以让您构建所需的脚本,以对您感兴趣的命令进行基准测试。
作为一个未成年人,使用tee(1)因为这不起作用:
sudo echo 3 >/proc/sys/vm/drop_caches
原因?虽然echo(1)以root身份运行,但重定向与普通用户帐户相同,后者没有drop_caches
的写入权限。 tee(1)以root身份有效地进行重定向。
答案 1 :(得分:8)
iotop
命令收集有关Linux上进程的I / O使用信息。默认情况下,它是一个交互式命令,但您可以使用-b
/ --batch
以批处理模式运行它。此外,您还可以使用-p
/ --pid
的流程列表。因此,您可以使用以下命令监视git
命令的活动。
$ sudo iotop -p $(pidof git) -b
您可以使用-d
/ --delay
更改延迟。
答案 2 :(得分:4)
您可以使用pidstat:
pidstat -d 2
更具体地说,pidstat -d 2 | grep COMMAND
或pidstat -C COMMANDNAME -d 2
pidstat
命令用于监视当前由Linux内核管理的各个任务。如果使用选项-p ALL,它会为使用选项-p选择的每个任务或Linux内核管理的每个任务写入标准输出活动。不选择任何任务等同于指定-p ALL,但只有活动任务(具有非零统计值的任务)才会显示在报告中。
pidstat命令还可用于监视所选任务的子进程。
-C commDisplay仅命令名称包含stringcomm的任务。该字符串可以是正则表达式。