【发布时间】:2016-03-03 09:37:03
【问题描述】:
我们希望通过检测 Linux 系统上的 read() 和 write() 例程来测量应用程序的 I/O 时间。但是,对 write() 的调用返回非常快。根据我的操作系统手册页进行写入(man 2 write):
注意事项 write() 的成功返回并不能保证数据已提交到磁盘。事实上,在一些越野车上 实现,它甚至不保证空间有 成功地 为数据保留。唯一可以确定的方法是在完成所有数据写入后调用 fsync(2)。
截至 2013 年 1 月 27 日的 Linux 手册
所以我们知道 write() 调用会启动一个异步调用,该调用在某些时候会将数据刷新到磁盘。
所以问题是,有没有办法知道数据(即使它已被分组以用于缓存目的)实际写入磁盘的时间? -- 最好是该过程何时开始和结束?
EDIT1 我们对测量应用程序行为特别感兴趣,我们希望通过将参数更改为 open()(添加 O_SYNC)或注入来避免更改应用程序的语义调用同步()。通过更改应用程序语义,您无法真正了解原始应用程序的行为。
【问题讨论】:
-
“提交到磁盘”一直是一个难以捉摸的过程。最初,人们无法“知道”它何时发生,因为机器人必须取出正确的存储磁带,将其插入写入器,写入,然后再次取出磁带。如今,涉及多层缓冲和缓存,可能早在您自己的程序中就开始了,一直延伸到硬盘控制器上的临时RAM。
-
我已经扩展了这个问题,因为我们对更改应用程序语义不感兴趣。
-
@BasileStarynkevitch,我认为第一句话回答了你的问题。我们要测量应用程序 I/O 时间。