نقل البيانات إلى نظام مجموعة vFXT - استيعاب البيانات المتوازية

بعد إنشاء مجموعة vFXT جديدة، قد تكون مهمتك الأولى نقل البيانات إلى وحدة تخزين جديدة في Azure. ومع ذلك، إذا كانت الطريقة المعتادة لنقل البيانات هي إصدار أمر نسخ بسيط من عميل واحد، فمن المحتمل أن ترى أداء نسخ بطيء. النسخ أحادي الترابط ليس خيارا جيدا لنسخ البيانات إلى التخزين الخلفي لمجموعة Avere vFXT.

نظرا لأن Avere vFXT لنظام مجموعة Azure هو ذاكرة تخزين مؤقت متعددة العملاء قابلة للتطوير، فإن الطريقة الأسرع والأكثر كفاءة لنسخ البيانات إليها هي مع عملاء متعددين. هذه التقنية توازي استيعاب الملفات والكائنات.

Diagram showing multi-client, multi-threaded data movement: At the top left, an icon for on-premises hardware storage has multiple arrows coming from it. The arrows point to four client machines. From each client machine three arrows point toward the Avere vFXT. From the Avere vFXT, multiple arrows point to Blob storage.

cp الأوامر أو copy التي تستخدم عادة لاستخدام لنقل البيانات من نظام تخزين إلى آخر هي عمليات مترابطة واحدة تنسخ ملفا واحدا فقط في كل مرة. وهذا يعني أن خادم الملفات ي استيعاب ملف واحد فقط في كل مرة - وهو مضيعة لموارد نظام المجموعة.

تشرح هذه المقالة استراتيجيات إنشاء نظام نسخ ملفات متعدد العملاء متعدد مؤشرات الترابط لنقل البيانات إلى نظام مجموعة Avere vFXT. وهو يشرح مفاهيم نقل الملفات ونقاط القرار التي يمكن استخدامها لنسخ البيانات بكفاءة باستخدام عملاء متعددين والأوامر البسيطة للنسخ.

كما يشرح بعض الأدوات المساعدة التي يمكن أن تساعد. msrsync يمكن استخدام الأداة المساعدة لأتمتة عملية تقسيم مجموعة البيانات جزئيا إلى مجموعات واستخدام rsync الأوامر. parallelcp البرنامج النصي هو أداة مساعدة أخرى تقرأ الدليل المصدر وتصدر أوامر النسخ تلقائيا. أيضا، rsync يمكن استخدام الأداة على مرحلتين لتوفير نسخة أسرع لا تزال توفر تناسق البيانات.

انقر فوق الارتباط للانتقال إلى مقطع:

قالب الجهاز الظاهري لاستيعاب البيانات

يتوفر قالب Resource Manager على GitHub لإنشاء جهاز ظاهري تلقائيا باستخدام أدوات استيعاب البيانات المتوازية المذكورة في هذه المقالة.

diagram showing multiple arrows each from blob storage, hardware storage, and Azure file sources. The arrows point to a

يعد الجهاز الظاهري لاستيعاب البيانات جزءا من برنامج تعليمي حيث يقوم الجهاز الظاهري المنشأ حديثا بتحميل نظام مجموعة Avere vFXT وتنزيل البرنامج النصي bootstrap الخاص به من نظام المجموعة. اقرأ Bootstrap a data ingestor VM للحصول على التفاصيل.

التخطيط الاستراتيجي

عند تصميم استراتيجية لنسخ البيانات بالتوازي، يجب أن تفهم المقايضات في حجم الملف وعدد الملفات وعمق الدليل.

  • عندما تكون الملفات صغيرة، يكون مقياس الاهتمام هو الملفات في الثانية.
  • عندما تكون الملفات كبيرة (10MiBi أو أكبر)، يكون مقياس الاهتمام وحدات البايت في الثانية.

كل عملية نسخ لها معدل نقل ومعدل نقل الملفات، والتي يمكن قياسها عن طريق توقيت طول أمر النسخ وعامل حجم الملف وعدد الملفات. إن شرح كيفية قياس الأسعار خارج نطاق هذا المستند، ولكن من المهم فهم ما إذا كنت ستتعامل مع ملفات صغيرة أو كبيرة.

مثال على النسخ اليدوي

يمكنك إنشاء نسخة متعددة مؤشرات الترابط يدويا على عميل عن طريق تشغيل أكثر من أمر نسخة واحدة في وقت واحد في الخلفية مقابل مجموعات محددة مسبقا من الملفات أو المسارات.

يتضمن الأمر Linux/UNIX cp الوسيطة -p للحفاظ على الملكية وبيانات تعريف mtime. إضافة هذه الوسيطة إلى الأوامر أدناه اختيارية. (تؤدي إضافة الوسيطة إلى زيادة عدد استدعاءات نظام الملفات المرسلة من العميل إلى نظام الملفات الوجهة لتعديل بيانات التعريف.)

ينسخ هذا المثال البسيط ملفين بالتوازي:

cp /mnt/source/file1 /mnt/destination1/ & cp /mnt/source/file2 /mnt/destination1/ &

بعد إصدار هذا الأمر، jobs سيظهر الأمر أن مؤشري ترابط قيد التشغيل.

بنية اسم الملف القابلة للتنبؤ

إذا كانت أسماء الملفات الخاصة بك قابلة للتنبؤ، يمكنك استخدام التعبيرات لإنشاء مؤشرات ترابط نسخ متوازية.

على سبيل المثال، إذا كان الدليل يحتوي على 1000 ملف تم ترقيمها بالتسلسل من 0001 إلى 1000، يمكنك استخدام التعبيرات التالية لإنشاء عشرة مؤشرات ترابط متوازية يقوم كل منها بنسخ 100 ملف:

cp /mnt/source/file0* /mnt/destination1/ & \
cp /mnt/source/file1* /mnt/destination1/ & \
cp /mnt/source/file2* /mnt/destination1/ & \
cp /mnt/source/file3* /mnt/destination1/ & \
cp /mnt/source/file4* /mnt/destination1/ & \
cp /mnt/source/file5* /mnt/destination1/ & \
cp /mnt/source/file6* /mnt/destination1/ & \
cp /mnt/source/file7* /mnt/destination1/ & \
cp /mnt/source/file8* /mnt/destination1/ & \
cp /mnt/source/file9* /mnt/destination1/

بنية اسم ملف غير معروفة

إذا كانت بنية تسمية الملفات غير قابلة للتنبؤ، يمكنك تجميع الملفات حسب أسماء الدليل.

يجمع هذا المثال دلائل بأكملها لإرسالها إلى cp الأوامر التي يتم تشغيلها كمهام في الخلفية:

/root
|-/dir1
| |-/dir1a
| |-/dir1b
| |-/dir1c
   |-/dir1c1
|-/dir1d

بعد تجميع الملفات، يمكنك تشغيل أوامر النسخ المتوازية لنسخ الدلائل الفرعية وكافة محتوياتها بشكل متكرر:

cp /mnt/source/* /mnt/destination/
mkdir -p /mnt/destination/dir1 && cp /mnt/source/dir1/* mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1a /mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1b /mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1c /mnt/destination/dir1/ & # this command copies dir1c1 via recursion
cp -R /mnt/source/dir1/dir1d /mnt/destination/dir1/ &

متى يتم إضافة نقاط التحميل

بعد أن يكون لديك ما يكفي من مؤشرات الترابط المتوازية التي تسير مقابل نقطة تحميل نظام ملفات وجهة واحدة، ستكون هناك نقطة حيث لا تعطي إضافة المزيد من مؤشرات الترابط المزيد من معدل النقل. (سيتم قياس معدل النقل بالملفات/الثانية أو وحدات البايت/الثانية، اعتمادا على نوع البيانات.) أو الأسوأ من ذلك، يمكن أن يتسبب الترابط الزائد في بعض الأحيان في تدهور معدل النقل.

عند حدوث ذلك، يمكنك إضافة نقاط تحميل من جانب العميل إلى عناوين IP الأخرى لنظام مجموعة vFXT، باستخدام نفس مسار تحميل نظام الملفات البعيد:

10.1.0.100:/nfs on /mnt/sourcetype nfs (rw,vers=3,proto=tcp,addr=10.1.0.100)
10.1.1.101:/nfs on /mnt/destination1type nfs (rw,vers=3,proto=tcp,addr=10.1.1.101)
10.1.1.102:/nfs on /mnt/destination2type nfs (rw,vers=3,proto=tcp,addr=10.1.1.102)
10.1.1.103:/nfs on /mnt/destination3type nfs (rw,vers=3,proto=tcp,addr=10.1.1.103)

تتيح لك إضافة نقاط التحميل من جانب العميل نسخ أوامر النسخ الإضافية إلى نقاط التحميل الإضافية /mnt/destination[1-3] ، ما يحقق المزيد من التوازي.

على سبيل المثال، إذا كانت ملفاتك كبيرة جدا، فقد تحدد أوامر النسخ لاستخدام مسارات وجهة مميزة، وإرسال المزيد من الأوامر بالتوازي من العميل الذي يقوم بالنسخة.

cp /mnt/source/file0* /mnt/destination1/ & \
cp /mnt/source/file1* /mnt/destination2/ & \
cp /mnt/source/file2* /mnt/destination3/ & \
cp /mnt/source/file3* /mnt/destination1/ & \
cp /mnt/source/file4* /mnt/destination2/ & \
cp /mnt/source/file5* /mnt/destination3/ & \
cp /mnt/source/file6* /mnt/destination1/ & \
cp /mnt/source/file7* /mnt/destination2/ & \
cp /mnt/source/file8* /mnt/destination3/ & \

في المثال أعلاه، يتم استهداف جميع نقاط تحميل الوجهة الثلاث بواسطة عمليات نسخ ملف العميل.

متى يتم إضافة عملاء

وأخيرا، عند الوصول إلى قدرات العميل، لن تؤدي إضافة المزيد من مؤشرات ترابط النسخ أو نقاط التحميل الإضافية إلى أي زيادة إضافية في الملفات/الثانية أو وحدات البايت/ثانية. في هذه الحالة، يمكنك نشر عميل آخر بنفس مجموعة نقاط التحميل التي سيتم تشغيل مجموعاتها الخاصة من عمليات نسخ الملفات.

مثال:

Client1: cp -R /mnt/source/dir1/dir1a /mnt/destination/dir1/ &
Client1: cp -R /mnt/source/dir2/dir2a /mnt/destination/dir2/ &
Client1: cp -R /mnt/source/dir3/dir3a /mnt/destination/dir3/ &

Client2: cp -R /mnt/source/dir1/dir1b /mnt/destination/dir1/ &
Client2: cp -R /mnt/source/dir2/dir2b /mnt/destination/dir2/ &
Client2: cp -R /mnt/source/dir3/dir3b /mnt/destination/dir3/ &

Client3: cp -R /mnt/source/dir1/dir1c /mnt/destination/dir1/ &
Client3: cp -R /mnt/source/dir2/dir2c /mnt/destination/dir2/ &
Client3: cp -R /mnt/source/dir3/dir3c /mnt/destination/dir3/ &

Client4: cp -R /mnt/source/dir1/dir1d /mnt/destination/dir1/ &
Client4: cp -R /mnt/source/dir2/dir2d /mnt/destination/dir2/ &
Client4: cp -R /mnt/source/dir3/dir3d /mnt/destination/dir3/ &

إنشاء بيانات الملف

بعد فهم الأساليب المذكورة أعلاه (عدة سلاسل نسخ لكل وجهة، وجهات متعددة لكل عميل، وعملاء متعددين لكل نظام ملفات مصدر يمكن الوصول إليه عبر الشبكة)، ضع في اعتبارك هذه التوصية: إنشاء بيانات الملف ثم استخدامها مع أوامر النسخ عبر عملاء متعددين.

يستخدم هذا السيناريو أمر UNIX find لإنشاء بيانات الملفات أو الدلائل:

user@build:/mnt/source > find . -mindepth 4 -maxdepth 4 -type d
./atj5b55c53be6-01/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-01/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-01/support/trace/rolling
./atj5b55c53be6-03/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-03/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-03/support/trace/rolling
./atj5b55c53be6-02/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-02/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-02/support/trace/rolling

إعادة توجيه هذه النتيجة إلى ملف: find . -mindepth 4 -maxdepth 4 -type d > /tmp/foo

ثم يمكنك التكرار من خلال البيان، باستخدام أوامر BASH لحساب الملفات وتحديد أحجام الدلائل الفرعية:

ben@xlcycl1:/sps/internal/atj5b5ab44b7f > for i in $(cat /tmp/foo); do echo " `find ${i} |wc -l` `du -sh ${i}`"; done
244    3.5M    ./atj5b5ab44b7f-02/support/gsi/2018-07-18T00:07:03EDT
9      172K    ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-18T05:01:00UTC
124    5.8M    ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-19T01:01:01UTC
152    15M     ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T01:01:00UTC
131    13M     ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T21:59:41UTC_partial
789    6.2M    ./atj5b5ab44b7f-02/support/gsi/2018-07-20T21:59:41UTC
134    12M     ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T22:22:55UTC_vfxt_catchup
7      16K     ./atj5b5ab44b7f-02/support/pcap/2018-07-18T17:12:19UTC
8      83K     ./atj5b5ab44b7f-02/support/pcap/2018-07-18T17:17:17UTC
575    7.7M    ./atj5b5ab44b7f-02/support/cores/armada_main.2000.1531980253.gsi
33     4.4G    ./atj5b5ab44b7f-02/support/trace/rolling
281    6.6M    ./atj5b5ab44b7f-01/support/gsi/2018-07-18T00:07:03EDT
15     182K    ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-18T05:01:00UTC
244    17M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-19T01:01:01UTC
299    31M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T01:01:00UTC
256    29M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T21:59:41UTC_partial
889    7.7M    ./atj5b5ab44b7f-01/support/gsi/2018-07-20T21:59:41UTC
262    29M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T22:22:55UTC_vfxt_catchup
11     248K    ./atj5b5ab44b7f-01/support/pcap/2018-07-18T17:12:19UTC
11     88K     ./atj5b5ab44b7f-01/support/pcap/2018-07-18T17:17:17UTC
645    11M     ./atj5b5ab44b7f-01/support/cores/armada_main.2019.1531980253.gsi
33     4.0G    ./atj5b5ab44b7f-01/support/trace/rolling
244    2.1M    ./atj5b5ab44b7f-03/support/gsi/2018-07-18T00:07:03EDT
9      158K    ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-18T05:01:00UTC
124    5.3M    ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-19T01:01:01UTC
152    15M     ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T01:01:00UTC
131    12M     ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T21:59:41UTC_partial
789    8.4M    ./atj5b5ab44b7f-03/support/gsi/2018-07-20T21:59:41UTC
134    14M     ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T22:25:58UTC_vfxt_catchup
7      159K    ./atj5b5ab44b7f-03/support/pcap/2018-07-18T17:12:19UTC
7      157K    ./atj5b5ab44b7f-03/support/pcap/2018-07-18T17:17:17UTC
576    12M     ./atj5b5ab44b7f-03/support/cores/armada_main.2013.1531980253.gsi
33     2.8G    ./atj5b5ab44b7f-03/support/trace/rolling

وأخيرا، يجب صياغة أوامر نسخ الملف الفعلي للعملاء.

إذا كان لديك أربعة عملاء، فاستخدم هذا الأمر:

for i in 1 2 3 4 ; do sed -n ${i}~4p /tmp/foo > /tmp/client${i}; done

إذا كان لديك خمسة عملاء، فاستخدم شيئا مثل هذا:

for i in 1 2 3 4 5; do sed -n ${i}~5p /tmp/foo > /tmp/client${i}; done

ولستة... الاستقراء حسب الحاجة.

for i in 1 2 3 4 5 6; do sed -n ${i}~6p /tmp/foo > /tmp/client${i}; done

ستحصل على الملفات الناتجة N ، واحد لكل عميل من عملاء N الذي يحتوي على أسماء المسار إلى دلائل المستوى الرابع التي تم الحصول عليها كجزء من الإخراج من find الأمر .

استخدم كل ملف لإنشاء أمر النسخ:

for i in 1 2 3 4 5 6; do for j in $(cat /tmp/client${i}); do echo "cp -p -R /mnt/source/${j} /mnt/destination/${j}" >> /tmp/client${i}_copy_commands ; done; done

سيعطيك ما سبق ملفات N ، كل منها مع أمر نسخ لكل سطر، والتي يمكن تشغيلها كبرنامج نصي BASH على العميل.

الهدف هو تشغيل مؤشرات ترابط متعددة من هذه البرامج النصية بشكل متزامن لكل عميل بالتوازي على عملاء متعددين.

استخدام عملية rsync على مرحلتين

لا تعمل الأداة المساعدة القياسية rsync بشكل جيد لملء التخزين السحابي من خلال نظام Avere vFXT لنظام Azure لأنها تنشئ عددا كبيرا من عمليات إنشاء الملفات وإعادة تسميتها لضمان تكامل البيانات. ومع ذلك، يمكنك استخدام --inplace الخيار بأمان مع rsync لتخطي إجراء النسخ الأكثر حذرا إذا اتبعت ذلك مع تشغيل ثان يتحقق من تكامل الملف.

تقوم عملية النسخ القياسية rsync بإنشاء ملف مؤقت وتعبئته بالبيانات. إذا اكتمل نقل البيانات بنجاح، تتم إعادة تسمية الملف المؤقت باسم الملف الأصلي. يضمن هذا الأسلوب التناسق حتى إذا تم الوصول إلى الملفات أثناء النسخ. ولكن هذا الأسلوب يولد المزيد من عمليات الكتابة، ما يبطئ حركة الملف من خلال ذاكرة التخزين المؤقت.

يكتب الخيار --inplace الملف الجديد مباشرة في موقعه النهائي. الملفات غير مضمونة لتكون متسقة أثناء النقل، ولكن هذا ليس مهما إذا كنت تقوم بتصنيم نظام تخزين للاستخدام لاحقا.

تعمل العملية الثانية rsync كتحقق من التناسق في العملية الأولى. نظرا لأن الملفات قد تم نسخها بالفعل، فإن المرحلة الثانية هي فحص سريع للتأكد من أن الملفات الموجودة على الوجهة تطابق الملفات الموجودة على المصدر. إذا لم تتطابق أي ملفات، يتم إعادة فرزها.

يمكنك إصدار المرحلتين معا في أمر واحد:

rsync -azh --inplace <source> <destination> && rsync -azh <source> <destination>

هذا الأسلوب هو أسلوب بسيط وفعال من حيث الوقت لمجموعات البيانات حتى عدد الملفات التي يمكن لمدير الدليل الداخلي التعامل معها. (عادة ما يكون هذا 200 مليون ملف لمجموعة مكونة من 3 عقد، و500 مليون ملف لمجموعة مكونة من ست عقد، وهكذا.)

استخدام الأداة المساعدة msrsync

msrsync يمكن استخدام الأداة أيضا لنقل البيانات إلى ملف أساسي خلفي لمجموعة Avere. تم تصميم هذه الأداة لتحسين استخدام النطاق الترددي عن طريق تشغيل عمليات متوازية rsync متعددة. وهو متاح من GitHub في https://github.com/jbd/msrsync.

msrsync يقسم الدليل المصدر إلى "مستودعات" منفصلة ثم يقوم بتشغيل عمليات فردية rsync على كل مستودع.

أظهر الاختبار الأولي باستخدام جهاز ظاهري رباعي النواة أفضل كفاءة عند استخدام 64 عملية. msrsync استخدم الخيار -p لتعيين عدد العمليات إلى 64.

يمكنك أيضا استخدام الوسيطة --inplace مع msrsync الأوامر. إذا كنت تستخدم هذا الخيار، ففكر في تشغيل أمر ثان (كما هو الحال مع rsync، الموضح أعلاه) لضمان تكامل البيانات.

msrsync يمكن الكتابة من وإلى وحدات التخزين المحلية فقط. يجب أن يكون المصدر والوجهة قابلين للوصول كتركيبات محلية في الشبكة الظاهرية لنظام المجموعة.

لاستخدام msrsync لملء وحدة تخزين سحابة Azure بمجموعة Avere، اتبع الإرشادات التالية:

  1. التثبيت msrsync ومتطلباته الأساسية (rsync وPython 2.6 أو أحدث)

  2. حدد العدد الإجمالي للملفات والدلائل المراد نسخها.

    على سبيل المثال، استخدم الأداة المساعدة prime.py Avere مع الوسيطات prime.py --directory /path/to/some/directory (متوفرة عن طريق تنزيل url https://github.com/Azure/Avere/blob/master/src/clientapps/dataingestor/prime.py).

    إذا لم تكن تستخدم prime.py، يمكنك حساب عدد العناصر باستخدام أداة GNU find كما يلي:

    find <path> -type f |wc -l         # (counts files)
    find <path> -type d |wc -l         # (counts directories)
    find <path> |wc -l                 # (counts both)
    
  3. قسم عدد العناصر على 64 لتحديد عدد العناصر لكل عملية. استخدم هذا الرقم مع -f الخيار لتعيين حجم المستودعات عند تشغيل الأمر.

  4. msrsync إصدار الأمر لنسخ الملفات:

    msrsync -P --stats -p 64 -f <ITEMS_DIV_64> --rsync "-ahv" <SOURCE_PATH> <DESTINATION_PATH>
    

    إذا كنت تستخدم --inplace، أضف تنفيذا ثانيا دون خيار التحقق من نسخ البيانات بشكل صحيح:

    msrsync -P --stats -p 64 -f <ITEMS_DIV_64> --rsync "-ahv --inplace" <SOURCE_PATH> <DESTINATION_PATH> && msrsync -P --stats -p 64 -f <ITEMS_DIV_64> --rsync "-ahv" <SOURCE_PATH> <DESTINATION_PATH>
    

    على سبيل المثال، تم تصميم هذا الأمر لنقل 11000 ملف في 64 عملية من /test/source-repository إلى /mnt/vfxt/repository:

    msrsync -P --stats -p 64 -f 170 --rsync "-ahv --inplace" /test/source-repository/ /mnt/vfxt/repository && msrsync -P --stats -p 64 -f 170 --rsync "-ahv --inplace" /test/source-repository/ /mnt/vfxt/repository

استخدام البرنامج النصي للنسخ المتوازي

parallelcp يمكن أن يكون البرنامج النصي مفيدا أيضا لنقل البيانات إلى التخزين الخلفي لمجموعة vFXT.

سيقوم البرنامج النصي أدناه بإضافة الملف القابل parallelcpللتنفيذ . (تم تصميم هذا البرنامج النصي ل Ubuntu؛ إذا كنت تستخدم توزيعا آخر، يجب تثبيته parallel بشكل منفصل.)

sudo touch /usr/bin/parallelcp && sudo chmod 755 /usr/bin/parallelcp && sudo sh -c "/bin/cat >/usr/bin/parallelcp" <<EOM
#!/bin/bash

display_usage() {
    echo -e "\nUsage: \$0 SOURCE_DIR DEST_DIR\n"
}

if [  \$# -le 1 ] ; then
    display_usage
    exit 1
fi

if [[ ( \$# == "--help") ||  \$# == "-h" ]] ; then
    display_usage
    exit 0
fi

SOURCE_DIR="\$1"
DEST_DIR="\$2"

if [ ! -d "\$SOURCE_DIR" ] ; then
    echo "Source directory \$SOURCE_DIR does not exist, or is not a directory"
    display_usage
    exit 2
fi

if [ ! -d "\$DEST_DIR" ] && ! mkdir -p \$DEST_DIR ; then
    echo "Destination directory \$DEST_DIR does not exist, or is not a directory"
    display_usage
    exit 2
fi

if [ ! -w "\$DEST_DIR" ] ; then
    echo "Destination directory \$DEST_DIR is not writeable, or is not a directory"
    display_usage
    exit 3
fi

if ! which parallel > /dev/null ; then
    sudo apt-get update && sudo apt install -y parallel
fi

DIRJOBS=225
JOBS=225
find \$SOURCE_DIR -mindepth 1 -type d -print0 | sed -z "s/\$SOURCE_DIR\///" | parallel --will-cite -j\$DIRJOBS -0 "mkdir -p \$DEST_DIR/{}"
find \$SOURCE_DIR -mindepth 1 ! -type d -print0 | sed -z "s/\$SOURCE_DIR\///" | parallel --will-cite -j\$JOBS -0 "cp -P \$SOURCE_DIR/{} \$DEST_DIR/{}"
EOM

مثال النسخ المتوازي

يستخدم هذا المثال البرنامج النصي للنسخ المتوازي للتحويل البرمجي glibc باستخدام الملفات المصدر من نظام مجموعة Avere.

يتم تخزين الملفات المصدر على نقطة تحميل نظام مجموعة Avere، ويتم تخزين ملفات الكائن على محرك الأقراص الثابت المحلي.

يستخدم هذا البرنامج النصي برنامج نصي متوازي للنسخ أعلاه. يتم استخدام الخيار -j مع parallelcp و make للحصول على التوازي.

sudo apt-get update
sudo apt install -y gcc bison gcc binutils make parallel
cd
wget https://mirrors.kernel.org/gnu/libc/glibc-2.27.tar.bz2
tar jxf glibc-2.27.tar.bz2
ln -s /nfs/node1 avere
time parallelcp glibc-2.27 avere/glibc-2.27
cd
mkdir obj
mkdir usr
cd obj
/home/azureuser/avere/glibc-2.27/configure --prefix=/home/azureuser/usr
time make -j