【问题标题】:How to measure IOPS for a command in linux?如何在 linux 中测量命令的 IOPS?
【发布时间】:2014-08-18 00:09:36
【问题描述】:

我正在研究一个模拟模型,我想确定存储 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?

【问题讨论】:

标签: linux git command-line benchmarking provisioned-iops


【解决方案1】:

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

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

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

【讨论】:

  • 这听起来很有趣,所以我在我的 Ubuntu 13.04 机器上试了一下,得到了command not found: pidstat。原来它默认不包括在内,所以我不得不sudo apt-get install sysstat。 (只是提到节省其他路人一些谷歌搜索和/或apt-file searching...)
【解决方案2】:

典型的 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 选项,特别是计算进程放弃其 CPU 的次数的 %w 格式I/O 的时间片:

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

请注意,第一次运行停止了 184 次 I/O,但第二次运行只停止了一次。第一个数字是可信的,因为在我的~/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 身份有效地进行重定向。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-17
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2019-12-24
      • 1970-01-01
      • 2021-07-03
      相关资源
      最近更新 更多