rsync를 느리게하려면 어떻게해야합니까?


35

고장난 USB 썸 드라이브의 내용을 복사하려고합니다. 데이터를 너무 빨리 읽으면 드라이브의 컨트롤러 칩이 과열되고 드라이브가 시스템에서 사라집니다. 이 경우 드라이브를 분리하고 1 분 정도 기다렸다가 식은 다음 다시 연결하고 사본을 다시 시작해야합니다.

드라이브의 내용에 대한 오래된 백업을 가지고 있으므로 나머지 데이터를 얻는 확실한 방법 rsync은 백업을 최신 상태로 유지하는 데 사용 하는 것이지만 "읽기 속도가 너무 빠릅니다. , 다시 시작해야합니다 "문제입니다. rsync분당 X 메가 바이트의 데이터 만 읽도록 하는 방법이 있습니까? 또는 드라이브가 사라질 때 작업을 일시 중단하고 다시 연결되면 다시 시작하도록 지시 할 수 있습니까?


24
드라이브 냉각에 대해 생각해 보셨습니까?
AEonAX

3
드라이브가 얼마나 꽉 찼습니까? 드라이브가 50 % 이상 가득 차면 고장난 드라이브를 먼저 미러링 한 다음 미러에서 더 복잡한 작업 만 처리하는 것이 좋습니다.
kasperd

1
@AEonAX : 시원하고 멋진 아이디어이지만 권장하지는 않습니다. 장치에 추가 열 스트레스를 가하면 완전히 실패 할 수 있습니다.
Piskvor

답변:


46

DopeGhoti의 경험과 달리 --bwlimit플래그는 내 rsync (v3.1.2)로 데이터 전송을 제한합니다.

테스트:

$ dd if=/dev/urandom bs=1M count=10 of=data
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0871822 s, 120 MB/s

$ du -h data
10M     data

$ time rsync -q data fast
0.065 seconds

$ time rsync -q --bwlimit=1M data slow
10.004 seconds

(참고 : 내 time출력은 대부분의 time호출 ( zsh기능) 과 다르게 보이며 그 시간은 나에 의해 편집되지 않았습니다)

그렇지 않으면 아마도 이중선 -exec을 따라 뭔가가있을 것 입니다 find. 내가 믿는rsync -R생성 및 상위 폴더를 복사해야하지만 그렇지 않은 경우, 다음 cp --parents해야한다.

$ find /failing/usb -exec rsync -R {} /somewhere/safe/ \; -exec sleep 1 \;

참고 : ddrescue 도 확인 하십시오 . 찾는 것이 맞을 수도 있습니다 :)


1
예. DG는 "대역폭"이라는 단어로 혼동되었을 수 있지만 네트워크뿐만 아니라 모든 데이터 전송 채널에 적용됩니다. 맨 페이지는 구체적으로 다음과 같이 말합니다. --bwlimit=KBPS limit I/O bandwidth; KBytes per second, 네트워크에 대한 언급은 없습니다. 부담없이 코드를 탐색하면 대상에 관계없이 읽기 속도가 제한 됩니다. 또한, 일화 : 로컬-로컬 쓰기 속도를 제한하기 위해 수년 동안 이 옵션을 사용해 왔습니다 . linux.die.net/man/1/rsync
Piskvor

1
두 번째로 보면 실제로 작성된 바이트 수를 계산하고 계산 된 시간 동안 대기합니다. io.c, 라인 832-3 : if (bwlimit_writemax) sleep_for_bwlimit(n);어쨌든, 이것은 아마도 짧은 버스트에서 읽고 중간에 자고 의도 한대로 작동 할 것입니다. 낮은 값으로 시작하여 조심스럽게 증가 시키거나 느린 전송을 밤새 실행하도록 권장합니다.
Piskvor

25

약간의 MacGyver 솔루션이지만 과거에는 성공을 거두었습니다
. 스틱과 컴퓨터 사이에 오래된 USB 1 허브를 넣으십시오. 지옥에는 방법이 없습니다. 그런 식으로 빨리 복사 할 것입니다 :-)

다른 가능성 : 다른 스틱을 사용할 수있는 경우 동일한 루트 허브에 연결된 다른 USB 포트에 꽂으십시오 (따라서 문제 스틱과 대역폭을 공유 함).
이제 여분의 스틱에 큰 쓰기 작업을 시작하여 두 스틱이 대역폭을 놓고 경쟁합니다. 추가 제어를 위해 ionice 를 사용 하여 문제 스틱의 우선 순위 를 더욱 낮출 수 있습니다 .


1
소프트웨어 솔루션을 통해 USB 커널 모듈에 옵션을 제공하여 포트를 USB 1.1로 작동시키는 방법이 있어야합니다.
André Borie

@ AndréBorie : bbs.archlinux.org/viewtopic.php?pid=1342593#p1342593 이 있지만 SW에는 효과적인 스로틀이 있기 때문에 약간의 무력 솔루션입니다.
Piskvor

@Piskvor는 USB 1 허브를 사용하는 것처럼 장치와의 낮은 전송 속도를 협상합니다. 나는 그것에 대해 "강제력"을 볼 수 없습니다.
André Borie

좋아, 단어의 나쁜 선택, 나는 인정한다. 그러나 IMHO 장치를 재구성하려면 특별한 권한 (루트 또는 적어도 % adm)이 필요하지만 프로세스 별 읽기 속도를 제어하는 ​​것이 더 간단합니다. (또한, 사양을 위반하여 USB 2.0 외부에서 전혀 작동하지 않는 장치가 있습니다)
Piskvor

13

rsync --bwlimit=RATE아래 주석을 기반으로 실제로 데이터의 읽기 속도를 조절하여 실제로 원하는 것처럼 보이는 파일 전송 속도를 조절하는 데 사용할 수 있습니다 .



3
ionice는 두 가지 사항을 읽고 있으면 기본적으로 50/50을 얻습니다. ionice는 그것을 조정할 수 있지만, 한 가지 독서 만 있으면 100 % 얻을 것입니다.
coteyr

@coteyr 당신이 맞아서 동일한 USB 루트 허브에서 2 차 대역폭 섭식 프로세스와 결합해야합니다. 내 대답을 참조하십시오.
Tonny

2
다행히도, 정답이 맞지 않습니다. --bwlimit반드시 네트워크 제한이 아니라 I / O 제한을 설정하십시오. 다양한 시나리오에서 여러 번 테스트되었습니다.이 옵션은 대상에 관계없이 rsync 자체를 read로 제한 합니다. (그들이 실패 느린 로컬 장치에 대한 빠른 쓰기가 만든 비슷한 시나리오에서이 밖으로 발견)
Piskvor

1
@piskvor-감사합니다! 그것이이 장소에서 내가 좋아하는 것입니다. 나는 새로운 것을 계속 배우고있다 (:
DopeGhoti

8

rsync --bwlimit=100100KiB / s를위한 더 많은 솔루션 .

  1. 전체 디스크 복사 옵션 ddrescue과 함께 사용하십시오 --max-read-rate. 또한 오류 후 중단 된 전체 디스크 사본을 다시 시작할 수 있습니다.

    ddrescue --max-read-rate=100K /failing/usb output.img output.logfile
    

ddrescue데이터 복구와 관련된 다른 옵션도 많이 있습니다 . 여기 매뉴얼을 참조하십시오 .

  1. 사용 pv와 ( "파이프 뷰어")를 --rate-limit옵션, 또는 throttle속도 제한 파이프에 도구입니다. pv진행 상황을 보여줄 수도 있습니다. 파이프를 사용하거나 파이프를 사용할 수있는 모든 도구에 대해이 작업을 수행 할 수 있습니다.

    tar -cf - /failing/usb | throttle -K 100 | tar -C /your/outputfolder/ -xvf -
    

    또는

    tar -cf - /failing/usb | pv --rate-limit 100k | tar -C /your/outputfolder/  -xvf -
    

    자세한 설정 및 예제 는 pv 맨 페이지 를 참조하십시오. 의 경우 속도 계산 방법을 결정하는 옵션을 throttle시도해 볼 수도 있습니다 ( 스로틀 맨 페이지-w 참조) .


유용한 도구입니다. 몰랐습니다. 감사합니다! pv맨 페이지에는 다양한 사용법의 예가 더 있습니다.
Piskvor

나는 pv테이프 떨리는 날에 다시 발견 한 이래 계속해서 계속해서 도달했습니다 . tar가 테이프 드라이브에 쓸 때 되돌아갑니다. :)
Dan Garthwaite
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.