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

  • Eso hace alrededor de 29 MB / s, que es bastante rápido si me preguntas. No ‘ no creo que haya ‘ ningún comando que acelere esto, el » el cuello de botella » es probablemente a) la red ob) el servidor de archivos.
  • El tink es 100% correcto. ‘ nunca he visto nada que pueda mejorar esto. Lo único que ‘ he hecho en el pasado es comprimir los datos antes de enviarlos, pero eso significa que ‘ está agregando tiempo con el paso de compresión y los pasos de descompresión, pero a veces eso ‘ vale la pena si los datos son un buen candidato para ser comprimidos.
  • También puede probar dd y rsync para comparar cuál funciona más rápido en su entorno
  • @Salton Gracias. Todavía no he probado dd, pero acabo de intentar rsync. El tiempo real fue de aproximadamente 11,5 minutos y el tiempo del sistema fue de aproximadamente 1,5 minutos, según time.
  • I ‘ Me sorprende que nadie haya señalado que la copia de disco local a disco local podría hacerse más eficiente si se montan varios discos. Copiar desde /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).

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:

  1. Eso se comparte entre todos los que usan el servidor de archivos (y posiblemente una conexión entre conmutadores, etc.)
  2. 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.
  3. 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 vez gzip --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

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

  • Vaya.Cuando dije » eficiente, » quise decir » rápido. »
  • 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.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *