rsync를 사용하여 내 컴퓨터의 일부 파일을 외장 하드 드라이브에 백업하려고 합니다. 복사는 잘 작동하지만 표준 USB 2.0의 경우에도 시간이 많이 걸립니다. USB 2.0의 경우 실제 전송 속도는 30MB/s 정도가 되어야 하는데, 제 테스트에서는 속도가 2MB/s에 도달하는 경우도 있었습니다. 제가 사용하고 있는 펜 드라이브는 32GB USB3.0, FAT32 fs입니다.
참고: 각 테스트 전에 펜 드라이브의 전체 내용을 지우고 다른 USB 포트에서도 사용해 보았습니다.
내가 사용하는 스크립트의 일부는 다음과 같습니다.
mkdir /media/eusbd0
mount -t vfat -o shortname=mixed,iocharset=utf8 /dev/sdb1 /media/eusbd0
# copy only data between date1 to date2
for dir in $(find /home/records -type d -newermt "2016-08-04" ! -newermt "2016-08-18" 2>&1); do
if [ "/home/records" != "$dir" ]; then # skip parent dir
rsync -ravP --inplace --modify-window=2 --log-file=/var/log/download_records "$dir" /media/eusbd0 > /var/log/rsync_report.txt
fi
done
#sync
umount -l /media/eusbd0
이것은 rsync 출력의 일부입니다.
sending incremental file list 2016-08-11/ 2016-08-11/gps_00000 44,179 100% 10.88MB/s 0:00:00 (xfr#1, to-chk=34/36) 2016-08-11/log 106,792 100% 101.84MB/s 0:00:00 (xfr#2, to-chk=33/36) 2016-08-11/log_cam0 5,532 100% 5.28MB/s 0:00:00 (xfr#3, to-chk=32/36) 2016-08-11/rec_2016-08-11.13_57_22.mov 3,513,782 100% 108.10MB/s 0:00:00 (xfr#4, to-chk=31/36) 2016-08-11/rec_2016-08-11.13_59_00.mov 4,281,177 100% 63.79MB/s 0:00:00 (xfr#5, to-chk=30/36) 2016-08-11/rec_2016-08-11.14_02_09.mov 3,359,207 100% 36.82MB/s 0:00:00 (xfr#6, to-chk=29/36) 2016-08-11/rec_2016-08-11.14_04_16.mov 1,877,863 100% 17.91MB/s 0:00:00 (xfr#7, to-chk=28/36) 2016-08-11/rec_2016-08-11.14_05_42.mov ........ 50,482,791 100% 114.90MB/s 0:00:00 (xfr#20, to-chk=15/36) 2016-08-11/rec_2016-08-11.15_14_53.mov 19,291,527 100% 34.52MB/s 0:00:00 (xfr#21, to-chk=14/36) 2016-08-11/rec_2016-08-11.15_18_42.mov 50,700,461 100% 58.68MB/s 0:00:00 (xfr#22, to-chk=13/36) 2016-08-11/rec_2016-08-11.15_20_20.mov ....... sent 802,030,914 bytes received 685 bytes 94,356,658.71 bytes/sec total size is 801,832,718 speedup is 1.00 tail: /var/log/rsync_report.txt: file truncated sending incremental file list 2016-08-16/ 2016-08-16/log 41,966 100% 8.77MB/s 0:00:00 (xfr#1, to-chk=16/18) 2016-08-16/obd_00000 46,798 100% 44.63MB/s 0:00:00 (xfr#2, to-chk=15/18) 2016-08-16/rec_2016-08-16.16_24_12.mov 50,649,317 100% 18.64MB/s 0:00:02 (xfr#3, to-chk=14/18) 2016-08-16/rec_2016-08-16.16_25_50.mov 25,602,242 100% 7.78MB/s 0:00:03 (xfr#4, to-chk=13/18) 2016-08-16/rec_2016-08-16.16_57_42.mov 50,496,580 100% 15.18MB/s 0:00:03 (xfr#5, to-chk=12/18) 2016-08-16/rec_2016-08-16.16_59_20.mov 50,617,906 100% 13.29MB/s 0:00:03 (xfr#6, to-chk=11/18) 2016-08-16/rec_2016-08-16.17_00_58.mov 50,759,115 100% 10.16MB/s 0:00:04 (xfr#7, to-chk=10/18) 2016-08-16/rec_2016-08-16.17_02_36.mov 50,883,325 100% 6.81MB/s 0:00:07 (xfr#8, to-chk=9/18) 2016-08-16/rec_2016-08-16.17_04_14.mov 47,995,074 100% 4.41MB/s 0:00:10 (xfr#9, to-chk=8/18) 2016-08-16/rec_2016-08-16.17_09_44.mov 50,813,636 100% 2.35MB/s 0:00:20 (xfr#10, to-chk=7/18) 2016-08-16/rec_2016-08-16.17_11_22.mov 50,953,015 100% 2.52MB/s 0:00:19 (xfr#11, to-chk=6/18) 2016-08-16/rec_2016-08-16.17_13_00.mov 50,221,069 100% 2.93MB/s 0:00:16 (xfr#12, to-chk=5/18) 2016-08-16/rec_2016-08-16.17_14_38.mov 50,445,757 100% 2.87MB/s 0:00:16 (xfr#13, to-chk=4/18) 2016-08-16/rec_2016-08-16.17_16_16.mov 51,036,959 100% 3.16MB/s 0:00:15 (xfr#14, to-chk=3/18) 2016-08-16/rec_2016-08-16.17_17_54.mov 51,056,196 100% 3.19MB/s 0:00:15 (xfr#15, to-chk=2/18) 2016-08-16/rec_2016-08-16.17_19_32.mov 50,434,922 100% 3.12MB/s 0:00:15 (xfr#16, to-chk=1/18) 2016-08-16/rec_2016-08-16.17_21_10.mov 19,456,000 100% 2.71MB/s 0:00:06 (xfr#17, to-chk=0/18) sent 701,682,372 bytes received 343 bytes 4,512,429.04 bytes/sec total size is 701,509,877 speedup is 1.00
출력에서 속도가 매우 높게 시작되고 끝으로 갈수록 느려지는 것을 알 수 있습니다. 왜 이런 일이 발생합니까?
내가 복사하는 파일은 거의 동일하며(크기가 약간 다를 수 있음) 파일 수가 100개 미만으로 매우 적습니다. 다른 펜 드라이브도 사용해 보았지만 동일한 결과를 얻었습니다.
감사해요!
새로운 실험:
동일한 파일을 복사하기 위해 rsync 대신 cpio를 사용해 보았습니다. 수정된 스크립트:
mkdir /media/eusbd0
mount -t vfat -o shortname=mixed,iocharset=utf8 /dev/sdb1 /media/eusbd0
# copy only data between date1 to date2
for dir in $(find /home/records -type d -newermt "2016-08-04" ! -newermt "2016-08-18" 2>&1); do
if [ "/home/records" != "$dir" ]; then # skip parent dir
find "$dir" -print | cpio -pdm /media/eusbd0 > /var/log/rsync_report.txt
fi
done
#sync
umount -l /media/eusbd0
복사할 데이터의 양은 약 3GB이고 필요한 cpio 시간은 900초입니다. 이는 평균 전송 속도가 3~4MB/s임을 의미합니다. rsync 속도도 이 값에 가깝기 때문에 문제는 하드웨어나 드라이버 관련인 것 같습니다.
고쳐 쓰다 다른 FAT32 형식의 펜 드라이브 3개를 사용해 보았지만 동일한 결과를 얻었습니다. 그런 다음 NTFS fs를 시도하여 30MB/s 이상의 좋은 결과를 얻었지만 불행히도 내가 소유한 4개의 USB 스틱 중 하나에서만 가능했습니다. 외장 HDD와 SSD를 사용한 다른 실험에서도 20MB/s가 넘는 꽤 좋은 결과가 나타났습니다.
전체적으로 내 마더보드(또는 드라이버)는 아마도 USB 스틱이나 FAT32 fs를 좋아하지 않을 것입니다. 전원이 켜져 있든 없든 외장 하드 드라이브는 최소한 NTFS에서 예상대로 작동합니다. 그리고 왜 이런 일이 발생하는지 모르겠습니다.
답변1
rsync
복제에 대한 최상의 솔루션은 아닙니다. 이는 파일 동기화를 위한 최상의 솔루션입니다. 대부분의 데이터 쓰기/읽기 속도는 버퍼에 따라 다릅니다. 파일에 쓰는 경우 버퍼가 채워지고 속도가 빨라집니다. 버퍼가 장치에 기록되면(버퍼 플러시) 속도가 떨어집니다. 장치의 쓰기 속도는 사양(USB 2.0 또는 3.0...)뿐만 아니라 프로토콜(구현), 드라이버, 블록 크기에 따라 달라집니다. 때로는 동기화 프로그램이 변경 사항을 먼저 검색하도록 하는 것보다 전체 파일을 복사하는 것이 더 나을 때도 있습니다. 이로 인해 오버헤드가 발생하고 로컬로 연결된 장치의 속도가 느려집니다. 네트워크를 통해 이 작업을 수행하면 상황이 달라질 수 있습니다.
답변2
일부 문제는 성능을 예측할 수 없는 값싼 USB 스틱을 사용하는 데서 발생합니다.
그러나 전송 속도가 점차 느려지는 것은 rsync의 delta-xfer 알고리즘으로 인해 발생합니다.
-W 플래그를 지정하여 이를 방지할 수 있습니다.
rsync -ravP -W "$dir" /media/eusbd0
이렇게 하면 파일이 매우 크더라도 시간이 지나도 전송 속도가 느려지지 않습니다.
그러나 문제가 있습니다. 파일이 변경되면 향후 업데이트에서 전체 파일을 다시 복사해야 하고 증분 델타를 사용할 수 없으므로 느린 소스(비효율적인 델타 xfer)를 다른 소스(문서의 전체 복사본)와 교환해야 합니다. . 어쩌면 초기 전송에 -W를 사용할 수도 있습니다.
답변3
30MB/s 꽤 빠르네요읽다플래시 드라이브의 속도(이 답변을 작성할 당시 - 몇 년 후 속도가 향상되었습니다). 쓰기 속도가 훨씬 느려집니다. (여기몇 가지 벤치마킹 사례입니다. ) 제한 요소는 USB 연결이 아니라 드라이브 물리학입니다. 그리고 개별 파일에 쓰는 것은 벤치마크에서 볼 수 있는 원시 쓰기 속도보다 느립니다. 메타데이터를 쓰는 데에도 시간이 걸립니다.
처음에 보이는 빠른 속도는 어딘가에 쓰기 버퍼에 쓰는 것입니다. 어느 시점에서 버퍼가 가득 차면 실제 디스크 쓰기 속도가 중요해집니다.
새로 포맷한 드라이브의 1/4만 채웠기 때문에 시작 지점까지 도달하지 못한 것 같지만 다른 속도 저하 효과도 볼 수 있습니다. 파일 시스템이 꽉 차서 삭제된 파일이 많은 경우 조각화되기 시작하여 여기저기에서 파일을 위한 약간의 공간을 찾는 데 시간이 더 오래 걸릴 수 있습니다. 이는 대부분 미디어 회전 문제이므로 저장에 해를 끼칩니다. 파일은 큰 연속 청크로 파일을 저장할 수 있다는 점에서 많은 도움이 됩니다. 플래시 미디어에서는 많은 부분을 사용하고 삭제된 경우 셀 간에 데이터가 분산되므로 각 셀을 전체적으로 삭제해야 하므로 많은 셀이 쓰기로 인해 부분적으로 영향을 받는 경우 많은 수의 셀을 지우고 부분적으로 다시 씁니다. 또한 회전식 미디어에서는 데이터 액세스 속도가 중심으로부터의 데이터 거리에 따라 달라지지만 플래시 드라이브에서는 모든 곳에서 동일합니다.