测量程序的磁盘 I/O 使用情况

Ole*_*nge 14 io measure time

time 如果您想弄清楚给定命令需要多少 CPU 时间,这是一个很棒的命令。

我正在寻找类似的东西,可以测量程序和任何子项的磁盘 I/O。它最好区分缓存的 I/O(因此不会导致磁盘旋转)和未缓存的 I/O。

所以我想做:

iomeassure my_program my_args
Run Code Online (Sandbox Code Playgroud)

并获得类似于以下内容的输出:

Cached read: 10233303 Bytes
Cached write: 33303 Bytes  # This was probably a tmp file that was erased before making it to the disk
Non-cached read: 200002020 Bytes
Non-cached write: 202020 Bytes
Run Code Online (Sandbox Code Playgroud)

我看过vmstat, iostat, 和sar,但这些都不是在看一个过程。相反,他们着眼于整个系统。

我已经看过了iotop,但这只能让我看到这一瞬间。

- - 编辑 - -

snap的答案似乎很接近。

“文件系统输入:”是 512 字节块中的非缓存读取。

“文件系统输出:”是 512 字节块中的缓存写入。

您可以使用以下命令强制清空缓存:

sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null
Run Code Online (Sandbox Code Playgroud)

我测试了:

 seq 10000000 > seq
 /usr/bin/time -v bash -c 'perl -e "open(G,\">f\"); print G <>;close G; unlink \"f\";" seq'
Run Code Online (Sandbox Code Playgroud)

sna*_*nap 10

您没有指定您使用的操作系统。

Linux

time foo您可以尝试使用外部命令,而不是使用which 是(通常)内置的 shell /usr/bin/time foo。它提供了一些附加信息,例如文件系统输入和输出的数量(但没有关于缓存命中或字节数量的信息)。请参阅man timeman getrusage了解更多说明。

请注意,此功能需要 Linux 内核版本 2.6.22 或更高版本。

FreeBSD

使用/usr/bin/time -l foo. 它给出了输入和输出的数量。请参阅man timeman getrusage了解更多说明。