我注意到顺序覆盖现有文件可能比写入新文件慢得多。例子:
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=1
以fio
查看相同的效果,而无需先前fio
运行。另外,当重复非覆盖测试时,不要忘记删除任何以前的临时文件。
我在 xfs 和 ext4 上结合硬件 RAID 控制器(具有电池支持的写入缓存)对此进行了测试,并在两个文件系统上看到了类似的效果。这意味着,写入新文件时,速度约为 200 - 260 MB/s,而覆盖现有文件时,速度仅为 70 MB/s 左右。
在网上搜索时,我主要找到与bonnie++
其中包括“重写”测试相关的报告。这些报告还表明,一般来说,重写速度较慢。
答案1
我相信这是由于碎片和解析造成的:您需要解析哪些扇区文件驻留在其中并按顺序覆盖它们,而写入新文件允许分配连续的扇区块。
答案2
可能是在进行覆盖时逐出缓存导致了该问题。如果你跑
echo 3 > /proc/sys/vm/drop_caches
在进行覆盖之前以 root 身份进行操作是否会带来改进?