ฉันจะทำให้ rsync ช้าลงได้อย่างไร


35

ฉันกำลังพยายามคัดลอกเนื้อหาของธัมบ์ไดรฟ์ USB ที่ล้มเหลว ถ้าฉันอ่านข้อมูลเร็วเกินไปชิปคอนโทรลเลอร์ของไดรฟ์ร้อนเกินไปและไดรฟ์หายไปจากระบบ เมื่อเกิดเหตุการณ์นี้ขึ้นฉันต้องถอดปลั๊กไดรฟ์รอสักครู่เพื่อให้มันเย็นลงแล้วเสียบกลับเข้าไปใหม่และเริ่มการคัดลอกใหม่

ฉันได้รับการสำรองข้อมูลเก่าของเนื้อหาของไดรฟ์ดังนั้นวิธีที่ชัดเจนในการรับข้อมูลส่วนที่เหลือคือใช้rsyncเพื่อทำให้การสำรองข้อมูลเป็นปัจจุบัน แต่การทำงานทั้งหมด "อ่านเร็วเกินไปไดรฟ์จะหายไป และฉันต้องเริ่มต้นใหม่ "ปัญหา มีวิธีบอกrsyncให้อ่านข้อมูลเพียง X เมกะไบต์ต่อนาทีหรือไม่? หรือเป็นไปได้ที่จะบอกให้ระงับการทำงานเมื่อไดรฟ์หายไปและกลับมาทำงานอีกครั้งเมื่อเสียบกลับเข้าไปใหม่


24
คุณคิดเกี่ยวกับการระบายความร้อนของไดรฟ์
AEonAX

3
ไดรฟ์เต็มขนาดเท่าไร หากไดรฟ์เต็มมากกว่า 50% น่าจะดีกว่าที่จะสะท้อนถึงความล้มเหลวของไดรฟ์ก่อนจากนั้นเริ่มจัดการกับสิ่งที่ซับซ้อนมากขึ้นบนกระจก
kasperd

1
@AEonAX: ในขณะที่ความคิดที่ยอดเยี่ยม (sic!) ฉันไม่อยากจะแนะนำสิ่งนี้: คุณกำลังใส่ความร้อนจากอุปกรณ์เพิ่มเติมและมันอาจจะล้มเหลวอย่างสมบูรณ์
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 1.1 ผ่านทางโซลูชันซอฟต์แวร์โดยอาจให้ตัวเลือกกับโมดูลเคอร์เนล USB
André Borie

@ AndréBorie: มี - bbs.archlinux.org/viewtopic.php?pid=1342593#p1342593แต่เนื่องจากมี throttles ที่มีประสิทธิภาพใน 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 คุณพูดถูกและนี่คือเหตุผลว่าทำไมคุณต้องรวมเข้ากับกระบวนการแบนด์วิดท์ครั้งที่ 2 บน USB root-hub เดียวกัน ดูคำตอบของฉัน
Tonny

2
โชคดีที่คำตอบของคุณไม่ถูกต้อง: --bwlimitตั้งค่า จำกัด I / O ไม่จำเป็นต้องจำกัดเครือข่าย ทดสอบหลายครั้งในสถานการณ์ต่าง ๆ : ตัวเลือกนี้ทำให้ rsync จำกัด ตัวเองในการอ่านโดยไม่คำนึงถึงปลายทาง (พบสิ่งนี้ในสถานการณ์ที่คล้ายกันซึ่งการเขียนอย่างรวดเร็วไปยังอุปกรณ์โลคัลที่ช้าทำให้พวกเขาล้มเหลว)
Piskvor

1
@piskvor - ขอบคุณสำหรับสิ่งนั้น! นั่นคือสิ่งที่ฉันชอบเกี่ยวกับสถานที่แห่งนี้ ฉันเรียนรู้สิ่งใหม่ ๆ อยู่เสมอ (:
DopeGhoti

8

โซลูชันเพิ่มเติมนอกเหนือจากrsync --bwlimit=100สำหรับ 100KiB / 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 manpageเพื่อดูการตั้งค่าและตัวอย่างเพิ่มเติม สำหรับthrottleคุณอาจต้องการที่จะยังพยายามออก-wตัวเลือกซึ่งจะกำหนดวิธีการความเร็วในการคำนวณดูmanpage เค้น


ตอนนี้เป็นเครื่องมือที่มีประโยชน์ไม่รู้แล้วขอบคุณ! pvmanpage มีตัวอย่างของการใช้งานที่หลากหลายมากขึ้น
Piskvor

ฉันมาถึงpvซ้ำแล้วซ้ำอีกนับตั้งแต่ค้นพบย้อนกลับไปในวันที่ฉันจ๊อกกิ้งเทป กลับมาเมื่อ tar เขียนลงในเทปไดร์ฟ :)
Dan Garthwaite
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.