【问题标题】:How can I know when data is written to disk?我如何知道数据何时写入磁盘?
【发布时间】: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 时间。

标签: linux file-io io


【解决方案1】:

您可以以 O_SYNC 的形式打开文件,这在理论上意味着在数据写入磁盘之前写入不会返回。虽然 什么 数据(真实数据或元数据)被写入取决于文件系统及其安装方式。不过,这正在改变您的应用程序的实际工作方式。

如果您真的有兴趣自己处理实际的 I/O 来存储(您是数据库吗?),那么 O_DIRECT 让您控制。同样,这是行为上的改变,并对您的应用程序施加了额外的限制。它可能是您需要的,也可能不是。

您似乎真的在询问对实际性能进行基准测试,所以真正的问题是您想知道什么。由于一个真实的系统做了如此多的缓存,从你的应用程序实际延迟的意义上来说,写入的“即时”返回是“真实的”。如果您正在寻找 I/O 吞吐量,您最好查看更高级别的系统统计信息。

【讨论】:

  • 我对基准测试应用程序感兴趣,我根本不想更改应用程序语义。否则,衡量的和实际的执行官会有所不同。
  • 在这种情况下,您的应用程序在系统调用中所花费的时间正是您测量的时间。缓存使调用变得更短,这是应该的。
【解决方案2】:

您基本上无法知道数据何时真正写入磁盘,并且实际的磁盘写入可能会在您的进程终止后很长时间(通常是几分钟)发生。此外,您的磁盘本身(在磁盘控制器内部)有一些缓存。对此感到满意,因为您系统的 page cache 非常有效(并使您的 Linux 系统运行迅速)。

您可能会考虑调用sync(2) 系统调用,但您通常不应该这样做(它可能很慢,并且仍然不保证任何写入,它通常会要求内核稍后刷新缓冲区)。

在给定的打开文件描述符上,您可以考虑fsync(2)。作为Joe answered,您可以将O_SYNC 传递给open,但这会降低系统速度。

我强烈建议(出于性能原因)信任您的内核页面缓存管理并避免手动强制任何磁盘刷新。另请参阅相关的 posix_fadvise(2)madvise(2) 系统调用。

如果您对某个程序进行基准测试,请将其运行多次(并考虑对您最重要的因素:测量时间的平均值 - 可能排除最好和/或最差的时间 - 或者最差或最好的时间)其中)。所以重点是应用程序的 I/O 时间(或 CPU 时间,或经过的实时时间)是非常模棱两可的。您可能想在发布基准测试结果时解释您的基准测试过程。

【讨论】:

    【解决方案3】:

    您可以参考此链接。它可能会帮助你。 Flush Data to disk

    就写入磁盘而言,它是不可预测的。没有确切的方法来告诉它。但是你可以通过调用sync来确保数据写入磁盘。

    【讨论】:

    • 感谢您的链接,但我正在寻找一种方法来衡量写作发生的时间。我对通过添加“多余的调用”来改变应用程序的语义不感兴趣,否则测量的和真正的执行者会有所不同。
    • 好吧,就像我提到的那样,没有确定的方法可以确保将数据立即写入磁盘。以下链接重新执行了同一点。 stackoverflow.com/questions/20215516/… 因此,要么您必须使用同步功能并稍微干扰您的环境,要么使用您获得的任何数据。
    猜你喜欢
    • 2021-01-10
    • 2018-11-07
    • 1970-01-01
    • 2014-06-03
    • 2014-11-22
    • 2013-08-10
    • 2011-12-13
    • 2013-05-04
    • 1970-01-01
    相关资源
    最近更新 更多