GNU समानांतर का उपयोग करते हुए समानांतर rsync


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? डिस्क बैंडविड्थ?
ओले तांगे

यदि संभव हो तो, हम कुल बैंडविड्थ का 50% उपयोग करना चाहते हैं। लेकिन, कई rsyncएस को समानांतर करना हमारी पहली प्राथमिकता है।
मंदार शिंदे

क्या आप हमें अपने बारे में बता सकते हैं: नेटवर्क बैंडविड्थ, डिस्क आईओएस, डिस्क बैंडविड्थ, और वास्तव में उपयोग किए जाने वाले बैंडविड्थ?
ओले तांगे

वास्तव में, मैं उपरोक्त मापदंडों के बारे में नहीं जानता। कुछ समय के लिए, हम अनुकूलन भाग की उपेक्षा कर सकते हैं। rsyncसमानांतर में एकाधिक s अभी प्राथमिक फोकस है।
मंदार शिंदे

सीमा के समानांतर जाने का कोई मतलब नहीं है अगर सीमा सीपीयू नहीं है। यह मामलों को और भी बदतर बना सकता है (स्रोत या लक्ष्य डिस्क पर परस्पर विरोधी डिस्क आंदोलनों)।
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. मैंने 5 s को समानांतर में चलाने के cat transfer.logलिए आउटपुट को निम्न प्रकार से खिलाया :parallelrsync
$ 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उन फ़ाइलनामों का उपयोग करके और समानांतर रूप से उन सभी फ़ाइल सूची को विभाजित करने के लिए अधिक कुशल होगा । फिर --files-fromफ़ाइल के प्रत्येक फ़ाइल को बाहर निकालने और उन्हें सिंक करने के लिए rsync का उपयोग करें। आरएम बैकअप। * विभाजन -l 3000 बैकअप।लिस्ट बैकअप। ls बैकअप। * | समानांतर - रेखा-बफर --verbose -j 5 rsync --progress -av --files-{} से / LOCAL / PARENT / PATH / REMOTE_HOST: REMOTE_PATH /
भट्टाचार्य

1
परिणाम में दूसरी rsync कमांड कैसे हैंडल करती है। फाइल नहीं है? यानी receiving file list ... done created directory /data/
माइक डी।

1
Rsync (3.1.0+) के नए संस्करण पर, आप उपयोग कर सकते हैं --info=nameके स्थान पर -v, और तुम सिर्फ फाइलों और निर्देशिकाओं के नाम मिल जाएगा। यदि आप किसी भी फ़ाइल में स्थान या शेल मेटाचैकर हो सकते हैं, तो आप rsync को 'इनर' ट्रांसफर करने के लिए --protect-args का उपयोग करना चाह सकते हैं।
चीता

13

मैं व्यक्तिगत रूप से इस सरल का उपयोग करता हूं:

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

जो केवल तब उपयोगी होता है जब आपके पास कुछ नॉन-पास-खाली निर्देशिकाओं से अधिक हो, अन्यथा आप लगभग हर rsyncसमाप्ति और अंतिम काम अकेले ही करेंगे।


यह महान काम करता है - यह जानना मुश्किल है कि क्या कुछ भी कर रहा है, इसलिए समानांतर रूप से a -v इसे अधिक बकवास बनाता है। इसके अलावा, -j 30 से समानांतर (यानी rsync कमांड से पहले) यह 30 कार्य करता है, न कि केवल एक सीपीयू कोर जो डिफ़ॉल्ट है।
क्रैगी

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 मीटर पढ़ता है:

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 एमबी / एस है, जिसका अर्थ है कि लिंक संतृप्त है। 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 भट्टाचार्य ने कहा, निर्देशिकाओं और समानांतर को प्राप्त करने के लिए एक छोटी स्क्रिप्ट लिखें। वैकल्पिक रूप से, rsync के लिए एक फ़ाइल सूची पास करें। लेकिन प्रत्येक फ़ाइल के लिए नए उदाहरण न बनाएं।


5

समानांतर rsync करने के लिए एक परीक्षण तरीका है: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync

rsync एक महान उपकरण है, लेकिन कभी-कभी यह उपलब्ध बैंडविड्थ को नहीं भरेगा। उच्च गति कनेक्शन पर कई बड़ी फ़ाइलों की प्रतिलिपि बनाते समय यह अक्सर एक समस्या होती है।

सर्वर फोसर्वर पर डेस्ट-डीआईआर के लिए src-dir में एक बड़ी फ़ाइल प्रति rsync शुरू होगी:

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/ 

यदि आप डेटा को पुश करने में असमर्थ हैं, लेकिन उन्हें खींचने की आवश्यकता है और फ़ाइलों को डिजिटस्पेस कहा जाता है (जैसे 000000.png) आप कर सकते हैं:

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

बचने के लिए कोई दूसरा विकल्प find?
मंदार शिंदे

1
सीमा -maxdepth of find।
ओले तांगे

यदि मैं --dry-runविकल्प का उपयोग करता हूं rsync, तो मेरे पास उन फ़ाइलों की एक सूची होगी, जिन्हें स्थानांतरित किया जाएगा। क्या मैं parallelप्रक्रिया को समानांतर बनाने के लिए वह फ़ाइल सूची प्रदान कर सकता हूँ ?
मंदार शिंदे

1
बिल्ली फ़ाइलें | समानांतर -v ssh फ़ॉस्फेर्वर mkdir -p / dest-dir / {//}}; rsync -s -Havessh {} फ़ॉस्वर: / डेस्ट-डिर / {}
ओले तांगे

क्या आप कृपया mkdir -p /dest-dir/{//}\;हिस्सा बता सकते हैं ? खासकर {//}बात थोड़ी उलझने वाली है।
मंदार शिंदे

1

मल्टी डेस्टिनेशन सिंक के लिए, मैं उपयोग कर रहा हूं

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

संकेत: सभी ssh कनेक्शन सार्वजनिक कुंजियों के साथ स्थापित किए जाते हैं ~/.ssh/authorized_keys


1

मैं हमेशा समानांतर rsync के लिए Google करता हूं क्योंकि मैं हमेशा पूरी कमांड को भूल जाता हूं, लेकिन मेरे लिए कोई समाधान काम नहीं करता था जैसा कि मैं चाहता था - या तो इसमें कई चरण शामिल हैं या इंस्टॉल करने की आवश्यकता है 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 द्वारा पढ़ी जाती हैं। % को xargsनिर्देशिका नाम से बदल दिया जाता है find

मान लें कि मेरे पास दो निर्देशिकाएं हैं /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/
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.