Apa yang sebenarnya dilakukan flag `-C` di` scp`?

35

Saya selalu menggunakan salah satu rsyncatau scpuntuk menyalin file dari / ke mesin jarak jauh. Baru-baru ini, saya menemukan di manual scp( man scp) bendera-C

 -C      Compression enable.  Passes the -C flag to
         ssh(1) to enable compression.

Sebelum saya menemukan bendera ini, saya dulu zipdan kemudian scp.

Apakah efisien untuk hanya menggunakan -Czipping dan unzipping? Kapan menggunakan satu atau beberapa proses lain yang membuat transfer lebih cepat?

Remi.b
sumber
2
Cara terbaik yang saya pikirkan adalah benchmark sendiri. Menggunakan scp -rvdan scp -Crvmembandingkan throughput.
cuonglm
3
Ini sama sekali tidak relevan dengan pertanyaan, tetapi zipmerupakan format file yang sangat "windows". Anda hampir tidak akan pernah melihat atau membutuhkannya saat mengoperasikan mesin linux dengan perangkat lunak linux asli. tardigunakan untuk menggulung direktori ke dalam satu file sambil menjaga hak akses dan nama dan seperti itu, sedangkan gzip, bzip2, xz, dll digunakan untuk file kompres. tars sering dikompresi, dibuat tar.gzdan tar.xzformat umum untuk arsip di linux. Saya telah melihat orang-orang menggulung scpworkalike mereka sendiri dengan perintah seperti tar cvz directory | ssh machine 'cd somewhere; tar xz'.
Score_Di Bawah
2
@Score_Under - Format zip juga digunakan oleh Java untuk mengemas file .jar, jadi zip masih digunakan secara luas di banyak server Linux.
Johnny
Alih-alih menggunakan opsi pada setiap transfer file, Anda dapat memasukkan file Compression yesAnda .ssh/config.
Barmar
Jika Anda benar-benar menginginkan kecepatan, Anda mungkin dapat menghindari SSH: unix.stackexchange.com/questions/227951/…
rogerdpack

Jawaban:

22

Tidak pernah benar-benar akan membuat perbedaan besar, tetapi zip file sebelum menyalinnya harus sedikit kurang efisien karena menggunakan format kontainer seperti zipitu dapat merangkum beberapa file (seperti tar) tidak perlu dan tidak mungkin untuk streaming zip input dan output (jadi Anda memerlukan file sementara).

Menggunakan gzipdi sisi lain, bukannya zipharus persis sama karena itu apa yang ssh -Cada di bawah tenda ... kecuali bahwa gzipping sendiri lebih banyak pekerjaan daripada hanya menggunakan ssh -C.

Celada
sumber
Ok, saya akan periksa apa gzipitu. Apakah jawaban Anda berarti itu scp -rCmungkin solusi paling efisien yang saya miliki?
Remi.b
1
Jawaban Anda tidak menganggap itu -Cmengompresi aliran protokol interaktif. Anda hanya mempertimbangkan data. Jadi kesimpulan Anda salah. Lihat jawaban saya
Martin Prikryl
@Celada Zip dapat menulis ke saluran pipa karena direktori anggota ditempatkan di akhir. Namun, seperti yang Anda katakan, unzipping membutuhkan upaya mengekstraksi lebih dari satu anggota sehingga tidak dapat membaca dari saluran pipa.
jrw32982 mendukung Monica
20

The -Cbendera memungkinkan kompresi gzip dari aliran SSH.

Ini setara dengan Accept-Encoding: gzipdi HTTP.

Bagaimana kinerja flag tergantung pada jenis data yang Anda transfer:

  • Saat mentransfer file besar tunggal, kinerjanya hampir sama dengan zip file sebelum transfer (mengabaikan efisiensi algoritma zip vs gzip).

    Tetapi menggunakan -Cadalah usaha yang kurang bagi Anda sebagai pengguna.

  • Saat mentransfer banyak file kecil, kinerjanya akan lebih rendah daripada zip file sebelum transfer.

    Alasan di balik itu adalah, bahwa sebelum setiap transfer file, ada komunikasi interaktif antara server SCP dan klien (untuk bertukar metadata file, seperti cap waktu dan izin). Jadi kedua belah pihak harus menunggu sedikit agar pihak lain merespons (kompresi tidak akan membantu saat menunggu). Itu adalah waktu yang terbuang untuk setiap file yang ditransfer. Berapa banyak waktu yang terbuang tergantung pada latensi koneksi. Pada akhirnya, transfer bisa menjadi lebih lambat.

    Ketika Anda mentransfer satu file zip, komunikasi itu hanya terjadi sekali.

Martin Prikryl
sumber
8

Ini memungkinkan kompresi gzip di ssh (di bawah scp).

Pada koneksi yang lambat ini akan mempercepat, pada koneksi yang cukup cepat (100Mbit atau lebih cepat) kompresi sangat mungkin memperlambat segalanya.

Akan lebih atau kurang efisien daripada zip berdasarkan pada apakah gzip (khususnya gzip -6) akan lebih atau kurang efisien daripada tingkat kompresi zip yang Anda pilih

Wayne Walker
sumber
1
Dalam kasus khusus saya, saya memiliki koneksi yang relatif baik (saya di kampus) tetapi folder yang harus saya salin sangat besar (~ 100GB lebih dari 442 .bindan .txtfile). Jadi Anda akan menyarankan untuk hanya menggunakan scp -rdan tanpa -Cbendera dan tidak zip, gzipbukan tar?
Remi.b
2
@ Remi.b: Anda mungkin harus membandingkan keduanya dan melihatnya. Pertanyaannya adalah, apakah CPU cukup cepat untuk memampatkan data pada kecepatan yang lebih cepat daripada yang dapat dikirim melalui jaringan tanpa kompresi. Jadi jawabannya tergantung pada mesin dan jaringan Anda.
Nate Eldredge
Oke saya mendapat poin +1. Terima kasih atas bantuan Anda
Remi.b
SSH sendiri sepertinya mengambil beberapa CPU yang saya perhatikan, terkadang maxing jauh di bawah max bandwidth Anda. Tidak yakin apa yang harus dilakukan di sana ...
rogerdpack
Kinerja tergantung pada data juga. Menyalin file yang pada dasarnya semua nol akan sangat dikompresi. Saya memiliki tautan 500Mb antara dua server jarak jauh, dan baru saja menyalin file 50G (VMWare VMDK) yang berisi semua nol pada tautan ini pada ~ 128-130MB / s (kemungkinan beberapa batas buffer kompresi scp), hanya membutuhkan waktu sekitar 6-7 menit. Tanpa kompresi, ini akan memakan waktu 1:45 jam. Jarak tempuh Anda akan bervariasi tergantung pada kompleksitas data dan seberapa baik dapat dikompres.
Topher