我有一个1GB的文件a.dat
并驻留在磁盘上。出于性能原因,我重用此文件并根据需要简单地覆盖其内容,而不是创建新文件并让它增长(每个增长操作都必须在inode中更新其大小)。
我正试图挤出更多的性能,并搜索了open和mount的手册页,试图弄清楚何时更新文件的mtime和ctime。根据我的理解,每次更改文件的内容时,都会更新mtime和/或ctime。这是xfs的工作原理吗?
如果是这样,有没有办法在linux上禁用它?我不关心mtime和ctime,宁愿不承担每次写操作更新它们的成本。
最终,我将完全摆脱文件系统并直接写入设备,但与此同时我希望有一种方法可以使用文件系统。
编辑回应
为了澄清,我正在写一个SSD并且从SSD中挤出每一项操作都非常重要。理论上,SSD可以处理每秒25K操作的顺序,并且每个对我来说都很重要。除了写入我的文件之外,我不希望任何其他内容被浪费掉。在这方面,实际上我在我的磁盘上有200个1GB文件,我正在写信。我试图用上面的问题简化问题。
此外,每次写入必须是同步的,我的程序将不会继续,直到我确定这些位在磁盘上( 可能)。但我认为这个问题与这个问题相关。
答案 0 :(得分:3)
有关mtime和ctime的语义,请参阅man 2 stat
。实际上,mtime和ctime将在inode的内存中副本中更新,并异步刷新到磁盘。
如果没有主要的内核hackery,你不能跳过inode中的mtime更新,如果你真的认为从一个32位计数器到另一个内存位置的副本正在减慢你的速度,你就错误地尝试优化{的快速部分{1}}。
想要提高1GB文件的文件写入性能吗?为块缓存添加更多内存以供使用,并忘记mtime。
在回复评论时添加了
同步写入不会在任何有意义的意义上提供安全性,因为在磁盘写入过程中拉动的电源线无法通过同步帮助;这就是为什么使用像xfs和ext3 +这样的日志文件系统的原因。你可以期待的最好的是面对失败的一致性。
您似乎希望确定所记录的数据是一成不变的,即使您使用电池备份的SRAM写入缓冲区构建RAID,因为在提交位之前总是失败,这基本上是不可能的。编写原始卷可以提供比日志文件系统更少的保护。
如果您在问题中阐明您的设计意图,可能会有更好的答案。在肠道水平上,即使写入时间较长,对于一个小的1GB文件,闪存也会让我觉得比旋转氧化物更容易发生故障,但这不是一个正式的声明。