rsync แบบขนานโดยใช้ GNU Parallel


18

ฉันใช้rsyncสคริปต์เพื่อซิงโครไนซ์ข้อมูลที่โฮสต์หนึ่งกับข้อมูลที่โฮสต์อื่น ข้อมูลมีไฟล์ขนาดเล็กจำนวนมากที่มีส่วนร่วมเกือบ 1.2TB

เพื่อซิงค์ไฟล์เหล่านั้นฉันใช้rsyncคำสั่งดังต่อไปนี้:

rsync -avzm --stats --human-readable --include-from proj.lst /data/projects REMOTEHOST:/data/

เนื้อหาของ proj.lst มีดังนี้:

+ proj1
+ proj1/*
+ proj1/*/*
+ proj1/*/*/*.tar
+ proj1/*/*/*.pdf
+ proj2
+ proj2/*
+ proj2/*/*
+ proj2/*/*/*.tar
+ proj2/*/*/*.pdf
...
...
...
- *

จากการทดสอบฉันเลือกสองโครงการ (ข้อมูล 8.5GB) และฉันดำเนินการคำสั่งด้านบน เป็นกระบวนการต่อเนื่องมันเครื่องมือ 14 นาที 58 วินาทีให้เสร็จสมบูรณ์ ดังนั้นสำหรับข้อมูล 1.2TB จะใช้เวลาหลายชั่วโมง

ถ้าฉันจะสามารถหลายrsyncกระบวนการในแบบคู่ขนาน (ใช้&, xargsหรือparallel) ก็จะช่วยประหยัดเวลาของฉัน

ฉันพยายามด้วยคำสั่งด้านล่างด้วยparallel(หลังจากcdไอเอ็นจีไปยังไดเรกทอรีแหล่งที่มา) และใช้เวลา 12 นาที 37 วินาทีในการดำเนินการ:

parallel --will-cite -j 5 rsync -avzm --stats --human-readable {} REMOTEHOST:/data/ ::: .

สิ่งนี้น่าจะใช้เวลาน้อยลง 5 เท่า แต่ก็ไม่เป็นเช่นนั้น ฉันคิดว่าฉันจะผิดพลาดที่ไหนสักแห่ง

ฉันจะรันหลายrsyncกระบวนการเพื่อลดเวลาดำเนินการได้อย่างไร


1
คุณถูก จำกัด ด้วยแบนด์วิดท์เครือข่ายหรือไม่? ดิสก์ iops แบนด์วิดธ์ของดิสก์?
Ole Tange

หากเป็นไปได้เราต้องการใช้แบนด์วิดท์ทั้งหมด 50% แต่การคูณหลาย ๆ ตัวrsyncเป็นสิ่งที่เราให้ความสำคัญอันดับแรก
Mandar Shinde

คุณช่วยบอกให้เรารู้: แบนด์วิดท์ของเครือข่าย, ดิสก์ iops, แบนด์วิดท์ของดิสก์และแบนด์วิดท์ที่ใช้จริงหรือไม่
Ole Tange

ที่จริงแล้วฉันไม่รู้เกี่ยวกับพารามิเตอร์ข้างต้น ในขณะนี้เราสามารถละเลยส่วนการปรับให้เหมาะสม หลายrsyncs ในขนานเป็นโฟกัสหลักในขณะนี้
Mandar Shinde

ไม่มีจุดที่จะขนานกันหากข้อ จำกัด ไม่ใช่ซีพียู มันสามารถ / จะทำให้เรื่องแย่ลง (การเคลื่อนไหวของแขนดิสก์ที่ขัดแย้งบนดิสก์ต้นทางหรือดิสก์เป้าหมาย)
xenoid

คำตอบ:


16

ขั้นตอนต่อไปนี้ทำงานให้ฉันได้:

  1. รันรายการrsync --dry-runแรกเพื่อรับรายการไฟล์ที่จะได้รับผลกระทบ
$ rsync -avzm --stats --safe-links --ignore-existing --dry-run \
    --human-readable /data/projects REMOTE-HOST:/data/ > /tmp/transfer.log
  1. ฉันป้อนผลลัพธ์ของcat transfer.logเป็นparallelเพื่อรัน 5 rsyncวินาทีในแบบขนานดังนี้:
$ cat /tmp/transfer.log | \
    parallel --will-cite -j 5 rsync -avzm --relative \
      --stats --safe-links --ignore-existing \
      --human-readable {} REMOTE-HOST:/data/ > result.log

ที่นี่--relativeตัวเลือก ( ลิงก์ ) ทำให้มั่นใจได้ว่าโครงสร้างไดเรกทอรีสำหรับไฟล์ที่ได้รับผลกระทบที่ต้นทางและปลายทางยังคงเหมือนเดิม (ใน/data/ไดเรกทอรีภายใน) ดังนั้นคำสั่งจะต้องเรียกใช้ในโฟลเดอร์ซอร์ส (ตัวอย่าง/data/projects)


5
นั่นจะทำ rsync ต่อไฟล์ มันอาจจะมีประสิทธิภาพมากกว่าในการแยกรายการไฟล์ทั้งหมดโดยใช้splitและป้อนชื่อไฟล์เหล่านั้นให้ขนานกัน จากนั้นใช้ rsync --files-fromเพื่อนำชื่อไฟล์ออกจากแต่ละไฟล์และซิงค์ การสำรองข้อมูล RM. * split -l backup.list 3000 สำรองข้อมูล ls. * | ขนาน --line-buffer - verbose -j 5 rsync --progress -av - ไฟล์ - จาก {} / LOCAL / ผู้ปกครอง / เส้นทาง / REMOTE_HOST: REMOTE_PATH /
Sandip Bhattacharya

1
คำสั่ง rsync ที่สองจัดการบรรทัดใน result.log ที่ไม่ใช่ไฟล์ได้อย่างไร receiving file list ... done created directory /data/กล่าวคือ
Mike D

1
ใน rsync เวอร์ชันใหม่กว่า (3.1.0+) คุณสามารถใช้--info=nameแทน-vและคุณจะได้รับชื่อของไฟล์และไดเรกทอรี คุณอาจต้องการใช้ --protect-args ไปยัง 'Inner' การถ่ายโอน rsync เช่นกันหากไฟล์ใด ๆ ที่อาจมีช่องว่างหรือ metacharacters เชลล์ในพวกเขา
เสือชีต้า

13

โดยส่วนตัวฉันใช้สิ่งนี้ง่าย ๆ :

ls -1 | parallel rsync -a {} /destination/directory/

ซึ่งมีประโยชน์อย่างยิ่งเมื่อคุณมีไดเรกทอรีที่ไม่ได้อยู่ใกล้ ๆ มากกว่าสองสามรายการไม่เช่นนั้นคุณจะพบว่าการrsyncยกเลิกเกือบทุกครั้งและไดเรกทอรีสุดท้ายที่ทำหน้าที่เพียงอย่างเดียว


มันใช้งานได้ดี - ยากที่จะรู้ว่ามันทำอะไรหรือเปล่าดังนั้น -v ถึงขนานทำให้ช่างพูดมากขึ้น นอกจากนี้ -j 30 ถึงขนาน (เช่นก่อนคำสั่ง rsync) ทำให้มันรัน 30 งานไม่ใช่แค่หนึ่งรายการต่อซีพียูคอร์ซึ่งเป็นค่าเริ่มต้น
Criggie

12

ฉันขอกีดกันไม่ให้ใครใช้คำตอบที่ได้รับการยอมรับทางออกที่ดีกว่าคือการรวบรวมข้อมูลไดเรกทอรีระดับบนสุดและเปิดใช้งานการดำเนินการ rync ตามสัดส่วน

ฉันมีปริมาณ zfs ขนาดใหญ่และแหล่งที่มาของฉันคือเมาท์ cifs ทั้งสองเชื่อมโยงกับ 10G และในบางมาตรฐานอาจทำให้การเชื่อมโยงอิ่มตัว zpool iostat 1ผลงานของผู้ได้รับการประเมินโดยใช้

ไดรฟ์ต้นฉบับติดตั้งอยู่เช่น:

mount -t cifs -o username=,password= //static_ip/70tb /mnt/Datahoarder_Mount/ -o vers=3.0

ใช้rsyncกระบวนการเดียว:

rsync -h -v -r -P -t /mnt/Datahoarder_Mount/ /StoragePod

io meter อ่าน:

StoragePod  30.0T   144T      0  1.61K      0   130M
StoragePod  30.0T   144T      0  1.61K      0   130M
StoragePod  30.0T   144T      0  1.62K      0   130M

สิ่งนี้อยู่ในเกณฑ์มาตรฐานสังเคราะห์ (คริสตัลดิสก์) ประสิทธิภาพสำหรับการเขียนแบบต่อเนื่องใกล้ถึง 900 MB / s ซึ่งหมายความว่าลิงค์นั้นอิ่มตัว 130MB / s ไม่ดีมากและความแตกต่างระหว่างการรอวันหยุดสุดสัปดาห์และสองสัปดาห์

ดังนั้นฉันสร้างรายการไฟล์และพยายามเรียกใช้การซิงค์อีกครั้ง (ฉันมีเครื่อง 64 คอร์):

cat /home/misha/Desktop/rsync_logs_syncs/Datahoarder_Mount.log | parallel --will-cite -j 16 rsync -avzm --relative --stats --safe-links --size-only --human-readable {} /StoragePod/ > /home/misha/Desktop/rsync_logs_syncs/Datahoarder_Mount_result.log

และมันก็มีประสิทธิภาพเหมือนกัน!

StoragePod  29.9T   144T      0  1.63K      0   130M
StoragePod  29.9T   144T      0  1.62K      0   130M
StoragePod  29.9T   144T      0  1.56K      0   129M

เป็นอีกทางเลือกหนึ่งที่ฉันเรียกใช้ rsync บนโฟลเดอร์ราก:

rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/Marcello_zinc_bone /StoragePod/Marcello_zinc_bone
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/fibroblast_growth /StoragePod/fibroblast_growth
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/QDIC /StoragePod/QDIC
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/sexy_dps_cell /StoragePod/sexy_dps_cell

ประสิทธิภาพที่เพิ่มขึ้นนี้จริง:

StoragePod  30.1T   144T     13  3.66K   112K   343M
StoragePod  30.1T   144T     24  5.11K   184K   469M
StoragePod  30.1T   144T     25  4.30K   196K   373M

โดยสรุปเป็น @Sandip Bhattacharya นำขึ้นเขียนสคริปต์ขนาดเล็กเพื่อรับไดเรกทอรีและขนานที่ หรือส่งผ่านรายชื่อไฟล์ไปยัง rsync แต่อย่าสร้างอินสแตนซ์ใหม่สำหรับแต่ละไฟล์


5

วิธีการทดสอบในการทำ rsync แบบขนานคือ: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync

rsync เป็นเครื่องมือที่ยอดเยี่ยม แต่บางครั้งมันจะไม่เติมแบนด์วิดท์ที่มีให้เต็ม มักจะเป็นปัญหาเมื่อคัดลอกไฟล์ขนาดใหญ่หลาย ๆ ไฟล์ผ่านการเชื่อมต่อความเร็วสูง

ต่อไปนี้จะเริ่มต้นหนึ่ง rsync ต่อไฟล์ขนาดใหญ่ใน src-dir เพื่อ dest-dir บนเซิร์ฟเวอร์ fooserver:

cd src-dir; find . -type f -size +100000 | \
parallel -v ssh fooserver mkdir -p /dest-dir/{//}\; \
  rsync -s -Havessh {} fooserver:/dest-dir/{} 

ไดเรกทอรีที่สร้างขึ้นอาจจบลงด้วยการอนุญาตที่ไม่ถูกต้องและไฟล์ขนาดเล็กจะไม่ถูกถ่ายโอน หากต้องการแก้ไขการเรียกใช้ rsync ในครั้งสุดท้าย:

rsync -Havessh src-dir/ fooserver:/dest-dir/ 

หากคุณไม่สามารถส่งข้อมูลได้ แต่ต้องดึงไฟล์และไฟล์นั้นเรียกว่า digit.png (เช่น 000000.png) คุณอาจทำได้:

seq -w 0 99 | parallel rsync -Havessh fooserver:src/*{}.png destdir/

ทางเลือกอื่นเพื่อหลีกเลี่ยงfind?
Mandar Shinde

1
จำกัด -maxdepth ของการค้นหา
Ole Tange

หากฉันใช้--dry-runตัวเลือกในrsyncฉันจะมีรายการไฟล์ที่จะถ่ายโอน ฉันสามารถให้รายชื่อไฟล์นั้นparallelเพื่อดำเนินการคู่ขนานกับกระบวนการได้หรือไม่?
Mandar Shinde

1
ไฟล์ cat ขนาน -v ssh fooserver mkdir -p / ปลายทาง -dir / {//} \; rsync -s -Havessh {} fooserver: / dest-dir / {}
Ole Tange

คุณช่วยอธิบายmkdir -p /dest-dir/{//}\;ส่วนนี้ได้มั้ย โดยเฉพาะอย่างยิ่ง{//}สิ่งที่ค่อนข้างสับสน
Mandar Shinde

1

สำหรับการซิงค์หลายปลายทางฉันกำลังใช้งาน

parallel rsync -avi /path/to/source ::: host1: host2: host3:

คำแนะนำ: การเชื่อมต่อ SSH ทั้งหมดได้รับการสร้างขึ้นด้วยกุญแจสาธารณะใน ~/.ssh/authorized_keys


1

ฉันมักจะ google สำหรับ rsync ขนานขณะที่ผมมักจะลืมคำสั่งเต็ม แต่ไม่มีวิธีแก้ทำงานให้ฉันเป็นฉันอยาก - parallelทั้งมันมีหลายขั้นตอนหรือความต้องการในการติดตั้ง ฉันลงเอยด้วยการใช้หนึ่งซับเพื่อซิงค์หลายโฟลเดอร์:

find dir/ -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo dir/%/ host:/dir/%/)'

-P 5 คือจำนวนกระบวนการที่คุณต้องการวาง - ใช้ 0 ไม่ จำกัด (ไม่แนะนำอย่างชัดเจน)

--bwlimit เพื่อหลีกเลี่ยงการใช้แบนด์วิดท์ทั้งหมด

-I %อาร์กิวเมนต์จัดทำโดยค้นหา (พบไดเรกทอรีในdir/)

$(echo dir/%/ host:/dir/%/)- พิมพ์ไดเรกทอรีต้นทางและปลายทางที่อ่านโดย rsync เป็นอาร์กิวเมนต์ % จะถูกแทนที่ด้วยกับชื่อไดเรกทอรีพบโดยxargsfind

สมมติว่าฉันมีสองไดเรกทอรีใน/home: และdir1 ฉันวิ่งdir2 find /home -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo /home/%/ host:/home/%/)'ดังนั้นคำสั่ง rsync จะทำงานเป็นสองกระบวนการ (สองกระบวนการเพราะ/homeมีสองไดเรกทอรี) โดยมีอาร์กิวเมนต์ดังนี้

rsync -a --delete --bwlimit=50000 /home/dir1/ host:/home/dir1/
rsync -a --delete --bwlimit=50000 /home/dir1/ host:/home/dir1/
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.