Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Transferencias de S3 más rápidas y económicas: supera a AWS CLI hasta 80x

By Matthew PorterJun 6, 20247 min read

Esta página también está disponible en English, Deutsch, Français, Italiano, 日本語 y Português.

Si alguna vez has tenido que transferir millones de archivos o varios TB de datos hacia o desde buckets de S3, sabes lo lentas que pueden resultar estas operaciones en AWS. ¿Y si te dijera que existe una forma de acelerar las cargas, descargas y copias en uno o dos órdenes de magnitud, y que es tan sencilla como ejecutar AWS CLI?

Te presento: s5cmd

Una representación fiel de las llamadas a la API de s3 de AWS CLI vs. s5cmd

s5cmd es una herramienta CLI open-source diseñada para replicar la funcionalidad de AWS CLI sobre S3, pero con un rendimiento muy superior, ya que está escrita en Go (un lenguaje compilado), a diferencia del lenguaje interpretado basado en Python sobre el que corre AWS CLI. Un SDK respaldado por Go alcanza un alto throughput no solo en archivos individuales, sino también en grandes volúmenes de archivos, gracias a las capacidades de procesamiento paralelo nativas de Go, que le permiten ejecutar múltiples transferencias de alto rendimiento en simultáneo. Esto contrasta con la incapacidad de Python, por su Global Interpreter Lock, para aprovechar de manera eficiente varios núcleos.

El README de la herramienta en GitHub afirma que, comparado con AWS CLI, es hasta 12 veces más rápido en descargas; pero como verás en los resultados de los benchmarks a continuación, bajo las condiciones adecuadas la transferencia de datos resulta muchísimo más rápida.

Esta ventaja en los tiempos de transferencia se traduce directamente en menos tiempo de cómputo de EC2 (y, por lo tanto, en ahorro de dinero). Como verás pronto, no usar s5cmd implica dejar mucho dinero sobre la mesa.

Para comparar el rendimiento de s5cmd y aws s3 cp en distintos escenarios, mediré los tiempos de ejecución de las siguientes tareas sobre 4 TB de datos:

  • Carga de EC2 a S3
  • Descarga de S3 a EC2
  • Copia entre buckets en la misma región
  • Copia entre buckets en regiones distintas

Los tiempos de ejecución de las cuatro tareas anteriores se medirán para ambas herramientas sobre cuatro tipos diferentes de conjuntos de datos de 4 TB:

  • Archivos muy grandes (5 GB, 819 archivos)
  • Archivos grandes (1 GB, 4.096 archivos)
  • Archivos medianos (32 MB, 131.072 archivos)
  • Archivos pequeños (256 KB, 16.777.216 archivos)

Además, AWS CLI siempre se ejecutará dos veces:

  • Una vez con la configuración por defecto
  • Una segunda vez con los siguientes valores actualizados para mejorar el throughput en una instancia EC2 de alto rendimiento:

max_concurrent_requests=64 (para igualar la VM de 64 núcleos), en lugar de 10

multipart_threshold=1GB, en lugar de 8MB

multipart_chunksize=256MB, en lugar de 8MB

El rendimiento de carga, descarga y copia depende fuertemente de variables como el tamaño y la cantidad de objetos, la habilitación de la concurrencia y la prevención de concurrencia excesiva mediante umbrales altos para cargas multipart. Por eso, los siguientes benchmarks contemplan estas variables para mostrar el rendimiento de transferencia en varios escenarios de uso reales.

Si quieres reproducir los benchmarks de este artículo, consulta el repositorio de Git que acompaña a este post. Hace que la reproducción automatizada sea lo más sencilla posible.

Una nota rápida antes de entrar en las comparaciones de tiempos:

Para todas las pruebas se utilizó una máquina c7gn.16xlarge de última generación, con 200 Gbps de throughput de red y 64 núcleos Graviton de alto rendimiento. A esta se conectaron 12 volúmenes EBS gp3 de 1,1 GB en configuración RAID0, cada uno con 16.000 IOPS y 1.000 Mbps de throughput. Esta configuración asegura que recursos como el throughput de red, el throughput de I/O y la capacidad de procesamiento no sean cuellos de botella, permitiendo que las herramientas se luzcan al máximo nivel.

Carga de EC2 a S3

A continuación se muestran los tiempos de ejecución de s5cmd cp vs. aws s3 cp al subir archivos desde una instancia EC2 de alto rendimiento a un bucket de S3 en la misma región.

Ten en cuenta que el eje y está en escala logarítmica en todos los gráficos siguientes:

El gráfico deja claro que s5cmd es sustancialmente más rápido subiendo archivos que las herramientas de AWS CLI, sin importar el tamaño de los archivos.

s5cmd es entre 19x y 26x más rápido subiendo a S3 que AWS CLI cuando este último se deja con su configuración por defecto, una diferencia asombrosa.

Modificar la configuración de AWS CLI para soportar mejor la paralelización solo arroja mejoras marginales hasta que se trabaja con archivos de tamaño medio o pequeño. Subir la cantidad de cargas simultáneas de 10 a 64 reduce algo la diferencia cuando se trabaja con 16 millones de archivos pequeños, pero aun así AWS CLI sigue siendo 7,6x más lento que s5cmd.

Descarga de S3 a EC2

A continuación se muestran los tiempos de ejecución de s5cmd cp vs. aws s3 cp al descargar archivos desde un bucket de S3 a una instancia EC2 de alto rendimiento en la misma región:

Al igual que en la carga de EC2 a S3, las descargas de S3 a EC2 son significativamente más eficientes con s5cmd que con AWS CLI, aunque hay algunas diferencias interesantes.

En particular, s5cmd no rinde tanto al descargar como al subir, salvo cuando los archivos son pequeños.

s5cmd es entre 15x y 17x más rápido descargando que AWS CLI cuando este último se deja con su configuración por defecto. Es una mejora menor que la de 19x a 26x observada al subir a S3. Sin embargo, al descargar archivos pequeños, s5cmd mejora aún más, llegando a ser 30,5x más rápido.

Esta brecha de rendimiento entre archivos pequeños y no pequeños no se da al subir a S3, pero el tamaño pequeño es claramente un factor relevante al descargar desde S3.

Ajustar la configuración de AWS CLI mejora los tiempos de descarga de forma notable —incluso más que en las cargas equivalentes—, reduciendo la ventaja de s5cmd a un rango de entre 6,4x y 8,7x. La excepción son los archivos muy grandes, donde la mejora en el tiempo de descarga es mínima.

Copia entre buckets de S3 en la misma región

A continuación se muestran los tiempos de ejecución de s5cmd cp vs. aws s3 cp al copiar archivos entre dos buckets de S3 en la misma región:

Los beneficios de usar un SDK basado en un lenguaje compilado, así como el ajuste de la configuración del CLI, se notan realmente al observar las copias entre buckets.

s5cmd copia entre buckets de la misma región entre 27,6x y 80,2x más rápido que AWS CLI cuando este último se deja con su configuración por defecto.

Sin embargo, con solo subir el valor de max_concurrent_requests de 10 a 64 se obtienen enormes mejoras para aws s3 cp, reduciendo el rango de ventaja de s5cmd a entre 3,6x y 5,0x.

Copia entre buckets de S3 en regiones distintas

A continuación se muestran los tiempos de ejecución de s5cmd cp vs. aws s3 cp al copiar archivos entre dos buckets de S3 en regiones distintas (us-east-1 a us-west-2):

Si bien los tiempos de copia entre regiones son muchísimo más largos en todos los escenarios de tamaño de archivo —tanto para s5cmd como para aws s3 cp— en comparación con las copias dentro de la misma región, resulta interesante que la ventaja de s5cmd sobre aws s3 cp sea bastante similar a la observada en copias dentro de la misma región.

s5cmd copia archivos entre buckets de regiones distintas entre 27,6x y 40x más rápido que AWS CLI cuando este último se deja con su configuración por defecto. Subir el valor de max_concurrent_requests de 10 a 64 produce las mismas grandes mejoras en los tiempos de los comandos de AWS CLI, reduciendo el rango de ventaja de s5cmd a entre 3,5x y 4,8x.

Resultados finales

El gráfico de líneas a continuación resume la mejora de s5cmd sobre los tiempos de ejecución de aws s3 cp:

Conclusión: usa siempre s5cmd

Independientemente del tamaño de los archivos, de la cantidad de archivos que vayas a transferir y del tipo de operaciones de S3 que utilices, s5cmd ofrece un rendimiento superior en todos los escenarios.

Los beneficios de rendimiento de s5cmd vienen en gran medida de estar escrito en un lenguaje compilado; sin embargo, la falta de valores por defecto inteligentes o determinados dinámicamente en aws s3 cp también juega un papel importante. Ajustar la configuración de AWS CLI para mejorar la paralelización y el throughput de carga, en general, solo tiene un impacto marginal, salvo cuando trabajas con archivos muy pequeños o copias entre dos buckets, y aun así sigue existiendo una gran brecha de rendimiento con s5cmd. Personalmente recomendaría usar únicamente s5cmd al hacer transferencias de datos, a menos que tengas razones muy específicas que te lo impidan. Por ejemplo, las normas de seguridad de tu organización pueden permitir solo la instalación de herramientas "oficiales" provistas por AWS.

Si logras reducir en uno o dos órdenes de magnitud el tiempo necesario para transferir datos hacia y desde buckets de S3, eso se traducirá en ahorros sustanciales en tu factura de la nube a medida que el uso de datos de tu organización escale. Con esto en mente, hasta donde puedo ver, no hay ningún beneficio en preferir AWS CLI para transferencias de datos, salvo el deseo de mantenerse exclusivamente dentro del ecosistema de herramientas oficiales de AWS.

¿Aún tienes preguntas sobre cómo aplicar estas recomendaciones para tener éxito con el data warehousing en GCP o AWS dentro de tu organización?

Contáctanos en DoiT International. Contamos exclusivamente con talento senior de Engineering y nos especializamos en consultoría avanzada en la nube, con asesoría en diseño arquitectónico y debugging.