为什么覆盖文件比写入新文件慢?

为什么覆盖文件比写入新文件慢?

我注意到顺序覆盖现有文件可能比写入新文件慢得多。例子:

mkdir del
cd del
fio --name=seqwrite --rw=write --ioengine=sync --bs=128KiB --size=10GiB  --fsync=10
echo "<- fio doesn't remove its temporary file, thus, compare with: "
fio --name=seqwrite --rw=write --ioengine=sync --bs=128KiB --size=10GiB  --fsync=10

在第二次调用中,性能可能会下降 3 倍左右。

其原因何在?


或者,也可以添加--overwrite=1fio查看相同的效果,而无需先前fio运行。另外,当重复非覆盖测试时,不要忘记删除任何以前的临时文件。

我在 xfs 和 ext4 上结合硬件 RAID 控制器(具有电池支持的写入缓存)对此进行了测试,并在两个文件系统上看到了类似的效果。这意味着,写入新文件时,速度约为 200 - 260 MB/s,而覆盖现有文件时,速度仅为 70 MB/s 左右。


在网上搜索时,我主要找到与bonnie++其中包括“重写”测试相关的报告。这些报告还表明,一般来说,重写速度较慢。

答案1

我相信这是由于碎片和解析造成的:您需要解析哪些扇区文件驻留在其中并按顺序覆盖它们,而写入新文件允许分配连续的扇区块。

答案2

可能是在进行覆盖时逐出缓存导致了该问题。如果你跑

echo 3 > /proc/sys/vm/drop_caches

在进行覆盖之前以 root 身份进行操作是否会带来改进?

相关内容