জিএনইউ সমান্তরাল ব্যবহার করে সমান্তরাল আরএসসিএনসি


18

আমি rsyncঅন্য হোস্টের ডেটার সাথে এক হোস্টে ডেটা সিঙ্ক্রোনাইজ করতে স্ক্রিপ্ট ব্যবহার করে যাচ্ছি । ডেটাতে অসংখ্য ছোট আকারের ফাইল রয়েছে যা প্রায় 1.2 টিবিতে অবদান রাখে।

এই ফাইলগুলি সিঙ্ক করার জন্য, আমি 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.5 গিগাবাইট ডেটা) তুলেছি এবং আমি উপরের কমান্ডটি কার্যকর করেছি। অনুক্রমিক প্রক্রিয়া হওয়ায় এটি 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
আপনি কি নেটওয়ার্ক ব্যান্ডউইথ দ্বারা সীমাবদ্ধ? ডিস্ক আইপস? ডিস্ক ব্যান্ডউইথ?
ওলে টাঞ্জ

যদি সম্ভব হয় তবে আমরা মোট ব্যান্ডউইথের 50% ব্যবহার করতে চাই। তবে, একাধিক rsyncগুলি সমান্তরাল করা আমাদের প্রথম অগ্রাধিকার।
মন্দার শিন্ডে

আপনার কী আমাদের জানতে পারেন: নেটওয়ার্ক ব্যান্ডউইথ, ডিস্ক আইপস, ডিস্ক ব্যান্ডউইথ এবং ব্যান্ডউইথ আসলে ব্যবহৃত?
ওলে টাঞ্জ

আসলে, আমি উপরের পরামিতিগুলি সম্পর্কে জানি না। আপাতত, আমরা অপটিমাইজেশন অংশটিকে অবহেলা করতে পারি। rsyncসমান্তরালে একাধিক গুলি এখন প্রাথমিক ফোকাস।
মন্দার শিন্ডে

সীমাবদ্ধতা সিপিইউ না হলে সমান্তরালে যাওয়ার কোনও অর্থ নেই। এটি আরও খারাপ করতে পারে / করতে পারে (উত্স বা টার্গেট ডিস্কে বিবাদী ডিস্ক বাহু চলাচল)।
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 টি চালানোর 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
এটি ফাইলের জন্য একটি RSSync করবে। splitসমান্তরালভাবে এই ফাইলের নামগুলি ব্যবহার করে পুরো ফাইল তালিকাটি বিভক্ত করা এবং খাওয়ানো সম্ভবত আরও দক্ষ হবে । তারপরে --files-fromপ্রতিটি ফাইলের থেকে ফাইলের নামগুলি বের করতে এবং সেগুলিকে সিঙ্ক করতে rsync এর ব্যবহার করুন। আরএম ব্যাকআপ। * বিভক্ত -l 3000 ব্যাকআপ.লিস্ট ব্যাকআপ। এলএস ব্যাকআপ। * | সমান্তরাল --line-বাফার --verbose -J 5 rsync --progress -av --files-থেকে {} / local / মাতাপিতা / path / রিমোট: REMOTE_PATH /
সন্দীপ ভট্টাচার্য

1
দ্বিতীয়.আরসিএনসি কমান্ড কীভাবে রেজাল্ট.লগগুলিতে ফাইলগুলি নয় যা হ্যান্ডেল করে? অর্থাত receiving file list ... done created directory /data/
মাইক ডি

1
RSSync (3.1.0+) এর নতুন সংস্করণগুলিতে আপনি --info=nameএর জায়গায় ব্যবহার করতে পারেন -vএবং আপনি কেবল ফাইল এবং ডিরেক্টরিগুলির নাম পাবেন। আপনি যদি কোনও ফাইলের মধ্যে ফাঁকা জায়গা বা শেল মেটাচ্যাকার্টর থাকতে পারে তবে 'অভ্যন্তরীণ' স্থানান্তরকারী আরএসসিএন-তেও - প্রোটেক্ট-আরগস ব্যবহার করতে চাইতে পারেন।
চিতা

13

আমি ব্যক্তিগতভাবে এই সহজটি ব্যবহার করি:

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

যা কেবলমাত্র তখনই কার্যকর যখন আপনার কাছে কয়েকটি অ-কাছাকাছি-খালি ডিরেক্টরি রয়েছে, অন্যথায় আপনি প্রায় প্রতিটি rsyncসমাপ্তি এবং শেষটি একা সমস্ত কাজ করে যাচ্ছেন।


এটি দুর্দান্ত কাজ করে - এটি কিছু করছে কিনা তা জানার জন্য কঠোর, সুতরাং সমান্তরাল -v এটি আরও চটুল করে তোলে। এছাড়াও, -j 30 থেকে সমান্তরাল (অর্থাত্‍ rsync কমান্ডের আগে) এটি 30 টি কাজ চালায়, কেবলমাত্র সিপিইউ কোরের এক নয় যা ডিফল্ট।
ক্রিগগি

12

আমি গ্রহণযোগ্য উত্তরটি ব্যবহার করতে কাউকে দৃ strongly়ভাবে নিরুৎসাহিত করব, এর চেয়ে ভাল সমাধানটি শীর্ষ স্তরের ডিরেক্টরি ক্রল করা এবং আনুপাতিক সংখ্যক rync অপারেশন চালু করা।

আমি একটি বড় zfs ভলিউম এবং আমার উত্স ছিল একটি cifs মাউন্ট। উভয়ই 10 জি এর সাথে যুক্ত রয়েছে এবং কিছু মানদণ্ডে লিঙ্কটি পরিপূর্ণ করতে পারে। পারফরম্যান্স ব্যবহার করে মূল্যায়ন করা হয়েছিল 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

আইও মিটারটি পড়ে:

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 এমবি / সেকেন্ডে পৌঁছেছে যার অর্থ লিঙ্কটি স্যাচুরেটেড। 130 এমবি / গুলি খুব ভাল নয়, এবং সপ্তাহান্তে এবং দুই সপ্তাহ অপেক্ষা করার মধ্যে পার্থক্য।

সুতরাং, আমি ফাইল তালিকাটি তৈরি করেছি এবং পুনরায় সিঙ্ক চালানোর চেষ্টা করেছি (আমার কাছে একটি 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 -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

অবশেষে, @ সন্দীপ ভট্টাচার্য যেহেতু আনেন, ডিরেক্টরিগুলি পেতে এবং এর সাথে সমান্তরাল করার জন্য একটি ছোট স্ক্রিপ্ট লিখুন। বিকল্পভাবে, rsync এ একটি ফাইল তালিকা পাস করুন। তবে প্রতিটি ফাইলের জন্য নতুন দৃষ্টান্ত তৈরি করবেন না।


5

সমান্তরাল আরএসসিঙ্কটি করার একটি পরীক্ষিত উপায় হ'ল: http://www.gnu.org/software/parallel/man.html#EXAMPLE:- সমান্তরালকরণ-সংলগ্ন

rsync একটি দুর্দান্ত সরঞ্জাম, তবে কখনও কখনও এটি উপলব্ধ ব্যান্ডউইথটি পূরণ করে না। উচ্চ গতির সংযোগে বেশ কয়েকটি বড় ফাইল অনুলিপি করার সময় এটি প্রায়শই সমস্যা।

নিম্নলিখিতটি সার্ভার ফুসারবারে সিআরসি-ডির থেকে ডেস্ট-ডায়ারে বড় ফাইল প্রতি এক রিসাইএনসি শুরু করবে:

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

তৈরি ডিরেক্টরিগুলি ভুল অনুমতি দিয়ে শেষ হতে পারে এবং ছোট ফাইলগুলি স্থানান্তরিত হচ্ছে না। এই চালাগুলি একটি চূড়ান্ত সময়টি চালানোর জন্য:

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

আপনি যদি ডেটা ধাক্কা দিতে অক্ষম হন তবে তাদের টানতে হবে এবং ফাইলগুলিকে ডিজিটগুলি বলা হয় p

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

অন্য কোন বিকল্প এড়ানোর জন্য find?
মন্দার শিন্ডে

1
সন্ধানের -ম্যাক্সডেপথ সীমাবদ্ধ করুন।
ওলে টেঙ্গে

আমি যদি --dry-runবিকল্পটি ব্যবহার rsyncকরি তবে আমার কাছে ফাইলগুলির একটি তালিকা থাকবে যা স্থানান্তরিত হবে। parallelপ্রক্রিয়াটির সমান্তরালতার জন্য আমি কি সেই ফাইল তালিকাটি সরবরাহ করতে পারি ?
মন্দার শিন্ডে

1
বিড়াল ফাইল | সমান্তরাল -v ssh fooserver mkdir -p / dest-dir / {//} \; আরসিএনসি -এস-হাভেষ {oo ফুজারবার: / ডাস্ট-দির / {}
ওলে টাঞ্জ

আপনি দয়া করে mkdir -p /dest-dir/{//}\;অংশটি ব্যাখ্যা করতে পারেন ? বিশেষত {//}জিনিসটি কিছুটা বিভ্রান্তিকর।
মন্দার শিন্ডে

1

বহু গন্তব্য সিঙ্কগুলির জন্য, আমি ব্যবহার করছি

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

ইঙ্গিত: সমস্ত ssh সংযোগগুলি জনসাধারণের কীগুলির সাথে প্রতিষ্ঠিত ~/.ssh/authorized_keys


1

আমি সর্বদা সমান্তরাল আরএসসিএনসি জন্য গুগল থাকি কারণ আমি সর্বদা সম্পূর্ণ কমান্ডটি ভুলে যাই, তবে আমার ইচ্ছা মতো কোনও সমাধান আমার পক্ষে কার্যকর হয়নি - হয় এতে একাধিক পদক্ষেপ অন্তর্ভুক্ত থাকে বা ইনস্টল করার প্রয়োজন হয় 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/%/)- উত্স এবং গন্তব্য ডিরেক্টরি মুদ্রণ করে যা আরএসকিউ দ্বারা আর্গুমেন্ট হিসাবে পড়া হয়। % দ্বারা 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/
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.