ทำไมการไพพ์ 'dd' ผ่าน gzip จึงเร็วกว่าการคัดลอกโดยตรง


79

ฉันต้องการสำรองเส้นทางจากคอมพิวเตอร์ในเครือข่ายของฉันไปยังคอมพิวเตอร์เครื่องอื่นในเครือข่ายเดียวกันผ่านสาย 100 Mbit / s สำหรับสิ่งนี้ฉันทำ

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

ซึ่งให้ความเร็วในการถ่ายโอนข้อมูลผ่านเครือข่ายที่ต่ำมากของฉันประมาณ 50 ถึง 100 kB / s ซึ่งจะคงอยู่ตลอดไป ดังนั้นฉันจึงหยุดมันและตัดสินใจที่จะลอง gzipping มันทันทีเพื่อทำให้มันเล็กลงมากเพื่อที่จำนวนการถ่ายโอนจะน้อยลง ดังนั้นฉันทำ

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

แต่ตอนนี้ฉันได้รับความเร็วการถ่ายโอนเครือข่าย 1 MB / s ดังนั้นปัจจัย 10 ถึง 20 เร็วขึ้น หลังจากสังเกตเห็นสิ่งนี้ฉันทดสอบสิ่งนี้ในหลาย ๆ พา ธ และไฟล์และมันก็เหมือนกันเสมอ

เหตุใดการส่งddผ่านท่อจึงgzipเพิ่มอัตราการถ่ายโอนด้วยปัจจัยขนาดใหญ่แทนที่จะลดเพียงความยาวคลื่น bytel ด้วยปัจจัยขนาดใหญ่เท่านั้น ฉันคาดว่าแม้อัตราการถ่ายโอนจะลดลงเล็กน้อยเนื่องจากการใช้ CPU ที่สูงขึ้นในขณะที่บีบอัด แต่ตอนนี้ฉันได้รับการบวกสองครั้ง ไม่ใช่ว่าฉันไม่มีความสุข แต่ฉันแค่สงสัย ;)


1
512 ไบต์เป็นขนาดบล็อกมาตรฐานสำหรับที่จัดเก็บไฟล์ใน Unix ต้น เนื่องจากทุกอย่างเป็นไฟล์ใน Unix / Linux จึงเป็นค่าเริ่มต้นสำหรับทุกสิ่ง ยูทิลิตี้รุ่นใหม่กว่าส่วนใหญ่นั้นเพิ่มขึ้น แต่ไม่ใช่ dd
DocSalvager

คำตอบง่ายๆก็คือว่าddกำลังส่งออกที่ 1MB / s ... ลงในgzipท่อรอ มีขนาดเล็กมากที่เกี่ยวข้องกับบล็อก
Tullo_x86

คำตอบ:


100

ddโดยค่าเริ่มต้นจะใช้ขนาดบล็อกเล็กมาก - 512 ไบต์ (!!) นั่นคือการอ่านและเขียนขนาดเล็กจำนวนมาก ดูเหมือนว่าddใช้อย่างไร้เดียงสาในตัวอย่างแรกของคุณสร้างแพ็กเก็ตเครือข่ายจำนวนมากที่มีน้ำหนักบรรทุกขนาดเล็กมากซึ่งช่วยลดปริมาณงานได้

ในทางตรงกันข้ามgzipมันฉลาดพอที่จะทำ I / O ด้วยบัฟเฟอร์ที่ใหญ่กว่า นั่นคือการเขียนขนาดใหญ่จำนวนน้อยผ่านเครือข่าย

คุณสามารถลองddอีกครั้งโดยใช้bs=พารามิเตอร์ที่มีขนาดใหญ่ขึ้นและดูว่าเวลานี้ทำงานได้ดีขึ้นหรือไม่


20
ขอขอบคุณลองคัดลอกโดยตรงโดยไม่ต้อง gzipบล็อกขนาดของbs=10M-> การถ่ายโอนเครือข่ายที่รวดเร็วของบางอย่างประมาณ 3 หรือ 4 MB / s บล็อคอุดมศึกษา + gzipไม่ได้เปลี่ยนแปลงอะไรเมื่อเทียบกับขนาดเล็กบล็อค gzip+
Foo Bar

7
หากคุณต้องการดูว่าขนาดบล็อกสูง ๆ ลองทำ dd อื่นหลังจาก gzip
Joshua

gzip ทำการบัฟเฟอร์เอาต์พุตของตัวเองหรือใช้แค่ stdio?
Barmar

@Barmar ถ้าฉันอ่านแหล่งข้อมูลอย่างถูกต้องมันก็แค่write(3)บัฟเฟอร์

@CongMa คุณยังสามารถลองใช้ pigz แทน gzip มันจะทำงานได้เร็วขึ้น
GioMac

4

ช้าไปหน่อย แต่ฉันจะเพิ่ม ...

ในการสัมภาษณ์ครั้งหนึ่งฉันถูกถามว่าอะไรจะเป็นวิธีที่เร็วที่สุดที่เป็นไปได้สำหรับการโคลนข้อมูลแบบบิตต่อบิตและการตอบสนองแบบหยาบกับการใช้ddหรือdc3dd( เงินทุนของ DoD ) ผู้สัมภาษณ์ยืนยันว่าการวางท่อddให้ddมีประสิทธิภาพมากขึ้นเพียงแค่อนุญาตให้อ่าน / เขียนหรือเขียนโปรแกรมพร้อมกันstdin/stdoutดังนั้นความเร็วในการเขียนและการถ่ายโอนครึ่งหนึ่งจึงน้อยมาก

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

1
ฉันไม่คิดว่ามันเป็นเรื่องจริง ฉันเพิ่งลองตอนนี้ dd status=progress if=/dev/zero count=100000 bs=1M of=/dev/nullคือ 22.5GB / s dd status=progress if=/dev/zero count=100000 bs=1M | dd of=/dev/null bs=1Mคือ 2.7GB ดังนั้นท่อทำให้ช้าลง
falsePockets

0

Cong ถูกต้องแล้ว คุณกำลังสตรีมบล็อกจากดิสก์ที่ไม่ได้บีบอัดไปยังโฮสต์ระยะไกล อินเทอร์เฟซเครือข่ายเครือข่ายและเซิร์ฟเวอร์ระยะไกลของคุณเป็นข้อ จำกัด ก่อนอื่นคุณต้องทำให้ประสิทธิภาพของ DD ดีขึ้น การระบุพารามิเตอร์ bs = ที่สอดคล้องกับหน่วยความจำบัฟเฟอร์ดิสก์จะได้รับประสิทธิภาพสูงสุดจากดิสก์ พูด bs = 32M เป็นต้น สิ่งนี้จะเติมบัฟเฟอร์ของ gzip ที่ช่องอัตรา sata หรือ sas strait จากบัฟเฟอร์ไดรฟ์ ดิสก์จะมีความโน้มเอียงที่จะถ่ายโอนข้อมูลแบบต่อเนื่องให้ดีขึ้นผ่านการใส่ Gzip จะบีบอัดข้อมูลในสตรีมและส่งไปยังตำแหน่งของคุณ หากคุณใช้ NFS ที่จะช่วยให้การส่ง nfs น้อยที่สุด หากคุณกำลังใช้ SSH คุณต้องมีการห่อหุ้ม SSH และค่าใช้จ่ายในการเข้ารหัส ถ้าคุณใช้ netcat คุณจะไม่มีการเข้ารหัสเหนือส่วนหัว


0

ผมถือว่านี่ว่า "ความเร็วในการโอน" ddคุณหมายถึงจะถูกรายงานโดย สิ่งนี้สมเหตุสมผลแล้วเนื่องจากddถ่ายโอนข้อมูลได้ 10 เท่าต่อวินาที ! อย่างไรก็ตามddไม่ได้ถ่ายโอนผ่านเครือข่าย - งานนั้นกำลังถูกจัดการโดยgzipกระบวนการ

บริบทบางอย่าง: gzipจะใช้ข้อมูลจากอินพุตไพพ์เร็วเท่าที่จะสามารถเคลียร์บัฟเฟอร์ภายในได้ ความเร็วที่การgzipทิ้งบัฟเฟอร์ขึ้นอยู่กับปัจจัยสองสามประการ:

  • แบนด์วิดธ์การเขียน I / O (ซึ่งเป็นเครือข่ายคอขวดและยังคงที่อยู่)
  • แบนด์วิดธ์การอ่าน I / O (ซึ่งจะสูงกว่าการอ่าน 1MB / s จากโลคัลดิสก์บนเครื่องที่ทันสมัยจึงไม่ใช่คอขวดที่น่าจะเป็นไปได้)
  • อัตราส่วนการบีบอัด (ซึ่งฉันจะถือว่าการเร่งความเร็ว 10 เท่าของคุณอยู่ที่ประมาณ 10% แสดงว่าคุณกำลังบีบอัดข้อความที่มีความซ้ำซ้อนสูงเช่นล็อกไฟล์หรือ XML)

ดังนั้นในกรณีนี้เครือข่ายสามารถจัดการ 100kB / s และgzipกำลังบีบอัดข้อมูลประมาณ 10: 1 (และไม่ได้ถูกคอขวดโดย CPU) ซึ่งหมายความว่าในขณะที่กำลังส่งออก 100kB / s gzipสามารถบริโภค 1MB / s และอัตราการบริโภคคือสิ่งที่ddสามารถมองเห็น

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