Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Trasferimenti dati S3 più rapidi ed economici: fino a 80 volte più veloci della AWS CLI

By Matthew PorterJun 6, 20247 min read

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

Chi si è trovato a dover trasferire milioni di file o diversi TB di dati da e verso bucket S3 sa quanto possano essere lente queste operazioni su AWS. E se le dicessimo che esiste un modo per accelerare upload, download e copie di 1 o 2 ordini di grandezza, e che farlo è semplice quanto usare la AWS CLI?

Ecco a voi: s5cmd

Una rappresentazione fedele delle chiamate API s3 della AWS CLI a confronto con s5cmd

s5cmd è uno strumento CLI open source pensato per replicare le funzionalità della AWS CLI su S3, ma con prestazioni nettamente superiori, perché scritto in Go — un linguaggio compilato — anziché in Python, il linguaggio interpretato alla base della AWS CLI. Un SDK in Go garantisce un throughput elevato non solo sui singoli file, ma anche su grandi volumi di file, grazie alle funzionalità native di parallelismo di Go, che permettono di gestire numerosi trasferimenti ad alte prestazioni in modo concorrente. Tutto il contrario di Python, dove il Global Interpreter Lock impedisce di sfruttare in modo efficiente i core multipli.

Il README dello strumento su GitHub dichiara che, rispetto alla AWS CLI, è fino a 12 volte più veloce nei download. Tuttavia, come dimostrano i risultati dei benchmark riportati di seguito, nelle giuste condizioni il trasferimento dati risulta sensibilmente più rapido.

Questi vantaggi in termini di tempo di trasferimento si traducono direttamente in tempo di calcolo EC2 risparmiato, e quindi in denaro. Come vedrà tra poco, rinunciare a s5cmd significa lasciare parecchi soldi sul tavolo.

Per confrontare le prestazioni di s5cmd e aws s3 cp in scenari diversi, misurerò i tempi di esecuzione delle seguenti operazioni su 4 TB di dati:

  • Upload da EC2 a S3
  • Download da S3 a EC2
  • Copia tra bucket nella stessa regione
  • Copia tra bucket in regioni diverse

I tempi di esecuzione delle quattro operazioni elencate verranno rilevati per entrambi gli strumenti su quattro tipologie di dataset da 4 TB:

  • File molto grandi (5 GB ciascuno, per un totale di 819 file)
  • File grandi (1 GB ciascuno, per un totale di 4.096 file)
  • File medi (32 MB ciascuno, per un totale di 131.072 file)
  • File piccoli (256 KB ciascuno, per un totale di 16.777.216 file)

La AWS CLI verrà inoltre sempre eseguita due volte:

  • La prima con i valori di configurazione predefiniti
  • La seconda con i seguenti parametri modificati per migliorare il throughput su un'istanza EC2 ad alte prestazioni:

max_concurrent_requests=64 (per allinearsi alla VM con 64 core) anziché 10

multipart_threshold=1GB anziché 8MB

multipart_chunksize=256MB anziché 8MB

Le prestazioni di upload, download e copia dipendono fortemente da variabili come la dimensione e la quantità degli oggetti, l'attivazione della concorrenza e il contenimento di una concorrenza eccessiva tramite soglie elevate per l'upload multipart. I benchmark che seguono tengono conto di questi fattori per illustrare le prestazioni di trasferimento dati in vari scenari d'uso reali.

Per chi volesse riprodurre i benchmark di questo articolo, il repository Git abbinato al post rende l'esecuzione automatica dei test il più semplice possibile.

Una breve premessa prima di entrare nel vivo del confronto sui tempi di esecuzione:

Per tutti i test è stata utilizzata una macchina c7gn.16xlarge di ultima generazione, con throughput di rete da 200 Gbps e 64 core Graviton ad alte prestazioni. Sono stati collegati 12 volumi EBS gp3 da 1,1 GB in configurazione RAID0, ciascuno con 16.000 IOPS e throughput di 1000 Mbps. Una configurazione che riduce al minimo i colli di bottiglia su risorse come throughput di rete, throughput I/O e potenza di calcolo, lasciando emergere appieno le capacità degli strumenti.

Upload da EC2 a S3

Di seguito i tempi di esecuzione di s5cmd cp a confronto con aws s3 cp nell'upload di file da un'istanza EC2 ad alte prestazioni a un bucket S3 nella stessa regione.

Si noti che l'asse y è in scala logaritmica in tutti i grafici che seguono:

Il grafico evidenzia chiaramente che s5cmd è nettamente più rapido della AWS CLI nell'upload dei file, a prescindere dalle loro dimensioni.

s5cmd è da 19 a 26 volte più veloce nell'upload su S3 rispetto alla AWS CLI con configurazione predefinita.

Modificare i parametri di configurazione della AWS CLI per favorire la parallelizzazione produce miglioramenti solo marginali, finché non si lavora con file di dimensioni medio-piccole. Aumentare il numero di upload simultanei da 10 a 64 riduce il divario nei tempi di esecuzione con 16 milioni di file di piccole dimensioni, ma anche in questo caso la AWS CLI rimane 7,6 volte più lenta di s5cmd.

Download da S3 a EC2

Di seguito i tempi di esecuzione di s5cmd cp a confronto con aws s3 cp nel download di file da un bucket S3 a un'istanza EC2 ad alte prestazioni nella stessa regione:

Come per l'upload da EC2 a S3, anche i download da S3 a EC2 sono decisamente più rapidi con s5cmd rispetto alla AWS CLI, sebbene emergano alcune differenze interessanti.

In particolare, s5cmd non è altrettanto performante in download quanto in upload — tranne con file di piccole dimensioni.

s5cmd è da 15 a 17 volte più veloce in download rispetto alla AWS CLI con configurazione predefinita: un margine inferiore al 19-26x osservato in upload su S3. Tuttavia, nel download di file di piccole dimensioni le prestazioni di s5cmd migliorano ulteriormente, raggiungendo una velocità 30,5 volte superiore.

Questo divario di prestazioni in download tra file piccoli e non piccoli non si manifesta in upload su S3, ma è evidente che le dimensioni ridotte dei file giocano un ruolo significativo durante il download da S3.

La modifica dei parametri di configurazione della AWS CLI produce in download miglioramenti dei tempi notevolmente superiori rispetto agli equivalenti in upload, riducendo il vantaggio di s5cmd a un fattore compreso tra 6,4x e 8,7x. Fanno eccezione i file molto grandi, per i quali si registra solo un miglioramento minimo dei tempi di download.

Copia tra bucket S3 nella stessa regione

Di seguito i tempi di esecuzione di s5cmd cp a confronto con aws s3 cp nella copia di file tra due bucket S3 nella stessa regione:

I vantaggi di un SDK basato su un linguaggio compilato, e del tuning dei parametri della CLI, emergono in tutta la loro evidenza quando si analizzano le copie da bucket a bucket.

s5cmd copia tra bucket della stessa regione da 27,6 a 80,2 volte più velocemente rispetto alla AWS CLI con configurazione predefinita.

Tuttavia, già il semplice aumento del valore di max_concurrent_requests da 10 a 64 produce miglioramenti enormi per aws s3 cp, riducendo il vantaggio di s5cmd a un fattore compreso tra 3,6x e 5,0x.

Copia tra bucket S3 in regioni diverse

Di seguito i tempi di esecuzione di s5cmd cp a confronto con aws s3 cp nella copia di file tra due bucket S3 in regioni diverse (da us-east-1 a us-west-2):

Sebbene i tempi di copia cross-region siano molto, molto più lunghi in tutti gli scenari di dimensione dei file, sia per s5cmd sia per aws s3 cp, rispetto alle copie nella stessa regione, trovo interessante notare come il margine di vantaggio di s5cmd su aws s3 cp sia molto simile a quello osservato per le copie nella stessa regione.

s5cmd copia file tra bucket in regioni diverse da 27,6 a 40 volte più velocemente rispetto alla AWS CLI con configurazione predefinita. Aumentando il valore di max_concurrent_requests da 10 a 64 si ottengono gli stessi importanti miglioramenti nei tempi di esecuzione dei comandi AWS CLI, riducendo il vantaggio di s5cmd a un fattore compreso tra 3,5x e 4,8x.

Risultati finali

Il grafico a linee qui sotto riepiloga i fattori di miglioramento di s5cmd rispetto ai tempi di esecuzione di aws s3 cp:

In sintesi: usare sempre s5cmd

A prescindere dalle dimensioni e dal numero di file da trasferire e dal tipo di operazioni S3 da eseguire, s5cmd offre prestazioni superiori in qualsiasi scenario.

I vantaggi prestazionali di s5cmd derivano in larga parte dal fatto di essere scritto in un linguaggio compilato; tuttavia, anche l'assenza di default intelligenti o determinati dinamicamente in aws s3 cp ha un peso rilevante. Intervenire sui parametri di configurazione della AWS CLI per migliorare parallelizzazione e throughput in upload avrà in genere un impatto solo marginale, salvo che si lavori con file molto piccoli o si copino file tra due bucket; e anche in questi casi il divario prestazionale rispetto a s5cmd resta comunque ampio. Personalmente consiglio di usare esclusivamente s5cmd per i trasferimenti dati, salvo motivi molto specifici che lo impediscano: ad esempio, le policy di sicurezza della sua organizzazione potrebbero consentire l'installazione dei soli strumenti "ufficiali" forniti da AWS.

Riducendo di 1 o 2 ordini di grandezza i tempi di trasferimento dati da e verso i bucket S3, si ottengono risparmi sostanziali sulla bolletta cloud man mano che cresce l'utilizzo dei dati nella sua organizzazione. Detto questo, per quanto mi risulta, non c'è alcun vantaggio nel preferire la AWS CLI per i trasferimenti dati, se non il desiderio di restare esclusivamente nell'ambito degli strumenti gestiti da AWS.

Ha ancora dubbi su come applicare queste raccomandazioni per garantire il successo del data warehousing su GCP o AWS nella sua organizzazione?

Ci contatti su DoiT International. Composto esclusivamente da senior engineer, il nostro team è specializzato nella consulenza cloud avanzata, nella progettazione architetturale e nel supporto al debugging.