Saya ingin membuat cadangan jalur dari komputer di jaringan saya ke komputer lain di jaringan yang sama melalui jalur 100 Mbit / s. Untuk ini saya lakukan
dd if=/local/path of=/remote/path/in/local/network/backup.img
yang memberi saya kecepatan transfer jaringan yang sangat rendah sekitar 50 hingga 100 kB / s, yang akan memakan waktu selamanya. Jadi saya menghentikannya dan memutuskan untuk mencoba gzip dengan cepat agar lebih kecil sehingga jumlah yang ditransfer lebih sedikit. Jadi saya lakukan
dd if=/local/path | gzip > /remote/path/in/local/network/backup.img.gz
Tapi sekarang saya mendapatkan kecepatan transfer jaringan 1 MB / s, jadi faktor 10 hingga 20 lebih cepat. Setelah memperhatikan ini, saya menguji ini pada beberapa jalur dan file, dan selalu sama.
Mengapa perpipaan dd
melalui gzip
juga meningkatkan kecepatan transfer dengan faktor besar, bukan hanya mengurangi panjang gelombang aliran dengan faktor besar? Saya bahkan mengharapkan penurunan kecil dalam kecepatan transfer, karena konsumsi CPU yang lebih tinggi saat mengompresi, tapi sekarang saya mendapatkan nilai tambah ganda. Bukannya aku tidak bahagia, tapi aku hanya ingin tahu. ;)
dd
adalah keluaran 1MB / s ... langsung kegzip
pipa tunggu . Sangat sedikit hubungannya dengan ukuran blok.Jawaban:
dd
secara default menggunakan ukuran blok yang sangat kecil - 512 byte (!!). Artinya, banyak yang membaca dan menulis. Tampaknyadd
, digunakan secara naif dalam contoh pertama Anda, menghasilkan banyak paket jaringan dengan muatan yang sangat kecil, sehingga mengurangi throughput.Di sisi lain,
gzip
cukup pintar untuk melakukan I / O dengan buffer yang lebih besar. Artinya, sejumlah kecil tulisan besar melalui jaringan.Bisakah Anda mencoba
dd
lagi denganbs=
parameter yang lebih besar dan melihat apakah itu berfungsi lebih baik kali ini?sumber
gzip
dan bloksibs=10M
-> transfer jaringan cepat sesuatu sekitar 3 atau 4 MB / s. Blocksize lebih tinggi +gzip
tidak mengubah apa pun dibandingkan + kecil blocksizegzip
.write(3)
untuk buffer.Agak terlambat untuk ini tetapi mungkin saya tambahkan ...
Dalam sebuah wawancara saya pernah ditanya apa yang akan menjadi metode tercepat untuk kloning data bit-for-bit dan dari tanggapan kasar dengan penggunaan
dd
ataudc3dd
( didanai DoD ). Pewawancara mengkonfirmasikan bahwa perpipaandd
kedd
lebih efisien, karena ini hanya memungkinkan Baca / Tulis simultan atau dalam istilah programmerstdin/stdout
, sehingga dua kali lipat kecepatan tulis dan separuh waktu transfer.sumber
dd status=progress if=/dev/zero count=100000 bs=1M of=/dev/null
adalah 22.5GB / s,dd status=progress if=/dev/zero count=100000 bs=1M | dd of=/dev/null bs=1M
adalah 2.7GB. Jadi pipa membuatnya lebih lambat.Cong benar. Anda mengalirkan blok dari disk yang tidak dikompresi ke host jarak jauh. Antarmuka jaringan, jaringan, dan server jarak jauh Anda adalah batasannya. Pertama, Anda perlu meningkatkan kinerja DD. Menentukan parameter bs = yang sejajar dengan memori buffer disk akan mendapatkan kinerja maksimal dari disk. Katakanlah bs = 32M misalnya. Ini kemudian akan mengisi buffer gzip di sata atau selisih laju garis sas dari buffer drive. Disk akan lebih condong ke transfer sekuensial yang memberi hasil lebih baik melalui put. Gzip akan memampatkan data dalam aliran dan mengirimkannya ke lokasi Anda. Jika Anda menggunakan NFS yang memungkinkan transmisi nfs menjadi minimal. Jika Anda menggunakan SSH maka Anda membungkus enkapsulasi dan enkripsi SSH. Jika Anda menggunakan netcat maka Anda tidak memiliki enkripsi di atas kepala.
sumber
Saya berasumsi di sini bahwa "kecepatan transfer" yang Anda maksud sedang dilaporkan oleh
dd
. Ini sebenarnya masuk akal, karenadd
sebenarnya mentransfer 10x jumlah data per detik ! Namun,dd
tidak mentransfer melalui jaringan - pekerjaan itu sedang ditangani olehgzip
proses.Beberapa konteks:
gzip
akan mengkonsumsi data dari pipa input secepat mungkin dapat menghapus buffer internal. Kecepatangzip
buffer kosong tergantung pada beberapa faktor:Jadi dalam hal ini, jaringan dapat menangani 100kB / s, dan
gzip
mengompresi data sekitar 10: 1 (dan tidak dihambat oleh CPU). Ini berarti bahwa sementara itu mengeluarkan 100kB / s,gzip
dapat mengkonsumsi 1MB / s, dan tingkat konsumsi adalah apa yangdd
bisa dilihat.sumber