MTP 장치를 사용할 때 rsync가 왜 그렇게 느린가요?

MTP 장치를 사용할 때 rsync가 왜 그렇게 느린가요?

SM-A510F내 휴대폰(Samsung A5 2016 정도 ) 의 정기 백업을 사용하기 위해 rsync다음 명령을 사용했습니다.

rsync --verbose --progress --omit-dir-times --no-perms --recursive --inplace --progress /run/user/1000/gvfs/mtp\:host\=%5Busb%3A002%2C018%5D/Phone/ /data/phone_back_folder/
  • 1000분명히 내 사용자의 UID는
  • mtp\:host\=%5Busb%3A002%2C018%5D설치할 때 내 전화기에 제공된 임시 MTP 호스트 이름입니다(장치가 설치될 때마다 어떻게든 변경됩니다).
  • --omit-dir-times--no-permsMTP가 분명히 이 작업을 수행하지 않기 때문에 여기에 있습니다 .

해당 플래그를 사용하므로 --progress각 파일의 예상 전송 속도를 볼 수 있습니다. 예를 들면 다음과 같습니다.

Phone/DCIM/Camera/20180408_184356.jpg
      2,814,075 100%   16.58MB/s    0:00:00 (xfr#265, to-chk=821/1262)

그러나 대부분의 경우 시스템이 다음 파일 전송을 기다리며 유휴 상태인 것처럼 보이기 때문에 이 숫자는 정말 놀랍습니다.

$ dstat -cd --disk-util --disk-tps
----total-cpu-usage---- -dsk/total- sda--sdb--sdc- -dsk/total-
usr sys idl wai hiq siq| read  writ|util:util:util|reads writs
  6   1  93   0   0   0| 344k  166k|0.03:0.37:1.43|   5     6 
  2   0  98   0   0   0|4096B    0 |   0:   0:   0|   0     0 
  3   0  97   0   0   0|   0    52k|   0:1.20:   0|   0     2 
 13   1  87   0   0   0|   0     0 |   0:   0:   0|   0     0 
  3   1  96   0   0   0|   0     0 |   0:   0:   0|   0     0 
  3   0  97   0   0   0|   0   152k|0.80:   0:   0|   0     2 
  3   0  97   0   0   0|   0   648k|   0:3.20:   0|   0    78 
  4   0  96   0   0   0|   0     0 |   0:   0:   0|   0     0 
  3   0  97   0   0   0|   0     0 |   0:   0:   0|   0     0 
  7   1  92   0   0   0|   0     0 |   0:   0:   0|   0     0 
  5   0  94   0   0   0|   0     0 |   0:   0:   0|   0     0 
  6   1  94   0   0   0|   0    12k|   0:0.40:   0|   0     2 
  6   1  93   0   0   0|   0     0 |   0:   0:   0|   0     0 
  6   0  94   0   0   0|   0     0 |   0:   0:   0|   0     0 
  7   1  91   0   0   0|   0   188k|   0:0.80:   0|   0     3 
  4   1  95   0   0   0|   0     0 |   0:   0:   0|   0     0 
  4   0  96   0   0   0|4096B   44M|8.80:   0:   0|   1   189 
  7   1  92   0   0   0|   0   172k|   0:3.20:   0|   0    18 
  6   1  93   0   0   0|   0     0 |   0:   0:   0|   0     0 
  3   0  96   0   0   0|   0     0 |   0:   0:   0|   0     0 
  6   1  93   0   0   0|   0     0 |   0:   0:   0|   0     0 
  6   0  93   0   0   0|   0     0 |   0:   0:   0|   0     0 
  7   2  91   0   0   0|   0   116k|   0:0.80:   0|   0     4 
  5   1  94   0   0   0|   0     0 |   0:   0:   0|   0     0 
  3   1  96   0   0   0|   0     0 |   0:   0:   0|   0     0 
  4   0  96   0   0   0|   0     0 |   0:   0:   0|   0     0 
  4   1  95   0   0   0|   0     0 |   0:   0:   0|   0     0 
  5   0  94   0   0   0|   0     0 |   0:   0:   0|   0     0 
  5   0  94   0   0   0|   0   224k|   0:0.80:   0|   0     3 
  5   1  93   0   0   0|   0     0 |   0:   0:   0|   0     0 
  5   1  95   0   0   0|   0     0 |   0:   0:   0|   0     0 
 12   3  85   0   0   0|   0     0 |   0:   0:   0|   0     0 
  8   1  91   0   0   0|   0   604k|   0:   0:   0|   0    59 
  5   0  94   0   0   0|   0    84k|   0:1.20:   0|   0     2 
  5   0  94   0   0   0|   0     0 |   0:   0:   0|   0     0 
  4   0  96   0   0   0|   0     0 |   0:   0:   0|   0     0 
  3   0  97   0   0   0|   0     0 |   0:   0:   0|   0     0

업데이트: MTP 장치를 제거하고 다시 설치한 후 다시 실행했는데 dstat더 빠르게 부팅되었으며 대부분의 시간 동안 유휴 상태로 돌아갔습니다.

$ dstat -cd --disk-util --disk-tps
----total-cpu-usage---- -dsk/total- sda--sdb--sdc- -dsk/total-
usr sys idl wai hiq siq| read  writ|util:util:util|reads writs
  5   1  94   0   0   0| 219k  603k|0.02:0.36:1.59|   3     7 
  6   3  90   1   0   0|  12k   25M|   0:   0:12.8|   3    44 
  5   2  86   7   0   0|   0    41M|   0:   0:64.0|   0    68 
  5   3  92   0   0   0|4096B 2744k|   0:2.00:1.60|   1   101 
  5   2  92   0   0   0|  20k    0 |   0:   0:3.60|   5     0 
  5   2  92   0   0   0|  16k    0 |   0:   0:2.40|   4     0 
  6   3  90   1   0   0|  12k   17M|   0:   0:14.0|   3    27 
  5   2  78  14   0   0|  12k   69M|   0:   0:92.0|   3   113 
  7   2  90   0   0   0|  12k    0 |   0:   0:2.80|   3     0 
  5   3  92   0   0   0|  12k   68k|   0:0.40:2.00|   3     2 
  6   2  92   0   0   0|  20k    0 |   0:   0:2.40|   5     0 
  5   2  94   0   0   0|4096B    0 |   0:   0:0.80|   1     0 
  3   1  91   5   0   0|   0    62M|   0:   0:45.2|   0   106 
  4   1  90   6   0   0|   0  2500k|   0:1.20:49.6|   0    67 
  4   1  95   0   0   0|   0   104k|   0:0.40:   0|   0     2 
  4   1  95   0   0   0|   0   192k|   0:0.80:   0|   0     3 
  4   2  94   0   0   0|   0    28k|0.40:   0:   0|   0     3 
  4   1  95   0   0   0|   0    40k|   0:   0:2.40|   0     2 
  4   1  95   0   0   0|   0     0 |   0:   0:   0|   0     0 
  4   2  94   0   0   0|   0     0 |   0:   0:   0|   0     0 
  4   1  95   0   0   0|   0    48k|   0:0.40:   0|   0     2 
  3   1  95   0   0   0|   0    16k|   0:   0:   0|   0     4 
  4   1  95   0   0   0|   0     0 |   0:   0:   0|   0     0 
  4   1  96   0   0   0|   0     0 |   0:   0:   0|   0     0 
  4   2  94   0   0   0|   0   332k|   0:   0:   0|   0    59 
  4   1  95   0   0   0|   0     0 |   0:   0:   0|   0     0 
  3   1  96   0   0   0|   0     0 |   0:   0:   0|   0     0 
  4   2  95   0   0   0|   0    16k|   0:0.80:   0|   0     2 
  3   1  96   0   0   0|   0     0 |   0:   0:38.4|   0     0 
  6   2  92   0   0   0|   0   104k|   0:   0:10.4|   0    14 
  5   2  93   0   0   0|   0     0 |   0:   0:   0|   0     0 
  4   1  95   0   0   0|   0     0 |   0:   0:   0|   0     0 
  3   1  95   0   0   0|   0   448k|   0:   0:   0|   0     1 
  3   1  95   0   0   0|   0    48k|   0:0.80:   0|   0     2 
  3   1  96   0   0   0|   0    32k|   0:   0:   0|   0     7 
  4   1  94   0   0   0|   0   548k|   0:2.00:   0|   0    66 
  4   1  95   0   0   0|   0    92k|   0:1.60:   0|   0     9 
  3   1  96   0   0   0|   0    28k|   0:1.20:   0|   0     3 
  7   1  92   0   0   0|   0     0 |   0:   0:   0|   0     0 
  3   2  95   0   0   0|   0     0 |   0:   0:   0|   0     0 
  3   1  96   0   0   0|   0     0 |   0:   0:   0|   0     0 
  3   1  96   0   0   0|   0   384k|   0:   0:   0|   0    44 
  4   2  95   0   0   0|   0    60k|   0:0.80:   0|   0     2 
  3   1  96   0   0   0|   0     0 |   0:   0:2.40|   0     0 
  3   1  96   0   0   0|   0  2560k|   0:   0:47.6|   0     5 
  4   2  94   0   0   0|   0     0 |   0:   0:   0|   0     0 
  3   2  95   0   0   0|   0   520k|   0:0.40:   0|   0    48 
  3   1  96   0   0   0|   0     0 |   0:   0:   0|   0     0

모든 것이 잘 작동하는지, 그리고 어느 쪽이든 MTP 전송이 특히 rsync.

이 속도에서는 (이전 백업 없이) 휴대폰의 데이터를 백업하는 데 몇 시간이 걸리는 것 같은데, 이는 실제로 제가 할 수 있는 전체 백업이 아닙니다. 이는 증분 백업에는 허용될 수 있지만 여기서는 문제가 되지 않습니다.

참고로 지난번에 Shotwell 같은 도구를 이용해 사진 백업을 시도했을 때(얼마 전) 시간이 그리 오래 걸리지는 않았던 것 같습니다(그러나 크게 신경쓰지는 않았습니다).

  • MTP 액세스를 처리하기 위해 다른 라이브러리를 사용하는 것 외에 무엇이 다른가요?
  • Linux에서 MTP 지원의 현재 상태는 무엇입니까? FUSE를 사용하여 MTP 장치를 설치하는 사람들이 있다는 이야기를 들었지만 jmtpfs항상 문제가 없는 것은 아닙니다.
  • 내가 틀렸다면 정정하십시오. 그러나 gvfs그것은 libmtp뒤에서 사용되는 것 같습니다.

시스템 및 기계 세부정보

$ uname -svro
Linux 4.9.0-8-amd64 #1 SMP Debian 4.9.144-3.1 (2019-02-19) GNU/Linux

$ lsusb | grep MTP
Bus 002 Device 018: ID 04e8:6860 Samsung Electronics Co., Ltd Galaxy (MTP)

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 238.5G  0 disk 
├─sda1   8:1    0 107.8G  0 part /
├─sda2   8:2    0  13.5G  0 part [SWAP]
├─sda3   8:3    0   500M  0 part 
└─sda4   8:4    0 116.7G  0 part 
sdb      8:16   0 119.2G  0 disk 
└─sdb1   8:17   0 119.2G  0 part /home
sdc      8:32   0   2.7T  0 disk 
└─sdc1   8:33   0   2.7T  0 part /data
  • 내 휴대폰의 데이터는 sdc1하드 드라이브의 유일한 파티션에 기록됩니다.

  • 보시다시피, 이곳은 루트 파일 시스템과 스왑 영역(및 여기 와 sda관련이 없는 기타 파티션 )이 있는 곳이지만 내 디렉터리 전용입니다 .sda3sda4sdbhome

답변1

MTP는 오래된 프로토콜이며 휴대폰 제조업체는 게으르고 일반적으로 참조 구현을 구현합니다(매우 빠르게 제공됩니다!). MTP는 처음부터 빠르도록 설계되었기 때문에 느립니다.

그 외에도 rsync는 기존 파일과 비교하기 위해 모든 파일을 검색해야 하며 드라이버는 파일 목록을 파일 시스템으로 에뮬레이션하려고 시도하므로 실제 MTP 목록에 도달하기 전에 더 추가할 수도 있습니다. 여러 레이어를 사용하면 시간이 걸립니다. rsync가 찾은 각 파일에 대해 복사할 파일 목록에 추가되고 남은 시간이 다시 추정됩니다. 다음 발견을 찾으면 목록이 길어지고 추정치가 늘어납니다.

모든 이미지를 임시 폴더에 복사한 다음 임시 폴더와 저장 폴더 간에 재동기화할까요?

답변2

rsync는 open(2), lseek(2), read(2) 및 write(2)와 같은 시스템 호출과 함께 POSIX 스트림 기반 입력 및 출력 모델을 사용하는 반면 MTP는 더 높은 수준의 개체 기반 프로토콜입니다. "개체 복사"와 같은 작업. MTP는 부분적으로 수정된 파일에 대한 지원이 부족하므로 해당 POSIX 기능을 비효율적으로 시뮬레이션하려면 MTP 프로토콜 수단을 사용해야 합니다.

많은 수의 파일을 MTP 드라이브에 복사하려면 그놈 파일 관리자를 사용하고 폴더를 마우스 오른쪽 버튼으로 클릭한 다음 "복사 위치"를 선택하는 것이 좋습니다. 이는 더 높은 수준의 MTP 파일 복사 작업을 사용하며 rsync보다 훨씬 빠릅니다.

이러한 호환성 이유(파일 이름, 권한, 타임스탬프 등)로 인해 MTP는 Linux 시스템의 데이터를 백업하는 데 적합하지 않습니다.

관련 정보