【问题标题】:xfs - how to not modify mtime when writing to file?xfs - 写入文件时如何不修改 mtime?
【发布时间】:2011-06-26 00:04:41
【问题描述】:

我有一个文件,a.dat,它是 1GB 并且驻留在磁盘上。出于性能原因,我重用此文件并根据需要简单地覆盖其内容,而不是创建一个新文件并让它增长(每个增长操作都必须在 inode 中更新其大小)。

我试图挤出更多的性能,并在手册页中搜索了 openmount 以试图找出文件的 mtime 和 ctime 何时更新。据我了解,每次更改文件内容时,都会更新 mtime 和/或 ctime。 xfs 是这样工作的吗?

如果是这样,有没有办法在 linux 上禁用它?我不关心 mtime 和 ctime 并且宁愿不承担每次写入操作更新它们的成本。

最终,我将完全摆脱文件系统并直接写入设备,但同时我希望有一种方法可以使用文件系统来做到这一点。

根据回答进行编辑

为澄清起见,我正在写入 SSD,并且从 SSD 中挤出我可以执行的所有操作非常重要。 SSD 理论上每秒可以处理大约 25K 次操作,这些操作对我来说都很重要。除了写入我的文件之外,我不希望它们中的任何一个被浪费在任何事情上。在那张纸条上,实际上我的磁盘上有 200 个 1GB 文件正在写入。我试图用上面的问题来简化问题。

此外,每次写入都必须是同步的,并且我的程序将不会继续,直到我确定这些位在磁盘上(这可能的)。但我认为这个注释与问题无关。

【问题讨论】:

  • 祝你好运!但是为什么这被标记为 C++?
  • 我正在使用 c/c++ 进行编码。我想它不一定特定于任何语言,但 c 解决方案将是最有用的。

标签: linux filesystems xfs


【解决方案1】:

有关 mtime 和 ctime 的语义,请参阅man 2 stat。实际上,mtime 和 ctime 将在 inode 的内存副本中更新,并异步刷新到磁盘。

如果没有主要的内核黑客,你不能跳过 inode 中的 mtime 更新,如果你真的认为从一个 32 位计数器复制到另一个内存位置会减慢你的速度,那么你错误地试图优化 @ 的快速部分987654323@.

想要提高 1GB 文件的文件写入性能?为块缓存添加更多内存以使用并忘记 mtime。

为回应评论而添加

同步写入不会提供任何有意义的安全性,因为同步不会帮助在磁盘写入过程中拔掉电源线;这就是为什么使用像 xfs 和 ext3+ 这样的日志文件系统的原因。你所能期望的最好的就是面对失败时的一致性。

您似乎希望确定所记录的数据是一成不变的,即使您使用电池支持的 SRAM 写入缓冲区构建 RAID,这从根本上来说也是不可能的,因为在提交位之前可能总是失败。与日志文件系统相比,写入原始卷提供的保护更少。

如果您在问题中阐明您的设计意图,可能会有更好的答案。在直觉层面上,即使写入时间更长,对于一个 1GB 的小文件来说,闪存在我看来比旋转氧化物更不容易发生故障,但这不是一个正式的声明。

【讨论】:

  • 如果我需要所有写入同步,那么添加块缓存也无济于事,这样我就可以随时从故障中恢复。我不是要优化内存副本,而是要尽量减少 inode 刷新到磁盘的次数。我不确定它是在每次修改操作中发生还是定期发生。显然,在每次修改操作时刷新它会放大我对磁盘的写入。听起来你说的情况并非如此。我将查看 stat 语义,看看它是否对我有帮助。
  • 感谢您的澄清。 SSD 对我来说是未知的,所以我假设您使用的是传统驱动器。这篇文章貌似有道理:zdnet.com/blog/perlow/…
  • 感谢您的链接。我仍在研究它,但看起来你可能是对的,即使在同步写入(使用 O_DIRECT 或 O_SYNC)中,mtime 并不总是写入磁盘,只是定期写入。这对我来说是个好消息。不过,我仍在努力确认。
猜你喜欢
  • 2019-07-12
  • 1970-01-01
  • 2023-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 2014-03-25
相关资源
最近更新 更多