11

我正在研究一个模拟模型,我想确定存储 IOPS 容量何时成为瓶颈(例如,HDD 的 IOPS 约为 150,而 SSD 的 IOPS 可能为 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?

4

3 回答 3

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计算进程放弃其 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 次,但第二次运行只停止了一次。第一个数字是可信的,因为 my 中有 124 个目录~/Maildir:读取目录和 inode 大约为每个目录提供 2 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 身份有效地进行重定向。

于 2014-07-01T20:35:30.903 回答
8

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

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

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

于 2014-07-01T20:55:47.680 回答
6

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

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

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

于 2014-07-01T18:27:36.237 回答