tutorial permission password how example linux bash unix ubuntu scp

linux - permission - ¿Cómo copiar archivos lo más rápido posible?



scp tutorial (5)

Estoy ejecutando mi script de shell en machineA que copia los archivos de machineB y machineC en machineA .

Si el archivo no está allí en machineB , entonces debería estar allí en machineC seguro. Así que primero intentaré copiar desde la machineB , si no está allí en la machineB entonces iré a la machineC para copiar los mismos archivos.

En machineB y machineC habrá una carpeta como esta YYYYMMDD dentro de esta carpeta -

/data/pe_t1_snapshot

Así que cualquiera que sea la fecha es la última fecha en este formato YYYYMMDD dentro de la carpeta de arriba - Seleccionaré esa carpeta como la ruta completa desde donde necesito comenzar a copiar los archivos -

así que supongamos que si esta es la última carpeta de fecha 20140317 dentro /data/pe_t1_snapshot , esta será la ruta completa para mí:

/data/pe_t1_snapshot/20140317

desde donde necesito comenzar a copiar los archivos en machineB y machineC . Necesito copiar alrededor de 400 archivos en machineA desde machineB y machineC y cada tamaño de archivo es de 1.5 GB .

Actualmente tengo mi script de shell inferior que funciona bien ya que estoy usando scp pero de alguna manera toma ~ 2 hours copiar los 400 archivos en machineA que es demasiado largo para mí, supongo. :(

A continuación está mi script de shell:

#!/bin/bash readonly PRIMARY=/export/home/david/dist/primary readonly SECONDARY=/export/home/david/dist/secondary readonly FILERS_LOCATION=(machineB machineC) readonly MEMORY_MAPPED_LOCATION=/data/pe_t1_snapshot PRIMARY_PARTITION=(0 3 5 7 9) # this will have more file numbers around 200 SECONDARY_PARTITION=(1 2 4 6 8) # this will have more file numbers around 200 dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1) dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1) echo $dir1 echo $dir2 if [ "$dir1" = "$dir2" ] then # delete all the files first find "$PRIMARY" -mindepth 1 -delete for el in "${PRIMARY_PARTITION[@]}" do scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. done # delete all the files first find "$SECONDARY" -mindepth 1 -delete for sl in "${SECONDARY_PARTITION[@]}" do scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. done fi

Estoy copiando archivos PRIMARY_PARTITION en la carpeta PRIMARY y archivos SECONDARY en la carpeta SECONDARY en machineA .

¿Hay alguna forma de mover los archivos más rápido en machineA . ¿Puedo copiar 10 archivos a la vez o 5 archivos a la vez en paralelo para acelerar este proceso o cualquier otro enfoque?

NOTA: machineA está ejecutando en SSD

ACTUALIZAR:-

Parallel Shell Script que probé, la parte superior del script de shell es la misma que se muestra arriba.

if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ] then find "$PRIMARY" -mindepth 1 -delete for el in "${PRIMARY_PARTITION[@]}" do (scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.) & WAITPID="$WAITPID $!" done find "$SECONDARY" -mindepth 1 -delete for sl in "${SECONDARY_PARTITION[@]}" do (scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.) & WAITPID="$WAITPID $!" done wait $WAITPID echo "All files done copying." fi

Errores que obtuve con script de shell paralelo-

channel 24: open failed: administratively prohibited: open failed channel 25: open failed: administratively prohibited: open failed channel 26: open failed: administratively prohibited: open failed channel 28: open failed: administratively prohibited: open failed channel 30: open failed: administratively prohibited: open failed mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer channel 32: open failed: administratively prohibited: open failed channel 36: open failed: administratively prohibited: open failed channel 37: open failed: administratively prohibited: open failed channel 38: open failed: administratively prohibited: open failed channel 40: open failed: administratively prohibited: open failed channel 46: open failed: administratively prohibited: open failed channel 47: open failed: administratively prohibited: open failed channel 49: open failed: administratively prohibited: open failed channel 52: open failed: administratively prohibited: open failed channel 54: open failed: administratively prohibited: open failed channel 55: open failed: administratively prohibited: open failed channel 56: open failed: administratively prohibited: open failed channel 57: open failed: administratively prohibited: open failed channel 59: open failed: administratively prohibited: open failed mux_client_request_session: session request failed: Session open refused by peer channel 61: open failed: administratively prohibited: open failed mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer mux_client_request_session: session request failed: Session open refused by peer channel 64: open failed: administratively prohibited: open failed mux_client_request_session: session request failed: Session open refused by peer channel 68: open failed: administratively prohibited: open failed channel 72: open failed: administratively prohibited: open failed channel 74: open failed: administratively prohibited: open failed channel 76: open failed: administratively prohibited: open failed channel 78: open failed: administratively prohibited: open failed


puedes probar este comando

rsync

desde el

man rsync

Verá que: El protocolo de actualización remota rsync permite que rsync transfiera solo las diferencias entre dos conjuntos de archivos a través de la conexión de red, utilizando un algoritmo de búsqueda de suma de comprobación eficiente descrito en el informe técnico que acompaña a este paquete.


Puede probar el HPN-SSH (High Performance SSH / SCP) - http://www.psc.edu/index.php/hpn-ssh o http://hpnssh.sourceforge.net/

El proyecto HPN-SSH es el conjunto de parches para OpenSSH (scp es parte de él), para ajustar mejor varios tcp y búferes internos. También hay un cifrado "ninguno" ("Ninguna conmutación de cifrado") que deshabilita el cifrado, y esto también puede ser útil (si no usa redes públicas para enviar los datos).

Tanto la compresión como el cifrado consumen tiempo de CPU; y Ethernet de 10 Gbit a veces puede ser más rápido transferir archivos sin comprimir luego esperar que la CPU los comprima y los cifre.

Puede perfilar su configuración:

  • Mida el ancho de banda de la red entre las máquinas que usan iperf o netperf . Compare con la red real (capacidades de tarjetas de red, conmutadores). Con una buena configuración, debería obtener más del 80-90 por ciento de velocidad declarada.
  • Calcule el volumen de datos y el tiempo necesario para transferir tantos datos con su red usando la velocidad de iperf o netperf . Compare con el tiempo de transferencia real, ¿hay una gran diferencia?
    • Si su CPU es rápida, los datos son compresibles y la red es lenta, la compresión lo ayudará.
  • Eche un vistazo en la top , vmstat , iostat .
    • ¿Hay núcleos de CPU cargados al 100% (ejecutar top y presionar 1 para ver núcleos)?
    • ¿Hay demasiadas interrupciones ( in ) en vmstat 1 ? ¿Qué hay de los interruptores de contexto ( cs )?
    • ¿Cuál es la velocidad de lectura de archivos en iostat 1 ? ¿Sus HDD son lo suficientemente rápidos como para leer datos? para escribir datos en el receptor?
  • Puede intentar hacer un perfil completo del sistema utilizando perf top o perf record -a . ¿Hay mucha computación por scp o stack de red en Linux? Si puede instalar dtrace o ktap , intente también crear perfiles fuera de la CPU

Tiene 1.5 GB * 400 = 600 GB de datos. No relacionado con la respuesta, sugiero que la configuración de la máquina parece incorrecta si necesita transferir esta cantidad de datos. Probablemente necesites generar estos datos en la máquina A en primer lugar.

Hay 600 GB de datos transferidos en 2 horas, es decir, una velocidad de transferencia de ~ 85 MB / s, lo que significa que probablemente haya alcanzado los límites de transferencia de sus unidades de disco o (casi) de la red. Creo que no podrás transferir más rápido con ningún otro comando.

Si las máquinas están cerca una de otra, el método de copiado que creo que es el más rápido es eliminar físicamente el almacenamiento de las máquinas B y C, ponerlas en la máquina A y luego copiarlas localmente sin transferirlas a través de la red. El momento para esto es el momento de moverse por el almacenamiento, más los tiempos de transferencia de disco. Me temo, sin embargo, que la copia no será mucho más rápida que 85 MB / s.

El comando de transferencia de red que creo que sería el más rápido es netcat, porque no tiene sobrecarga relacionada con el cifrado. Además, si los archivos no son archivos multimedia, debe comprimirlos utilizando un compresor que se comprima más rápido que 85 MB / s. Sé de lzop y lz4 que se conceden para ser más rápidos que esta tasa. Entonces mi línea de comando para transferir un solo directorio sería (sintaxis BSD netcat):

máquina A:

$ nc -l 2000 | lzop -d | tar x

máquina B o C (se puede ejecutar desde la máquina A con la ayuda de ssh):

$ tar c directory | lzop | nc machineA 2000

Retire el compresor si está transfiriendo archivos multimedia, que ya están comprimidos.

Los comandos para organizar su estructura de directorios son irrelevantes en términos de velocidad, así que no me molesté en escribirlos aquí, pero puede reutilizar su propio código.

Este es el método más rápido que puedo pensar, pero, de nuevo, no creo que este comando sea mucho más rápido que lo que ya tienes.


rsync opcionalmente comprime sus datos. Eso típicamente hace que la transferencia sea mucho más rápida.

No mencionaste SCP, pero SCP -C también se comprime.

Tenga en cuenta que la compresión puede hacer que la transferencia sea más rápida o más lenta, dependiendo de la velocidad de su CPU y de su enlace de red.

Los enlaces más lentos y la CPU más rápida hacen que la compresión sea una buena idea; los enlaces más rápidos y la CPU más lenta hacen que la compresión sea una mala idea.

Como con cualquier optimización, mida los resultados en su propio entorno.

También creo que ftp es otra opción para ti, ya que mi prueba de velocidad de transferencia para archivos grandes (> 10M) FTP funciona más rápido que SCP e incluso rsync (depende del formato de archivo y la tasa de compresión).


rsync es una buena respuesta, pero si te preocupa la seguridad, debes considerar usar:

rdist

Aquí se pueden encontrar algunos detalles sobre las diferencias entre rsync y rdist: rdist vs rsync y un blog sobre cómo configurarlo usando ssh se puede encontrar aquí: actualización remota no root

Finalmente, podrías usar el infame patrón tar tar tar, con una pizca de ssh.

tar zcvf - /wwwdata | ssh [email protected] "cat > /backup/wwwdata.tar.gz"

Aquí se habla de este ejemplo: copia de alquitrán en una red segura