¿Cuál es la forma más rápida de copiar 400G de archivos de un volumen de almacén de bloques elásticos ec2 a s3?


21

Tengo que copiar 400G de archivos de un volumen de almacenamiento de bloque elástico a un cubo s3 ... Esos son unos 300k archivos de ~ 1Mb

He intentado s3cmd y s3fuse , ambos son muy, muy lento .. RAN s3cmd para un día completo, indican que se terminó la copia, y cuando comprobé el cubo, no hubiera pasado nada (supongo que algo salió mal, pero al menos s3cmd nunca se quejó de nada)

S3Fuse está trabajando para otro día completo y copió menos del 10% de los archivos ...

¿Hay una mejor solución para esto?

Estoy ejecutando Linux (ubuntu 12.04) por supuesto


2
Muchos puntos de referencia (por ejemplo, este ) han demostrado 3 factores determinantes del rendimiento a S3: 1) tamaño de archivo 2) número de subprocesos paralelos y 3) tamaño de instancia. Entre 64 y 128 cargas paralelas (simultáneas) de objetos de 1 MB deberían saturar el enlace ascendente de 1 Gbps que tiene un m1.xlarge e incluso deberían saturar el enlace ascendente de 10 Gbps de una instancia de computación en clúster (cc1.4xlarge). Debería haber muchas secuencias de comandos con esto en mente (por ejemplo, esta o s3cmd-modificación)
cyberx86

1
s3-parallel-put hizo el truco!
aseba

Respuestas:


20

Hay varios factores clave que determinan el rendimiento de EC2 a S3:

  • Tamaño de archivo: los archivos más pequeños requieren una mayor cantidad de solicitudes y más gastos generales y transferencias más lentas. La ganancia con el tamaño de archivo (cuando se origina en EC2) es insignificante para archivos de más de 256kB. (Mientras que la transferencia desde una ubicación remota, con mayor latencia, tiende a continuar mostrando mejoras apreciables hasta entre 1MiB y 2MiB).
  • Número de subprocesos paralelos: un subproceso de carga único generalmente tiene un nivel bastante bajo, a menudo inferior a 5MiB / s El rendimiento aumenta con el número de subprocesos concurrentes y tiende a alcanzar un pico entre 64 y 128 subprocesos. Cabe señalar que las instancias más grandes pueden manejar una mayor cantidad de subprocesos concurrentes.
  • Tamaño de la instancia: según las especificaciones de la instancia , las instancias más grandes tienen recursos más dedicados, incluida una asignación más grande (y menos variable) de ancho de banda de red (y E / S en general, incluida la lectura de discos efímeros / EBS) que están conectados a la red. Los valores numéricos para cada categoría son:
    • Muy alto: teórico: 10 Gbps = 1250 MB / s; Realista: 8.8Gbps = 1100MB / s
    • Alto: teórico: 1 Gbps = 125 MB / s; Realista: 750Mbps = 95MB / s
    • Moderado: teórico: 250 Mbps; Realista: 80 Mbps = 10 MB / s
    • Bajo: teórico: 100 Mbps; Realista: 10-15Mbps = 1-2MB / s

En los casos de transferencia de grandes cantidades de datos, puede ser económicamente práctico usar una instancia de cómputo de clúster, ya que la ganancia efectiva en el rendimiento (> 10x) es mayor que la diferencia en el costo (2-3x).

Si bien las ideas anteriores son bastante lógicas (aunque el límite por subproceso puede no serlo), es bastante fácil encontrar puntos de referencia que las respalden. Uno particularmente detallado se puede encontrar aquí .

Usar entre 64 y 128 cargas paralelas (simultáneas) de objetos de 1 MB debería saturar el enlace ascendente de 1 Gbps que tiene un m1.xlarge e incluso debería saturar el enlace ascendente de 10 Gbps de una instancia de cómputo de clúster (cc1.4xlarge).

Si bien es bastante fácil cambiar el tamaño de la instancia, los otros dos factores pueden ser más difíciles de administrar.

  • El tamaño del archivo generalmente es fijo: no podemos unir archivos en EC2 y dividirlos en S3 (por lo tanto, no hay mucho que podamos hacer sobre archivos pequeños). Sin embargo, en archivos grandes, podemos dividirnos en el lado EC2 y volver a armar en el lado S3 (usando la carga de varias partes de S3). Por lo general, esto es ventajoso para archivos de más de 100 MB.
  • Los hilos paralelos son un poco más difíciles de atender. El enfoque más simple se reduce a escribir un contenedor para algunos scripts de carga existentes que ejecutarán varias copias al mismo tiempo. Mejores enfoques utilizan la API directamente para lograr algo similar. Teniendo en cuenta que la clave son las solicitudes paralelas, no es difícil localizar varios scripts potenciales, por ejemplo:
    • Modificación de s3cmd : una bifurcación de una versión anterior de s3cmd que agregó esta funcionalidad, pero que no se ha actualizado en varios años.
    • s3-parallel-put : secuencia de comandos de Python razonablemente reciente que funciona bien

8

Entonces, después de muchas pruebas, s3-parallel-put hizo el truco increíblemente. Claramente, la solución si necesita cargar muchos archivos a S3. Gracias a cyberx86 por los comentarios.


3
Por curiosidad, a) ¿cuánto tiempo tardó en cargar los 400 GB? B) ¿cuántos hilos usó? C) ¿qué tamaño de instancia usó?
cyberx86

1
@ Cyberx86 Recientemente usé s3-parallel-put en una instancia grande de Ec2. Usé 5 hilos y copió 288.73 GB en 10.49 horas.
Gortron


2

Escribí una aplicación de consola optimizada en C # ( CopyFasterToS3 ) para hacer esto. Utilicé en EBS vol, en mi caso tenía 5 carpetas con más de 2 millones de archivos en una cantidad de 20 Gb. El script se ejecutó en menos de 30 minutos.

En este artículo, mostré cómo usar una función recursiva con paralelo. Puedes transcribirlo a otro idioma.

¡Buena suerte!


1

También hay: s3funnel , que parece muy antiguo (2008) y algunos errores abiertos, pero que aún se incluye en la lista de Amazon: amzn-lnk



1

Intente usar s3-cli en lugar de s3cmd. ¡Lo usé en lugar de s3cmd para cargar archivos en mi bucket de s3 e hizo que mi implementación fuera más rápida en casi 17 minutos (de 21 a 4 minutos)!

Aquí está el enlace: https://github.com/andrewrk/node-s3-cli

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.