기존 파일을 순차적으로 덮어쓰는 것이 새 파일을 쓰는 것보다 훨씬 느릴 수 있다는 것을 알았습니다. 예:
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
하드웨어 RAID 컨트롤러(배터리 지원 쓰기 캐시 포함)를 사용하여 xfs 및 ext4에서 이를 테스트한 결과 두 파일 시스템 모두에서 유사한 효과를 확인했습니다. 즉, 새 파일을 쓸 때 속도는 약 200~260MB/s인 반면, 기존 파일을 덮어쓸 때는 속도가 약 70MB/s에 불과합니다.
bonnie++
온라인으로 검색할 때 주로 "재작성된" 테스트 포함과 관련된 보고서를 찾았습니다 . 또한 이러한 보고서는 일반적으로 다시 쓰기가 더 느리다는 것을 나타냅니다.
답변1
나는 이것이 조각화와 구문 분석 때문이라고 생각합니다. 파일이 있는 섹터를 구문 분석하고 순차적으로 덮어써야 하는 반면, 새 파일을 작성하면 연속된 섹터 블록을 할당할 수 있습니다.
답변2
덮어쓰는 동안 캐시 제거로 인해 문제가 발생할 수 있습니다. 당신이 달리면
echo 3 > /proc/sys/vm/drop_caches
덮어쓰기 전에 루트로 작업하는 것이 개선됩니까?