Estoy tratando de copiar un lote de archivos scp
pero es muy lento. Este es un ejemplo con 10 archivos:
$ 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
Lo extraño es que la velocidad de transferencia es de aproximadamente 413 KB / sy el tamaño del archivo es de aproximadamente 413 KB, por lo que realmente debería transferir un archivo por segundo, sin embargo, tarda unos 4,3 segundos por archivo.
¿Alguna idea de dónde proviene esta sobrecarga y hay alguna forma de hacerlo más rápido?
scp
time
batch-jobs
Laurent
fuente
fuente
Respuestas:
El comentario de @ wurtel probablemente sea correcto: hay mucha sobrecarga estableciendo cada conexión. Si puede solucionarlo , obtendrá transferencias más rápidas (y si no puede hacerlo, simplemente use la
rsync
solución alternativa de @ roaima ). Hice un experimento transfiriendo archivos de tamaño similar (head -c 417K /dev/urandom > foo.1
e hice algunas copias de ese archivo) a un host que tarda un tiempo en conectarse (HOST4) y uno que responde muy rápidamente (HOST1):fuente
Puede usar
rsync
(overssh
), que usa una sola conexión para transferir todos los archivos de origen.Si usted no tiene
rsync
(y por qué no !?) se puede utilizartar
conssh
este tipo, lo que evita la creación de un archivo temporal:El
rsync
es preferible, siendo todo lo demás igual, porque es reiniciable en el caso de una interrupción.fuente
scp
invocación no usaría una sola conexión para transferir todos los archivos?f -
en cada lado, ya que las salidas tar a / lee desde stdout / stdin por defecto. Entoncestar cz cap_* | ssh user@host tar xvzC dir
lo haría.tar
puede compilarse con diferentes valores predeterminados (veatar --show-defaults
si está usando GNU tar, o de lo/etc/default/tar
contrario, y en ambos casos no olvide laTAPE
variable de entorno)scp
crearía una nueva conexión para cada archivo, pero al recordarlo, y después de verificarlo dos vecestshark
, me di cuenta de que estaba incorrecto. En este punto, ya no estoy seguro de por qué los OPscp
deberían tomar tanto tiempo por archivo.Es la negociación de la transferencia lo que lleva tiempo. En general, las operaciones en n archivos de b bytes cada una lleva mucho, mucho más tiempo que una sola operación en un solo archivo de n * b bytes. Esto también es cierto, por ejemplo, para E / S de disco.
Si observa detenidamente, verá que la velocidad de transferencia en este caso es size_of_the_file / secs.
Para transferir archivos de manera más eficiente, agrúpelos
tar
y luego transfiera el tarball:tar cvf myarchive.tar cap_20151023T*.png
o, si también quieres comprimir el archivo,
tar cvzf myarchive.tar.gz myfile*
Si se comprime o no depende del contenido del archivo, por ejemplo. si son JPEG o PNG, la compresión no tendrá ningún efecto.
fuente
-z
tar
normalmente hace una segunda pasada para la compresión o si estaría comprimiendo y archivando al mismo tiempo-z
está vinculado a la CPU y es mucho más lento. gzip siempre intentará comprimir, de ahí la ralentización; después de todo, no puede saber si una cadena de bytes es compresible hasta que haya intentado comprimirla. En mi configuración, incluso cuando se transfieren archivos de texto sin formato, rsync sin compresión es el más rápido en un factor de 2-3 en comparación con la compresión más ligera. Por supuesto, YMMV.Otra razón por la que scp es más lento de lo que debería ser, especialmente en redes de gran ancho de banda, es porque tiene memorias intermedias de control de flujo interno estáticamente definidas que terminan convirtiéndose en cuellos de botella en el rendimiento de la red.
HPN-SSH es una versión parcheada de OpenSSH que aumenta el tamaño de estos búferes. Hace una gran diferencia en la velocidad de transferencia scp (ver los cuadros en el sitio, pero también hablo por experiencia personal). Por supuesto, para obtener los beneficios, necesita instalar HPN-SSH en todos sus hosts, pero vale la pena si necesita transferir regularmente archivos grandes.
fuente
He usado la técnica descrita aquí que usa gzip y netcat paralelos para comprimir y copiar datos rápidamente.
Se reduce a:
Esto usa tar para reunir el archivo o archivos. Luego usa pigz para obtener muchos subprocesos de la CPU para comprimir y enviar el archivo, la transmisión de red está usando netcat. En el lado receptor, netcat escucha y luego descomprime (en paralelo) y untars.
fuente
nc
no está encriptado Añadir un poco dessh -D
magia tal vez?Acabo de tener este problema haciendo una transferencia de sitio a sitio de un gran archivo mp4 a través de
scp
. Estaba obteniendo ~ 250KB / s. Después de deshabilitar la protección de inundación UDP (FP) en el firewall de destino, la velocidad de transferencia aumentó a 6.5MB / s. Al volver a encender FP, la velocidad volvió a caer a ~ 250 KB / s.Remitente: cygwin, Receptor: Fedora 20, Firewall Sophos UTM.
¿Para qué utiliza SSH UDP? @ superuser.com : no lo hace directamente de lo que leí.
Al revisar el registro del firewall, se estaba produciendo una detección de inundación en los puertos de origen y destino 4500 a través de las direcciones IP públicas, no en las direcciones VPN internas privadas de sitio a sitio. Por lo tanto, parece que mi problema es una situación de NAT Traversal en la que los
scp
datos TCP se encriptan y encapsulan en paquetes ESP y UDP y, en consecuencia, están sujetos a FP. Para eliminarscp
de la ecuación, ejecuté una operación de copia de archivos de Windows a través de la VPN y noté un rendimiento similarscp
con y sin FP habilitado. También ejecuté unaiperf
prueba sobre TCP y noté 2Mbits / seg con FP, y 55Mbits / seg sin.¿Cómo funciona NAT-T con IPSec? @ cisco.com
fuente