Existem vários fatores principais que determinam a taxa de transferência de EC2 para S3:
- Tamanho do arquivo - arquivos menores exigem um número maior de solicitações e mais sobrecarga e transferência mais lenta. O ganho com o tamanho do arquivo (quando originário do EC2) é insignificante para arquivos maiores que 256kB. (Considerando que a transferência de um local remoto, com maior latência, tende a continuar mostrando melhorias consideráveis até 1MiB e 2MiB).
- Número de encadeamentos paralelos - um único encadeamento de upload geralmente tem uma quantidade bastante baixa - geralmente abaixo de 5MiB / s. A taxa de transferência aumenta com o número de threads simultâneos e tende a atingir um pico entre 64 e 128 threads. Deve-se observar que instâncias maiores podem lidar com um número maior de threads simultâneos.
- Tamanho da instância - de acordo com as especificações da instância , instâncias maiores têm mais recursos dedicados, incluindo uma alocação maior (e menos variável) de largura de banda da rede (e E / S em geral - incluindo leitura de discos efêmeros / EBS - que estão conectados à rede. Os valores numéricos para cada categoria são:
- Muito alto: Teórico: 10Gbps = 1250MB / s; Realista: 8.8Gbps = 1100MB / s
- Alto: Teórico: 1 Gbps = 125 MB / s; Realista: 750Mbps = 95MB / s
- Moderado: Teórico: 250Mbps; Realista: 80 Mbps = 10 MB / s
- Baixo: Teórico: 100Mbps; Realista: 10-15Mbps = 1-2MB / s
Nos casos de transferência de grandes quantidades de dados, pode ser economicamente prático usar uma instância de computação de cluster, pois o ganho efetivo na taxa de transferência (> 10x) é mais do que a diferença no custo (2-3x).
Embora as idéias acima sejam bastante lógicas (embora o limite por segmento possa não ser), é bastante fácil encontrar referências que as apoiem. Um particularmente detalhado pode ser encontrado aqui .
Usar entre 64 e 128 uploads paralelos (simultâneos) de objetos de 1 MB deve saturar o uplink de 1 Gbps que um m1.xlarge possui e deve saturar o uplink de 10 Gbps de uma instância de computação em cluster (cc1.4xlarge).
Embora seja bastante fácil alterar o tamanho da instância, os outros dois fatores podem ser mais difíceis de gerenciar.
- O tamanho do arquivo geralmente é fixo - não podemos unir arquivos no EC2 e dividi-los no S3 (portanto, não há muito o que fazer sobre arquivos pequenos). Arquivos grandes, no entanto, podemos nos separar no lado do EC2 e remontar no lado do S3 (usando o upload em várias partes do S3). Normalmente, isso é vantajoso para arquivos maiores que 100 MB.
- Threads paralelos é um pouco mais difícil de atender. A abordagem mais simples se resume a escrever um wrapper para algum script de upload existente que executará várias cópias dele de uma só vez. Melhores abordagens usam a API diretamente para realizar algo semelhante. Tendo em mente que a chave é solicitações paralelas, não é difícil localizar vários scripts em potencial, por exemplo:
- s3cmd-modification - uma bifurcação de uma versão anterior do s3cmd que adicionou essa funcionalidade, mas não foi atualizada há vários anos.
- s3-parallel-put - script python razoavelmente recente que funciona bem