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