Saya mencoba menyalin sejumlah file dengan scp
tetapi sangat lambat. Ini adalah contoh dengan 10 file:
$ time scp cap_* user@host:~/dir
cap_20151023T113018_704979707.png 100% 413KB 413.2KB/s 00:00
cap_20151023T113019_999990226.png 100% 413KB 412.6KB/s 00:00
cap_20151023T113020_649251955.png 100% 417KB 416.8KB/s 00:00
cap_20151023T113021_284028464.png 100% 417KB 416.8KB/s 00:00
cap_20151023T113021_927950468.png 100% 413KB 413.0KB/s 00:00
cap_20151023T113022_567641507.png 100% 413KB 413.1KB/s 00:00
cap_20151023T113023_203534753.png 100% 414KB 413.5KB/s 00:00
cap_20151023T113023_855350640.png 100% 412KB 411.7KB/s 00:00
cap_20151023T113024_496387641.png 100% 412KB 412.3KB/s 00:00
cap_20151023T113025_138012848.png 100% 414KB 413.8KB/s 00:00
cap_20151023T113025_778042791.png 100% 413KB 413.4KB/s 00:00
real 0m43.932s
user 0m0.074s
sys 0m0.030s
Yang aneh adalah bahwa kecepatan transfer sekitar 413KB / s dan ukuran file sekitar 413KB sehingga benar-benar harus mentransfer satu file per detik, namun butuh sekitar 4,3 detik per file.
Adakah yang tahu dari mana overhead ini berasal, dan adakah cara untuk membuatnya lebih cepat?
scp
time
batch-jobs
laurent
sumber
sumber
Jawaban:
Komentar @ wurtel mungkin benar: ada banyak overhead membangun setiap koneksi. Jika Anda dapat memperbaiki bahwa Anda akan mendapatkan transfer yang lebih cepat (dan jika Anda tidak bisa, cukup gunakan
rsync
solusi @ roaima ). Saya melakukan percobaan mentransfer file berukuran serupa (head -c 417K /dev/urandom > foo.1
dan membuat beberapa salinan file itu) ke host yang membutuhkan waktu untuk terhubung (HOST4) dan yang merespons dengan sangat cepat (HOST1):sumber
Anda dapat menggunakan
rsync
(lebihssh
), yang menggunakan satu koneksi untuk mentransfer semua file sumber.Jika Anda tidak memiliki
rsync
(dan mengapa tidak !?) Anda dapat menggunakantar
denganssh
seperti ini, yang menghindari membuat file sementara:Yang
rsync
harus disukai, semua hal lain dianggap sama, karena dapat dimulai kembali jika terjadi gangguan.sumber
scp
permohonan tunggal tidak akan menggunakan koneksi tunggal untuk mentransfer semua file?f -
di setiap sisi, karena tar menghasilkan ke / membaca dari stdout / stdin secara default. Jaditar cz cap_* | ssh user@host tar xvzC dir
akan melakukannya.tar
dapat dikompilasi dengan nilai default yang berbeda (lihattar --show-defaults
apakah Anda menggunakan tar GNU, atau/etc/default/tar
sebaliknya, dan dalam kedua kasus jangan lupaTAPE
variabel lingkungan)scp
akan membuat koneksi baru untuk setiap file, tetapi pada ingatan - dan setelah memeriksa ulang dengantshark
- saya menyadari bahwa saya salah. Pada titik ini saya tidak lagi yakin mengapa OPscp
harus mengambil waktu yang lama per file.Ini negosiasi negosiasi yang membutuhkan waktu. Secara umum, operasi pada n file b byte masing-masing membutuhkan lebih banyak waktu, lebih lama daripada operasi tunggal pada file tunggal n * b byte. Ini juga berlaku misalnya untuk disk I / O.
Jika Anda perhatikan dengan teliti, Anda akan melihat bahwa kecepatan transfer dalam kasus ini adalah size_of_the_file / detik.
Untuk mentransfer file lebih efisien, bundel bersama
tar
, lalu transfer tarball:tar cvf myarchive.tar cap_20151023T*.png
atau, jika Anda juga ingin mengompresi arsip,
tar cvzf myarchive.tar.gz myfile*
Apakah kompres atau tidak tergantung pada konten file, mis. jika itu JPEG atau PNG, kompresi tidak akan berpengaruh apa pun.
sumber
-z
tar
biasanya melakukan pass kedua untuk kompresi atau jika itu akan mengompresi dan pengarsipan pada saat yang sama-z
terikat CPU, dan jauh lebih lambat. gzip akan selalu mencoba untuk mengompres, karenanya memperlambatnya; lagipula, Anda tidak dapat memastikan apakah serangkaian byte dapat dikompres hingga Anda mencoba mengompresnya. Dalam pengaturan saya, bahkan ketika mentransfer file teks biasa, rsync tanpa kompresi adalah yang tercepat dengan faktor 2-3 dibandingkan dengan kompresi paling ringan. Tentu saja, YMMV.Alasan lain bahwa scp lebih lambat dari yang seharusnya, terutama pada jaringan bandwidth tinggi, adalah bahwa ia memiliki buffer kontrol aliran internal yang ditentukan secara statis yang akhirnya menjadi hambatan kinerja jaringan.
HPN-SSH adalah versi patch OpenSSH yang meningkatkan ukuran buffer ini. Itu membuat perbedaan besar untuk kecepatan transfer scp (lihat grafik di situs, tetapi saya juga berbicara dari pengalaman pribadi). Tentu saja, untuk mendapatkan manfaat yang Anda butuhkan untuk menginstal HPN-SSH pada semua host Anda, tetapi itu sangat berharga jika Anda secara teratur perlu mentransfer file besar.
sumber
Saya telah menggunakan teknik yang dijelaskan di sini yang menggunakan gzip dan netcat paralel untuk dengan cepat memampatkan dan menyalin data.
Intinya adalah:
Ini menggunakan tar untuk mengumpulkan file atau file. Kemudian menggunakan pigz untuk mendapatkan banyak thread cpu untuk mengkompres dan mengirim file, transmisi jaringan menggunakan netcat. Di sisi penerima, netcat mendengarkan lalu uncompresses (secara paralel) dan untar.
sumber
nc
tidak dienkripsi. Tambahkanssh -D
sihir mungkin?Baru saja masalah ini melakukan transfer situs ke situs dari file mp4 besar melalui
scp
. Sudah mendapatkan ~ 250KB / s. Setelah menonaktifkan perlindungan banjir UDP (FP) pada firewall tujuan, kecepatan transfer meningkat menjadi 6,5MB / s. Ketika menyalakan kembali FP, nilai turun kembali ke ~ 250KB / s.Pengirim: cygwin, Penerima: Fedora 20, Firewall Sophos UTM.
Untuk apa SSH menggunakan UDP? @ superuser.com - Tidak langsung dari apa yang saya baca.
Dalam meninjau log firewall, deteksi banjir terjadi pada port sumber & dest 4500 atas alamat IP publik, bukan alamat VPN internal internal situs-ke-situs. Jadi sepertinya masalah saya kemungkinan adalah situasi NAT Traversal di mana
scp
data TCP pada akhirnya dienkripsi dan dienkapsulasi dalam paket ESP & UDP, dan akibatnya tunduk pada FP. Untuk menghapusscp
dari persamaan, saya menjalankan operasi menyalin file Windows di VPN dan melihat kinerja serupa denganscp
dengan dan tanpa FP diaktifkan. Juga menjalankaniperf
tes melalui TCP dan melihat 2Mbits / detik dengan FP, dan 55Mbits / detik tanpa.Bagaimana cara NAT-T bekerja dengan IPSec? @ cisco.com
sumber