Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Transferências S3 muito mais rápidas: supere o AWS CLI em até 80x

By Matthew PorterJun 6, 20247 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

Se você já precisou transferir milhões de arquivos ou TBs de dados para dentro e para fora de buckets S3, sabe quanto tempo essas operações na AWS podem levar. E se eu te dissesse que dá para acelerar uploads, downloads e cópias em 1 ou 2 ordens de grandeza — e que usar essa solução é tão simples quanto rodar o AWS CLI?

Conheça o s5cmd

Uma representação fiel das chamadas à API s3 do AWS CLI vs. s5cmd

O s5cmd é uma ferramenta CLI open source feita para replicar a funcionalidade do AWS CLI no S3, mas com desempenho bem superior por ser escrita em Go — uma linguagem compilada — em vez da linguagem interpretada baseada em Python que sustenta o AWS CLI. Um SDK em Go viabiliza alta vazão não só para arquivos individuais, mas também para grandes volumes de arquivos, graças aos recursos nativos de processamento paralelo da linguagem, que permitem realizar diversas transferências de alto desempenho ao mesmo tempo — algo que o Global Interpreter Lock do Python impede ao não permitir o uso eficiente de múltiplos núcleos.

O README no GitHub da ferramenta afirma que, em comparação ao AWS CLI, ela é até 12x mais rápida em downloads. Mas, como você verá nos resultados de benchmark a seguir, nas condições certas a transferência de dados é substancialmente mais rápida.

Esses ganhos de tempo se traduzem diretamente em tempo de computação EC2 (e, portanto, em dinheiro) economizado. Como você verá em breve, deixar de usar o s5cmd significa perder uma boa grana.

Para comparar o desempenho do s5cmd e do aws s3 cp em diferentes cenários, vou medir o tempo de execução das seguintes tarefas em 4 TB de dados:

  • Upload do EC2 para o S3
  • Download do S3 para o EC2
  • Cópia entre buckets na mesma região
  • Cópia entre buckets em regiões diferentes

Os tempos das quatro tarefas acima serão medidos para as duas ferramentas em quatro tipos diferentes de conjuntos de 4 TB:

  • Arquivos muito grandes (5 GB cada, 819 arquivos)
  • Arquivos grandes (1 GB cada, 4.096 arquivos)
  • Arquivos médios (32 MB cada, 131.072 arquivos)
  • Arquivos pequenos (256 KB cada, 16.777.216 arquivos)

Além disso, o AWS CLI será sempre executado duas vezes:

  • Uma com os valores de configuração padrão do AWS CLI
  • Outra com os seguintes valores ajustados para melhorar o throughput em uma instância EC2 de alto desempenho:

max_concurrent_requests=64 (para acompanhar a VM de 64 núcleos), em vez de 10

multipart_threshold=1GB, em vez de 8MB

multipart_chunksize=256MB, em vez de 8MB

O desempenho de upload, download e cópia depende muito de variáveis como tamanho do objeto, quantidade de objetos, uso de concorrência e o controle do excesso de concorrência por meio de limites altos para o tamanho de arquivo em uploads multipart. Por isso, os benchmarks a seguir levam essas variáveis em conta para mostrar o desempenho de transferência em diversos cenários reais.

Se quiser reproduzir os benchmarks deste artigo, consulte o repositório no Git que acompanha este post. Ele torna a reprodução automatizada dos testes a mais simples possível.

Uma observação rápida antes de partirmos para as comparações de tempo:

Em todos os testes foi usada uma máquina c7gn.16xlarge de última geração, com 200 Gbps de throughput de rede e 64 núcleos Graviton de alto desempenho. A ela foram acoplados 12 volumes EBS gp3 de 1,1 GB em configuração RAID0, cada um com 16.000 IOPS e 1000 Mbps de throughput. Esse setup ajuda a garantir que recursos como throughput de rede, throughput de I/O e poder de processamento representem gargalos mínimos, deixando as ferramentas mostrarem todo o seu potencial.

Upload do EC2 para o S3

Abaixo estão os tempos de execução de s5cmd cp vs. aws s3 cp ao enviar arquivos de uma instância EC2 de alto desempenho para um bucket S3 na mesma região.

Observe que o eixo y está em escala logarítmica em todos os gráficos a seguir:

O gráfico deixa claro que o s5cmd é substancialmente mais rápido para subir arquivos do que o AWS CLI, independentemente do tamanho dos arquivos.

O s5cmd é impressionantes 19x a 26x mais rápido para enviar dados ao S3 do que o AWS CLI quando este último fica com as configurações padrão.

Mexer nos valores de configuração do AWS CLI para favorecer a paralelização traz apenas melhorias marginais até você começar a trabalhar com arquivos de tamanho médio a pequeno. Aumentar o número de uploads simultâneos de 10 para 64 reduz a diferença de tempo ao lidar com 16 milhões de arquivos pequenos, mas, mesmo assim, o AWS CLI continua 7,6x mais lento que o s5cmd.

Download do S3 para o EC2

Abaixo estão os tempos de execução de s5cmd cp vs. aws s3 cp ao baixar arquivos de um bucket S3 para uma instância EC2 de alto desempenho na mesma região:

Assim como nos uploads do EC2 para o S3, os downloads do S3 para o EC2 são bem mais rápidos com o s5cmd do que com o AWS CLI, mas há algumas diferenças interessantes.

Vale notar que o s5cmd não é tão rápido nos downloads quanto nos uploads — exceto quando os arquivos são pequenos.

O s5cmd é 15x a 17x mais rápido para baixar do que o AWS CLI quando este fica com as configurações padrão. É um ganho menor que os 19x a 26x observados nos uploads para o S3. Por outro lado, ao baixar arquivos pequenos, o desempenho do s5cmd melhora ainda mais, ficando 30,5x mais rápido.

Essa disparidade de desempenho entre arquivos pequenos e não pequenos não aparece nos uploads para o S3, mas o tamanho pequeno é claramente um fator importante ao baixar do S3.

Ajustar os valores de configuração do AWS CLI gera melhorias nos tempos de download bem maiores do que as observadas nos uploads, reduzindo a vantagem do s5cmd para algo entre 6,4x e 8,7x mais rápido. A exceção fica para arquivos muito grandes, que apresentam apenas melhoria mínima no tempo de download.

Cópia entre buckets S3 na mesma região

Abaixo estão os tempos de execução de s5cmd cp vs. aws s3 cp ao copiar arquivos entre dois buckets S3 na mesma região:

Os benefícios de usar um SDK em linguagem compilada e de ajustar os valores de configuração do CLI começam a se destacar de verdade quando olhamos para cópias entre buckets.

O s5cmd copia entre buckets da mesma região 27,6x a 80,2x mais rápido do que o AWS CLI quando este fica com os padrões.

No entanto, basta aumentar o valor de max_concurrent_requests de 10 para 64 para que o aws s3 cp apresente melhorias enormes, reduzindo a vantagem do s5cmd para uma faixa de 3,6x a 5,0x.

Cópia entre buckets S3 em regiões diferentes

Abaixo estão os tempos de execução de s5cmd cp vs. aws s3 cp ao copiar arquivos entre dois buckets S3 em regiões diferentes (us-east-1 para us-west-2):

Embora os tempos de cópia entre regiões sejam muito, muito maiores em todos os cenários de tamanho de arquivo, tanto para o s5cmd quanto para o aws s3 cp, na comparação com cópias dentro da mesma região, achei interessante que os ganhos do s5cmd sobre o aws s3 cp sejam bem parecidos com os observados nas cópias intrarregião.

O s5cmd copia arquivos entre buckets de regiões diferentes 27,6x a 40x mais rápido do que o AWS CLI quando este fica com os padrões. Aumentar o valor de max_concurrent_requests de 10 para 64 traz as mesmas grandes melhorias nos tempos do AWS CLI, reduzindo a vantagem do s5cmd para uma faixa de 3,5x a 4,8x.

Resultados finais

O gráfico de linhas abaixo resume os ganhos do s5cmd sobre os tempos de execução do aws s3 cp:

Conclusão: use sempre o s5cmd

Independentemente do tamanho dos arquivos, da quantidade de arquivos a transferir e do tipo de operação no S3, o s5cmd oferece desempenho superior em todos os cenários.

As vantagens de desempenho do s5cmd vêm em grande parte do fato de ele ser escrito em uma linguagem compilada; mas a ausência de padrões inteligentes ou determinados dinamicamente no aws s3 cp também pesa bastante. Ajustar os valores de configuração do AWS CLI para melhorar a paralelização e o throughput de upload, em geral, tem impacto apenas marginal — a não ser que você esteja lidando com arquivos minúsculos ou copiando arquivos entre dois buckets, e, mesmo nesses casos, ainda há uma grande lacuna de desempenho em relação ao s5cmd. Pessoalmente, eu recomendaria usar apenas o s5cmd em transferências de dados, a menos que você tenha motivos muito específicos para não fazer isso. Por exemplo, as regras de segurança da sua organização podem permitir apenas a instalação de ferramentas "oficiais" fornecidas pela AWS.

Se você consegue reduzir o tempo de transferência de dados de e para buckets S3 em 1 ou 2 ordens de grandeza, isso vai gerar uma economia substancial na sua conta de cloud à medida que o uso de dados da sua organização cresce. Diante disso, até onde consigo ver, não há vantagem em preferir o AWS CLI para transferências de dados, a não ser que você queira ficar estritamente dentro do universo de ferramentas mantidas pela AWS.

Ainda tem dúvidas sobre como aplicar essas recomendações para alcançar sucesso em data warehousing no GCP ou AWS na sua organização?

Fale com a gente na DoiT International. Com um time formado exclusivamente por engenheiros sêniores, somos especialistas em consultoria avançada em cloud, design arquitetural e suporte em debugging.