典型的 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 身份有效地进行重定向。