我有一个1GB的文件a.dat
,它位于磁盘上。出于性能原因,我重用这个文件,并根据需要简单地覆盖它的内容,而不是创建一个新文件并让它增长(每个增长操作都必须更新inode中的大小)。
我正试图挤出更多的性能,并在手册页中搜索打开和装载,试图找出文件的mtime和ctime何时更新。据我所知,每次更改文件内容时,mtime和/或ctime都会更新。xfs就是这样工作的吗?
如果是,有没有办法在linux上禁用它?我不在乎mtime和ctime,也不愿意每次写操作都更新它们。
最终,我将完全摆脱文件系统,直接写入设备,但与此同时,我希望有一种方法可以用文件系统做到这一点。
根据回答进行编辑
为了澄清,我写信给SSD,从SSD中挤出我能做的每一项操作都非常重要。SSD理论上每秒可以处理25K次操作,每一次操作对我来说都很重要。我不想把它们浪费在写入文件之外的任何事情上。在这一点上,实际上我的磁盘上有200个1GB的文件,我正在写。我试图用上面的问题来简化这个问题。
此外,每次写入都必须是同步的,在我确定位在磁盘上之前,我的程序不会继续(是可能的)。但我认为这个注释与这个问题无关。
有关mtime和ctime的语义,请参阅man 2 stat
。在实践中,mtime和ctime将在inode的内存副本中更新,并异步刷新到磁盘。
如果没有主要的内核技巧,你就无法跳过inode中的mtime更新,如果你真的认为从一个32位计数器复制到另一个内存位置会减慢速度,那么你就错误地试图优化write(2)
的快速部分。
想要提高1GB文件的文件写入性能吗?为块缓存添加更多内存以供使用,并忘记mtime。
添加以回应评论
同步写入在任何意义上都不会提供安全性,因为同步对磁盘写入中间的电源线没有帮助;这就是为什么使用像xfs和ext3+这样的日志文件系统。你所能期望的最好的就是在失败面前保持一致。
您似乎希望记录的数据是铁石心肠的,这从根本上来说是不可能的,即使您构建了一个带有电池支持的SRAM写入缓冲区的RAID,因为某些东西在提交位之前总是会出现故障。写入原始卷提供的保护甚至比日志文件系统更少。
如果你在问题中明确你的设计意图,也许会有更好的答案。在直觉层面上,尽管写入时间更长,但对于一个微不足道的1GB文件来说,闪存比旋转氧化物更不容易发生故障,但这并不是一个正式的声明。