单个程序的限制因素

如果您是系统的唯一用户,可以通过使用 time 命令来获得程序是依赖于 I/O 还是依赖于 CPU 的一般概念,如下:

# time cp foo.in foo.out

real    0m0.13s
user    0m0.01s
sys     0m0.02s
注: time 命令的示例使用在 Korn shell 程序中内置的版本 ksh。 正式的 time 命令 /usr/bin/time 报告精度较低。

在上述示例中,real执行 cp 程序所耗用的时间 (0.13 秒) 显着大于用户和系统 CPU 时间之和 (.03 秒) ,这指示程序受 I/O 限制。 产生这种情况的主要原因是 foo.in 文件最近未被读取过。

SMP 上的输出具有新的含义。 请参阅 时间和时间命令的注意事项 以获取更多信息。

几秒后对同一个文件运行相同命令产生下面的输出:
real    0m0.06s
user    0m0.01s
sys     0m0.03s

大部分或所有 foo.in 文件的页面仍在内存中,因为没有干预进程来回收它们,并且文件与系统的 RAM 容量相比是很小的。 小的 foo.out 文件也在内存中缓冲,用它作为输入的程序几乎没有磁盘相关性。

如果您要尝试确定程序的磁盘相关性,那么必须确保它的输入处于真实状态。 也就是说,如果程序通常针对最近未被访问的文件运行,那必须确保在评估程序中使用的文件不在内存中。 相反,如果程序通常作为标准序列的一部分运行,在该序列中,它从上一个程序的输出获得自己的输入,那么应预先准备好内存以保证评估的真实性。 例如,下面的命令对 foo.in 文件的页面具有预先准备的内存的作用:
# cp foo.in /dev/null

如果文件相比 RAM 而言较大,情况会更复杂。 如果一个程序的输出是下一个程序的输入,并且整个文件不适合保存在 RAM 中,第二个程序就会读取文件头部的页面,这些页面取代了尾部的页面。 尽管这种情况很难进行真实模拟,但它与没有发生磁盘高速缓存的情况几乎相同。

文件可能只是稍微大于 RAM 的情况是在下一节中讨论的 RAM 与磁盘分析相对的特殊情况。