-1

我有一个过程,比如说“A”,它的工作是将三个 4 GB 文件复制到一个临时文件中,然后通过覆盖现有文件来重命名它。“A”每 15 分钟执行一次。CentOS 版本为 2.6.32-504.23.4

boost::filesystem::copy_file()
rename()

现在我确定 copy_file() 只需要 5 秒,因为我有打印时间戳的代码。然而,似乎整个操作与 rename() 一起花费了 3 分钟以上。

所以我的问题是,文件的内容是在什么时候从内存写入磁盘的?我没有观察到复制的文件在任何时候都具有零大小。ext4 挂载带有默认选项。我之间也没有任何其他调用,例如 fsync() 。

4

1 回答 1

0

传输 24Gb 需要 SATA SSD 不少于一分钟,可能至少需要两分钟,因此很明显,三分钟时间是真正的传输时间。

ext4 实现了延迟分配,所以当你向它写入新数据时,默认情况下它最初什么都不做,只是在以后选择的时候分配和写出数据。

ext4 还实现了一个 hack,当您进行重命名时,它会强制任何延迟的存储分配,即隐式fdatasync(). 这种 hack 变得很有必要,因为为 Linux 编写的许多代码既不关注 POSIX 也不关注可移植性,并且被编写为假定 ext3 语义。因此,当 ext4 从 ext3 放松语义时,它严重破坏了其他人的数据。由于无休止的抱怨,他们插入了 hack 让人们闭嘴,而不是强迫程序员修复他们的代码。

如果您想要更可预测的行为,请不要使用 ext4。它比 ext3 好,但这是我能说的唯一好处。强烈考虑在 Linux 上使用 XFS 甚至 ZFS。它们表现良好,并且根据 POSIX 和所有其他 Unix 实现所做的,即像您发现的那样少得多的怪癖。

于 2017-05-02T22:55:05.273 回答