디렉토리에 1000000 4-20 kb 파일이 있습니다. 그 디렉토리를 복사해야합니다. 그러나 각 파일을 찾아야하므로 시간이 오래 걸립니다.
속도를 높일 수있는 방법이 있습니까?
나는 현재이 파일들이 차지하는 디스크 블록을 얻을 수 있다면, 그것들을 정렬하고, 가까운 블록을 병합하고 (순차적 읽기가 종종 추구하는 것보다 빠릅니다) 블록을 읽고 RAM에 있도록 할 수 있다고 생각합니다 복사하기 전에 캐시 (32GB RAM이 있음).
그러나 그것이 작동하려면 파일이있는 블록을 식별하는 방법이 필요합니다.
자기 장치에서 EXT4를 사용하고 있습니다 (예 : SSD가 아님).
편집하다:
이것은 작동해야하지만 작동하지 않습니다.
ls |
parallel -IOO --pipe "sudo parallel -j100 hdparm --fibmap {}'|tail -n +5'" |
sort -nk 2 |
perl -ane 'if($u+10000 < $F[1]) { print "$l ",($u-$l),"\n"; $l=$F[1] } $u=$F[2]' |
sudo parallel --colsep ' ' dd if=/dev/sda1 skip={1} bs=512 count={2} '| cat >/dev/null'
큰 파일에서 테스트 할 때는 파일을 캐시하지 않습니다.
편집 2 :
다음은 몇 가지 벤치 마크입니다. echo 3 >/proc/sys/vm/drop_caches
각 실행 사이에 캐시가 플러시되었습니다 ( ). 로 측정 완료 iostats -dkx 5
.
rsync -Hav foo/ bar/: 1800 KB/s
cp -a foo/ bar/: 3600 KB/s
cat sort-by-inode | parallel -j1 -X cp foo/{} bar/: 5000 KB/s
cat sort-by-inode | shuf | parallel -j1 -X cp foo/{} bar/: 3000 KB/s
cat sort-by-inode | shuf | parallel -j10 -X cp foo/{} bar/: 7000 KB/s
cat sort-by-inode | parallel -j10 -X cp foo/{} bar/: 8000 KB/s
cat sort-by-inode | parallel -j100 -X cp foo/{} bar/: 9000 KB/s
cat sort-by-inode | parallel -j500 -X cp foo/{} bar/: 10000 KB/s
그래서 우리는 그로부터 무엇을 배울 수 있습니까?
inode를 기준으로 정렬하는 것이 좋습니다. 그러나 여러 개의 병렬 처리 cp
를 수행하면 성능이 더욱 향상됩니다. 소스 foo/
가 자기 디스크라는 점을 강조 할 가치가 있으므로, I / O를 단일 스핀들로 병렬화하면 I / O 속도가 빨라지지 않는다는 신화를 공격 할 수 있습니다.
cp -r /mnt/dir1 /mnt/dirdest
또는 비슷한 것 cp /mnt/dir1/* /mnt/dirdest
?