Tại sao đường ống 'dd' qua gzip nhanh hơn nhiều so với bản sao trực tiếp?


79

Tôi muốn sao lưu một đường dẫn từ một máy tính trong mạng của tôi sang một máy tính khác trong cùng một mạng qua dòng 100 Mbit / s. Đối với điều này tôi đã làm

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

điều này mang lại cho tôi tốc độ truyền mạng rất thấp khoảng 50 đến 100 kB / giây, sẽ mất mãi mãi. Vì vậy, tôi đã dừng nó lại và quyết định thử gzipping nó để làm cho nó nhỏ hơn nhiều để số tiền cần chuyển ít hơn. Tôi cũng vậy

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

Nhưng bây giờ tôi nhận được một cái gì đó như tốc độ truyền mạng 1 MB / s, do đó, hệ số từ 10 đến 20 nhanh hơn. Sau khi nhận thấy điều này, tôi đã thử nghiệm điều này trên một số đường dẫn và tệp, và nó luôn giống nhau.

Tại sao đường ống ddđi qua gzipcũng làm tăng tốc độ truyền tải theo một hệ số lớn thay vì chỉ giảm chiều dài của luồng bằng một hệ số lớn? Thay vào đó, tôi dự kiến ​​sẽ giảm một chút tốc độ truyền, do mức tiêu thụ CPU cao hơn trong khi nén, nhưng bây giờ tôi nhận được gấp đôi. Không phải là tôi không hạnh phúc, nhưng tôi chỉ đang tự hỏi. ;)


1
512 byte là kích thước khối tiêu chuẩn để lưu trữ tệp trong Unix đầu tiên. Vì mọi thứ đều là một tệp trong Unix / Linux, nên nó trở thành mặc định cho mọi thứ. Các phiên bản mới hơn của hầu hết các tiện ích đã tăng nhưng không phải dd.
DocSalvager

Câu trả lời đơn giản ddlà xuất ra với tốc độ 1MB / s ... ngay trong gzipống chờ . Nó có rất ít để làm với kích thước khối.
Tullo_x86

Câu trả lời:


100

ddtheo mặc định sử dụng kích thước khối rất nhỏ - 512 byte (!!). Đó là, rất nhiều đọc và viết nhỏ. Dường như dd, được sử dụng một cách ngây thơ trong ví dụ đầu tiên của bạn, đã tạo ra một số lượng lớn các gói mạng với tải trọng rất nhỏ, do đó làm giảm thông lượng.

Mặt khác, gzipđủ thông minh để thực hiện I / O với bộ đệm lớn hơn. Đó là, một số lượng nhỏ hơn các bài viết lớn qua mạng.

Bạn có thể thử ddlại với một bs=tham số lớn hơn và xem lần này nó có hoạt động tốt hơn không?


20
Cảm ơn, đã thử sao chép trực tiếp mà không cần gzip và kích thước khối bs=10M-> chuyển mạng nhanh khoảng 3 hoặc 4 MB / s. Kích thước khối cao hơn + gzipkhông thay đổi bất cứ điều gì so với kích thước khối nhỏ + gzip.
Foo Bar

7
Nếu bạn muốn xem kích thước khối cao nào, hãy thử một dd khác sau gzip.
Joshua

Là gzip đang thực hiện bộ đệm đầu ra của chính nó, hay nó chỉ sử dụng stdio?
Barmar

@Barmar Nếu tôi đang đọc nguồn chính xác, nó chỉ đơn giản write(3)là vào bộ đệm.

@CongMa bạn cũng có thể thử và sử dụng pigz thay vì gzip, nó sẽ hoạt động nhanh hơn nữa
GioMac

4

Hơi muộn với điều này nhưng tôi có thể thêm ...

Trong một cuộc phỏng vấn, tôi đã từng được hỏi đâu là phương pháp nhanh nhất có thể để sao chép dữ liệu bit-bit-bit và trả lời thô với việc sử dụng ddhoặc dc3dd( do DoD tài trợ ). Người phỏng vấn xác nhận rằng đường ống ddđến ddhiệu quả hơn, vì điều này chỉ đơn giản cho phép Đọc / Ghi đồng thời hoặc theo thuật ngữ lập trình viên stdin/stdout, do đó tăng gấp đôi tốc độ ghi và thời gian truyền một nửa.

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

1
Tôi không nghĩ đó là sự thật. Tôi vừa mới thử. dd status=progress if=/dev/zero count=100000 bs=1M of=/dev/nulllà 22,5 GB / giây, là 2,7 GB dd status=progress if=/dev/zero count=100000 bs=1M | dd of=/dev/null bs=1M. Vì vậy, đường ống làm cho nó chậm hơn.
falsePockets

0

Công là đúng. Bạn đang truyền các khối ra khỏi đĩa không nén đến một máy chủ từ xa. Giao diện mạng, mạng và máy chủ từ xa của bạn là những hạn chế. Trước tiên, bạn cần tăng hiệu suất của DD. Chỉ định tham số bs = căn chỉnh với bộ nhớ đệm của đĩa sẽ nhận được hiệu suất cao nhất từ ​​đĩa. Nói bs = 32M chẳng hạn. Điều này sau đó sẽ lấp đầy bộ đệm của gzip tại eo biển tốc độ dòng sata hoặc sas từ bộ đệm ổ đĩa. Đĩa sẽ nghiêng về chuyển tuần tự tốt hơn thông qua đặt. Gzip sẽ nén dữ liệu trong luồng và gửi đến vị trí của bạn. Nếu bạn đang sử dụng NFS sẽ cho phép truyền nfs ở mức tối thiểu. Nếu bạn đang sử dụng SSH thì bạn mã hóa phần đóng gói và mã hóa SSH. Nếu bạn sử dụng netcat thì bạn không có mã hóa qua đầu.


0

Tôi giả sử ở đây rằng "tốc độ truyền" mà bạn đang đề cập đang được báo cáo bởi dd. Điều này thực sự có ý nghĩa, bởi vì ddthực sự truyền 10 lần lượng dữ liệu mỗi giây ! Tuy nhiên, ddkhông được chuyển qua mạng - công việc đó đang được xử lý theo gzipquy trình.

Một số bối cảnh: gzipsẽ tiêu thụ dữ liệu từ đường ống đầu vào của nó nhanh nhất có thể để xóa bộ đệm bên trong của nó. Tốc độ gziptrống của bộ đệm phụ thuộc vào một số yếu tố:

  • Băng thông ghi I / O (bị tắc nghẽn bởi mạng và không đổi)
  • Băng thông đọc I / O (sẽ cao hơn nhiều so với tốc độ đọc 1 MB / giây từ đĩa cục bộ trên máy hiện đại, do đó không phải là nút cổ chai có khả năng)
  • Tỷ lệ nén của nó (mà tôi sẽ cho rằng tốc độ tăng gấp 10 lần của bạn là khoảng 10%, cho thấy bạn đang nén một loại văn bản có tính lặp lại cao như tệp nhật ký hoặc một số XML)

Vì vậy, trong trường hợp này, mạng có thể xử lý 100kB / giây và gzipđang nén dữ liệu khoảng 10: 1 (và không bị CPU làm tắc nghẽn). Điều này có nghĩa là trong khi nó xuất ra 100kB / s, gzipcó thể tiêu thụ 1MB / s và tốc độ tiêu thụ là những gì ddcó thể thấy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.