Soy un estudiante de posgrado y el grupo en el que trabajo mantiene un clúster de Linux. Cada nodo del clúster tiene su propio disco local, pero estos discos locales son relativamente pequeños y no están equipados con respaldo automático. Por tanto, el grupo posee un servidor de archivos con muchos TB de espacio de almacenamiento. Soy un novato relativo en Linux, por lo que no estoy seguro de cuáles son las especificaciones del servidor de archivos en términos de velocidad, capacidad de red, etc. Sé por experiencia que los discos locales son significativamente más rápidos que el servidor de archivos en términos de E / S . Aproximadamente una docena de personas usan el servidor de archivos.
Usar cp
para copiar un archivo de ~ 20 GB desde el servidor de archivos a uno de los discos locales toma aproximadamente 11,5 minutos en tiempo real en promedio (según time
). Sé que esta operación cp
no es muy eficiente porque (1) time
me dice que la hora del sistema para tal copia es solo ~ 45 segundos; y porque (2) cuando examino top
durante la copia, % CPU es bastante bajo (según la inspección, aproximadamente 0-10% en promedio).
Usar cp
para copiar el mismo archivo de ~ 20 GB de una carpeta en el disco local a otra carpeta en el mismo disco local lleva menos tiempo, aproximadamente 9 minutos en tiempo real (~ 51 segundos en tiempo del sistema, de acuerdo con time
). Entonces, aparentemente, el servidor de archivos es algo más lento que el disco local, como se esperaba, pero quizás no significativamente más lento. Me sorprende que copiar de local a local no es más rápido que 9 minutos.
Necesito copiar ~ 200 archivos grandes, cada uno ~ 20 GB, desde el servidor de archivos a uno de los discos locales. Entonces, mi pregunta es: ¿Existe una alternativa más rápida a cp
para copiar archivos grandes en Linux? (¿O hay alguna marca dentro de cp
que podría usar y que aceleraría la copia?) Incluso si pudiera reducir un minuto de este tiempo de copia, ayudar inmensamente.
Estoy seguro de que comprar discos de hardware nuevos y más rápidos, pero no tengo acceso a dichos recursos. Tampoco soy un administrador del sistema, solo soy un usuario (novato) – así que no tengo acceso a información más detallada sobre la carga que hay en los discos. Sé que, aunque alrededor de una docena de personas usan el servidor de archivos a diario, yo soy la única persona que usa este nodo / disco local en particular.
Comentarios
Respuesta
El% de CPU debería estar bajo durante una copia. La CPU le dice al controlador de disco «tomar datos de los sectores X – Y en el búfer de memoria en Z». Luego va y hace otra cosa (o dormir, si no hay nada más). El hardware desencadena una interrupción cuando los datos están en la memoria. Luego, la CPU tiene que copiarlo unas cuantas veces y le dice a la tarjeta de red «transmitir paquetes en las ubicaciones de memoria A, B y C». Luego vuelve a hacer otra cosa.
Estás presionando ~ 240mbps.En una LAN gigabit, debería poder hacer al menos 800 Mbps, pero:
- Eso se comparte entre todos los que usan el servidor de archivos (y posiblemente una conexión entre conmutadores, etc.)
- Eso está limitado por la velocidad con la que el servidor de archivos puede manejar la escritura, teniendo en cuenta que el ancho de banda de E / S de su disco es compartido por todos los que lo usan.
- No especificó cómo está accediendo al servidor de archivos (NFS, CIFS (Samba), AFS, etc.). Es posible que deba ajustar el montaje de su red, pero en cualquier cosa que sea medio reciente, los valores predeterminados suelen ser bastante cuerdos.
Para rastrear el cuello de botella, iostat -kx 10
va a ser un comando útil. Le mostrará la utilización en sus discos duros locales. Si puede ejecutar eso en el servidor de archivos, le dirá qué tan ocupado está el servidor de archivos.
La solución general será acelerar ese cuello de botella, para el cual, por supuesto, no tiene el presupuesto. Pero hay un par de casos especiales en los que puede encontrar un enfoque más rápido:
- Si los archivos son comprimibles, y tienes una CPU rápida, hacer una compresión mínima sobre la marcha puede ser más rápido. Algo como
lzop
o tal vezgzip --fastest
. - Si solo está cambiando algunos bits aquí y allá, y luego devuelve el archivo, solo enviar deltas será mucho más rápido. Desafortunadamente,
rsync
no ayudará mucho aquí, ya que necesitará leer el archivo en ambos lados para encontrar el delta. En su lugar, necesita algo que realice un seguimiento del delta a medida que cambia el archivo … La mayoría de los enfoques aquí son específicos de la aplicación. Pero es posible que pueda armar algo con, por ejemplo, mapeador de dispositivos (consulte el nuevo dm-era target ) o btrfs. - Si está copiando los mismos datos en múltiples máquinas, puede usar algo como udpcast para enviarlo a todas las máquinas a la vez.
Y, dado que notó que no es el administrador de sistemas, supongo que eso significa que tiene un administrador de sistemas. O al menos alguien responsable de la red & del servidor de archivos. Probablemente debería preguntarle / ellos, deberían estar mucho más familiarizados con los detalles de tu configuración. Tus administradores de sistemas deberían al menos poder decirte qué tasa de transferencia puedes esperar razonablemente.
Comentarios
- +1 para iostat -kx 10 🙂
Responder
Esto podría, posiblemente, ser una alternativa más rápida y no obstruirá la red durante dos días: tome uno o dos USB grandes (USB 3 si lo tiene) o discos FireWire, conéctelo a servidor y copie los archivos en el disco. Lleve el disco a su máquina local. Copie los archivos en la máquina.
Comentarios
- Sneakernet ( en.wikipedia.org/ wiki / Sneakernet ) puede ser muy rápido: nunca subestimes el ancho de banda de una camioneta llena de cintas que se precipitan por la autopista.
Respuesta
Si tiene acceso directo SSH (o SFTP) (pregunte a su administrador de sistemas), puede usar scp
con compresión (-C
):
scp -C you@server:/path/to/yourfile .
Por supuesto, eso solo es útil si el archivo es comprimible, y esto usará más tiempo de CPU, ya que usará cifrado (porque es sobre SSH) y comprimir.
Comentarios
- En este caso, sería útil deshabilitar el cifrado. Recuerde que estamos tratando de hacer la copia más rápida .
- @lgeorget Sospecho que la sobrecarga del cifrado no ‘ t será significativa , considerando lo lentos que son los discos duros. Consideré agregar algo sobre
-c none
, pero esa parece no ser estándar . - ‘ estamos tratando con archivos ~ 20G, por lo que es bastante ineficaz utilizar el cifrado si no es necesario.
- @lgeorget El cifrado puede ser realizado mucho más rápido que el rendimiento que ‘ está obteniendo, por lo que no ‘ ralentiza nada. Pero parece innecesario pasar por SSH aquí. Si solo necesita compresión, seguramente hay otras herramientas.
- @Thomas La ventaja de SSH es que si ‘ se supone que debe tener acceso al servidor remoto, entonces es casi seguro que ‘ esté ejecutando SSH. Otra opción sería comprimir el archivo localmente, copiarlo al servidor, luego
ssh
y descomprimirlo ..
Respuesta
Su definición de eficiente es al revés. Una implementación más eficiente desperdicia menos tiempo de CPU. En la copia local, tiene un promedio de 74 MB / s de rendimiento (lectura + escritura), que es tan bueno como lo que puede obtener un solo disco duro.
Comentarios
Responder
El cp
Lo más probable es que la implementación no sea un cuello de botella. Intente observar el uso de IO a través de iotop
tanto en el servidor como en el nodo del clúster. Esto le dará una idea de dónde puede mejorar el rendimiento.
Otro consejo es evitar copiar los mismos datos del mismo host. Por ejemplo, si tiene un archivo 20G idéntico para distribuir desde el servidor de archivos a través de la red a todos los nodos del clúster, funcionará mucho más rápido si copia los archivos de igual a igual en lugar de un servidor a todos los clientes. Es un poco más complicado de implementar, pero incluso puede intentar usar alguna línea de comandos p2p como un concentrador de conexión directa.
Si dentro de esos archivos 20G, alguna parte es común y otras son específicas de un nodo de clúster, considere dividirlo en partes comunes y específicas, y luego distribuir la parte común en forma p2p.
Comentarios
- Si ‘ re en una LAN, debería poder hacer multidifusión en lugar de peer-to-peer. Lo cual debería ser más rápido y con menos carga en la red.
Respuesta
La naturaleza / contenido de esos archivos puede marcar una diferencia. Comprendí que necesita copiar 200 archivos, ~ 20 GB cada uno, de una computadora a otra , ¿es eso?
Si esos archivos son comprimibles o con piezas similares / idénticas, tiene dos enfoques:
-
comprímalos antes de copiarlos, o crea un túnel entre las computadoras con zip habilitado. Por lo tanto, si la red es el cuello de botella, será un poco más rápido r
-
si los archivos son muy similares, o comparten algunas partes de contenido común entre ellos, intente usar rsync . Pasará algún tiempo buscando lo que es común entre los archivos y no necesitará copiarlo literalmente , porque lo reconstruirá basándose en lo que es común.
editar
¿Necesitarás copiar esos archivos muchas veces? (como una copia -> usar esos archivos -> cambiar algo en los archivos en la computadora A -> copiar archivos nuevamente a la computadora B)
Si es así, rsync será útil, porque tratará de detectar lo que es igual entre las versiones y no copiará lo que no ha cambiado.
Y un tercer método: si lo anterior es correcto (cambios en el archivo, luego copie todos los archivos nuevamente en la segunda computadora), puede probar con binary diff
para cambiar en la segunda computadora lo que se cambió en la primera computadora.
Respuesta
Veo lo siguiente aquí, el cifrado no es un buena idea, ya que posiblemente AUMENTE la cantidad de datos que se transferirán.
Si está copiando entre dos sistemas, entonces el cuello de botella es, por supuesto, t La conexión entre los servidores.
Si está copiando localmente, observe cómo va el proceso, es UN SOLO hilo, por lo que las utilidades estándar de Linux usan:
- for all blocks in a file read a block write a block
No hay simultaneidad para esta operación.
Para acelerar las cosas, puede usar algo como esto:
buffer -i infile -o outfile -m size-of-shared-memory-default-1MByte
Consulte la página de manual de buffer (1) para obtener más información.
El comando buffer configura dos procesos para ejecutar el proceso de copia al mismo tiempo: uno para leer y otro para escribir, y usa un búfer de memoria compartida para comunicar los datos entre los dos procesos. El búfer de memoria compartida es su búfer circular clásico que evita la sobrescritura de datos no escritos y la escritura de datos ya escritos. He usado este programa para reducir entre un 10 y un 20% del tiempo de copia en transferencias de disco a cinta.
Comentarios
- En realidad, hay concurrencia en » leer un bloque / escribir un bloque » porque » escribir un bloque » en realidad simplemente lo coloca en el búfer ‘ del kernel, y el kernel maneja la escritura en bloque real en segundo plano (al menos, empezar a quedarse sin RAM). O si está utilizando O_DSYNC / O_SYNC por algún motivo.
Respuesta
¿Por qué no probar un algoritmo de propagación P2P? , si necesita actualizar todo su clúster al mismo tiempo?
https://github.com/lg/murder es qué usa Twitter
Hay «s BTSync que también puedes probar.
Responder
Si está copiando los mismos conjuntos de archivos con frecuencia desde su computadora local al servidor con cambios menores aquí y allá. Puede acelerar la transferencia utilizando rsync o DVCS (por ejemplo, hg o git).
git o hg pueden realizar un seguimiento y detectar deltas y solo transferir esos deltas. En caso de usar un git, dado que ambos lados tienen el historial completo del repositorio, averiguar el delta es muy barato.
rsync utiliza una forma de algoritmo de suma de comprobación continua para detectar deltas sin conocimiento previo de lo que hay en el otro lado. Si bien rsync necesita más trabajo para calcular los deltas, no necesita almacenar el total historial de archivos.
Respuesta
Puede intentar empaquetar todos los archivos en un solo archivo (no es necesario que esté comprimido). En mi experiencia, copiar ese archivo es más rápido que copiar una gran cantidad de archivos individuales
Comentarios
- Buena observación genérica, pero como dice la pregunta “~ 200 archivos grandes, cada uno ~ 20 GB”, no ‘ creo que esto pueda considerarse una respuesta real a este problema.
- @manatwork ah .. No ‘ no leí con claridad. Pensé que tenía 200 archivos por un total de 20 GB
Respuesta
Pruebe bbcp . Las pruebas en nuestro entorno revelaron que cp tenía algún tipo de Gobernador incorporado. Solo tenga cuidado porque cuando se quita el gobernador, puede poner en línea roja su servidor y provocar una interrupción. En nuestro caso, estábamos desconectando el servidor para hacer la copia, así que más rápido era mejor. Este tiempo de transferencia mejorado varias horas.
Respuesta
Asegúrese de que el objetivo los archivos no existen antes de copiarlos.
A veces es sorprendente cuánto tiempo se dedica a copiar en el mismo host (sin red involucrada).
Vea mi respuesta a otra pregunta de CP aquí . En pocas palabras, sobrescribir un archivo existente es mucho más lento que truncarlo o desvincularlo primero, y luego copiar. Este último es 8 veces más rápido para un archivo de 1,2 GB.
dd
yrsync
para comparar cuál funciona más rápido en su entornodd
, pero acabo de intentarrsync
. El tiempo real fue de aproximadamente 11,5 minutos y el tiempo del sistema fue de aproximadamente 1,5 minutos, segúntime
./dev/sda1
a/dev/sdb1
será más rápido que copiar desde una ubicación en/dev/sda1
a otra ubicación en/dev/sda1
u otra partición en/dev/sda
porque el disco duro ganó ‘ t tiene que realizar búsquedas adicionales entre lecturas y escrituras (asumiendo discos duros tradicionales con discos giratorios y cabezas móviles; SSD es obviamente diferente).