سؤال لماذا يتم piping 'dd' عبر gzip أسرع بكثير من نسخة مباشرة؟


أردت إجراء نسخ احتياطي لمسار من كمبيوتر موجود في شبكتي إلى كمبيوتر آخر في نفس الشبكة عبر خط Mbit / s 100. لهذا فعلت

dd if=/local/path of=/remote/path/in/local/network/backup.img

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

dd if=/local/path | gzip > /remote/path/in/local/network/backup.img.gz

ولكن الآن أحصل على شيء مثل سرعة نقل الشبكة 1 ميجابايت / ثانية ، لذلك عامل من 10 إلى 20 أسرع. بعد ملاحظة ذلك ، قمت باختبار ذلك على عدة مسارات وملفات ، وكانت دائمًا كما هي.

لماذا الأنابيب dd عبر gzip أيضا زيادة معدلات النقل عن طريق عامل كبير بدلا من مجرد تقليل طول bytel من تيار عامل كبير؟ كنت أتوقع حتى انخفاض طفيف في معدلات النقل بدلا من ذلك ، بسبب ارتفاع استهلاك وحدة المعالجة المركزية أثناء الضغط ، ولكن الآن أنا الحصول على زائد مزدوجة. لا لست سعيدًا ، لكنني أتساءل فقط. ؛)


77
2018-05-29 08:35


الأصل


كانت 512 بايت حجم الكتلة القياسي لتخزين الملفات في Unix مبكرًا. نظرًا لأن كل شيء هو ملف في Unix / Linux ، فقد أصبح الافتراضي لكل شيء تقريبًا. وقد زادت الإصدارات الأحدث من معظم المرافق ولكن هذا لا د. - DocSalvager
الجواب البسيط هو ذلك dd يتم إخراجها بسرعة 1 ميجابايت / ثانية ... في الانتظار gzip يضخ. لديها القليل جدا لفعله مع حجم الكتلة. - Tullo_x86


الأجوبة:


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

من ناحية أخرى، gzip ذكية بما فيه الكفاية للقيام I / O مع مخازن أكبر. وهذا هو ، عدد أقل من عمليات الكتابة الكبيرة عبر الشبكة.

هل تجرب dd مرة أخرى مع أكبر bs= المعلمة ومعرفة ما إذا كان يعمل بشكل أفضل هذه المرة؟


98
2018-05-29 09:25



شكرا ، حاول نسخة مباشرة بدون  gzip وكتلة من bs=10M -> نقل شبكة سريع لشيء حوالي 3 أو 4 ميجابايت / ثانية. أعلى blockize + gzip لم يغير أي شيء مقارنة مع كتل صغيرة + gzip. - Foo Bar
إذا كنت تريد معرفة أحجام الكتلة العالية ، فجرّب dd آخر بعد gzip. - Joshua
هل يعمل gzip في التخزين المؤقت للإخراج الخاص به أم أنه يستخدم stdio فقط؟ - Barmar
Barmar إذا كنت أقرأ المصدر بشكل صحيح ، فإنه ببساطة write(3)ق إلى المخزن المؤقت.
CongMa يمكنك أيضًا محاولة استخدام pigz بدلاً من gzip ، وستعمل بشكل أسرع - GioMac


أتأخر قليلاً لكن قد أضيف ...

في مقابلة ، سئلت ذات مرة ماذا سيكون أسرع طريقة ممكنة لاستنساخ بيانات بت بت ورد من الخشونة مع استخدام dd أو dc3dd (وزارة الدفاع تمول). وأكد المحاور أن الأنابيب dd إلى dd هو أكثر كفاءة ، وهذا يسمح ببساطة في وقت واحد قراءة / كتابة أو في شروط المبرمج stdin/stdout، وبالتالي مضاعفة سرعة الكتابة في وقت واحد ونصف الوقت نقل.

dc3dd verb=on if=/media/backup.img | dc3dd of=/dev/sdb

4
2017-09-07 21:41





تسونغ هو الصحيح. تقوم ببث كتل خارج القرص غير مضغوط إلى مضيف بعيد. تعتبر واجهة الشبكة والشبكة والخادم البعيد هي القيود. تحتاج أولاً إلى رفع مستوى أداء DD. سيؤدي تحديد bs = المعلمة التي تتم محاذاتها مع ذاكرة التخزين المؤقت للأقراص إلى الحصول على أقصى أداء من القرص. قل bs = 32M على سبيل المثال. سيؤدي ذلك إلى ملء المخزن المؤقت gzip في مضيق معدل sata أو sas من محركات أقراص التخزين المؤقت. سيكون القرص أكثر ميلا لنقل تسلسلي إعطاء أفضل من خلال وضع. سيضغط Gzip البيانات في التدفق ويرسلها إلى موقعك. إذا كنت تستخدم NFS التي ستسمح أن يكون الإرسال nfs minimial. إذا كنت تستخدم SSH ، فستقوم بتضمين تغليف SSH والتشفير الزائد. إذا كنت تستخدم netcat فلن يكون لديك أي تشفير على الرأس.


0
2018-06-26 23:31





أفترض هنا أنه يتم الإبلاغ عن "سرعة النقل" التي تشير إليها dd. هذا في الواقع لا معنى له ، لأن ddهو في الواقع نقل 10x كمية البيانات في الثانية الواحدة! ومع ذلك، dd لا نقل عبر الشبكة - يتم التعامل مع هذه المهمة من قبل gzip معالجة.

بعض السياق: gzip سوف تستهلك البيانات من أنبوب الإدخال الخاص به بأسرع ما يمكن مسح المخزن المؤقت الداخلي الخاص به. السرعة التي gzipتعتمد الفوارق المؤقتة على بعض العوامل:

  • عرض النطاق الترددي للكتابة I / O (والذي يتم اختناقه من قبل الشبكة ، وظل ثابتًا)
  • عرض النطاق الترددي قراءة I / O (الذي سيكون أعلى بكثير من قراءة 1MB / ثانية من قرص محلي على جهاز حديث ، وبالتالي ليس عنق الزجاجة المحتمل)
  • نسبة الضغط الخاصة به (والتي سأفترضها من خلال تسريع 10X الخاص بك لتكون حوالي 10٪ ، مما يشير إلى أنك تقوم بضغط نوع من النصوص المتكررة للغاية مثل ملف السجل أو بعض XML)

لذلك في هذه الحالة ، يمكن للشبكة التعامل مع 100 كيلوبايت / ثانية ، و gzip هو ضغط البيانات حول 10: 1 (وليس اختناقا من قبل وحدة المعالجة المركزية). هذا يعني أنه في الوقت الذي يتم فيه إخراج 100 كيلوبايت / ثانية ، gzip يستطيع تستهلك 1MB / ثانية ، ومعدل الاستهلاك هو ما dd استطيع ان اري.


0
2017-10-21 04:57