Si vous avez déjà eu à transférer des millions de fichiers ou plusieurs To de données depuis ou vers des buckets S3, vous savez à quel point ces opérations de transfert AWS peuvent être longues. Et si je vous disais qu'il existe un moyen d'accélérer les opérations d'upload, de download et de copie de 1 à 2 ordres de grandeur, le tout aussi simplement qu'avec l'AWS CLI ?
Découvrez : s5cmd

Une représentation fidèle des appels API s3 de l'AWS CLI face à s5cmd
s5cmd est un outil CLI open-source conçu pour reproduire les fonctionnalités de l'AWS CLI sur S3, mais avec des performances nettement supérieures, car il est écrit en Go, un langage compilé, plutôt qu'en Python, langage interprété sur lequel repose l'AWS CLI. Un SDK basé sur Go permet d'atteindre un débit élevé non seulement pour les fichiers individuels, mais aussi pour de grandes quantités de fichiers, grâce aux capacités natives de traitement parallèle de Go qui lui permettent d'exécuter simultanément de nombreux transferts à haute performance — à l'inverse de Python, dont le Global Interpreter Lock l'empêche d'exploiter efficacement plusieurs cœurs.
Le README sur GitHub de l'outil indique qu'il est jusqu'à 12x plus rapide que l'AWS CLI sur les téléchargements ; mais comme vous le verrez dans les résultats de benchmark ci-dessous, dans les bonnes conditions, il transfère les données nettement plus vite encore.
Ces gains de temps de transfert se traduisent directement par du temps de calcul EC2 économisé (et donc de l'argent). Comme vous allez le voir, ne pas utiliser s5cmd revient à laisser beaucoup d'argent sur la table.
Pour comparer les performances de s5cmd et de aws s3 cp dans différents scénarios, je vais mesurer le temps d'exécution des tâches suivantes sur 4 To de données :
- Upload depuis EC2 vers S3
- Download depuis S3 vers EC2
- Copie entre buckets dans la même région
- Copie entre buckets dans des régions différentes
Les temps d'exécution de ces quatre tâches seront mesurés pour les deux outils sur quatre types de jeux de données de 4 To :
- Très gros fichiers (5 Go, soit 819 fichiers)
- Gros fichiers (1 Go, soit 4 096 fichiers)
- Fichiers moyens (32 Mo, soit 131 072 fichiers)
- Petits fichiers (256 Ko, soit 16 777 216 fichiers)
Par ailleurs, l'AWS CLI sera systématiquement exécutée deux fois :
- Une première fois avec sa configuration par défaut
- Une seconde fois avec les valeurs de configuration suivantes ajustées pour améliorer le débit sur une instance EC2 haute performance :
max_concurrent_requests=64 (pour correspondre à la VM 64 cœurs) au lieu de 10
multipart_threshold=1GB au lieu de 8MB
multipart_chunksize=256MB au lieu de 8MB
Les performances d'upload, de download et de copie sont étroitement liées à des variables comme la taille des objets, leur quantité, l'activation de la concurrence et la prévention d'une concurrence excessive grâce à des seuils élevés de taille de fichier pour les uploads multipart. Les benchmarks suivants prennent donc en compte ces variables afin d'illustrer les performances de transfert dans plusieurs scénarios d'utilisation réels.
Si vous souhaitez reproduire les benchmarks de cet article, consultez le repo Git qui accompagne ce billet. Il rend la reproduction automatisée des benchmarks aussi simple que possible.
Une remarque rapide avant d'entrer dans les comparaisons de temps d'exécution :
Pour tous les tests de benchmark, j'ai utilisé une machine c7gn.16xlarge de dernière génération, dotée d'un débit réseau de 200 Gbps et de 64 cœurs Graviton haute performance. Y étaient attachés 12 volumes EBS gp3 de 1,1 Go en configuration RAID0, offrant chacun 16 000 IOPS et 1000 Mbps de débit. Cette configuration garantit que des ressources comme le débit réseau, le débit I/O et la puissance de traitement constituent des goulots d'étranglement minimes, laissant ainsi les capacités des outils s'exprimer pleinement.
Upload depuis EC2 vers S3
Voici ci-dessous les temps d'exécution de s5cmd cp face à aws s3 cp lors de l'upload de fichiers depuis une instance EC2 haute performance vers un bucket S3 dans la même région.
Notez que l'axe des ordonnées est en échelle logarithmique sur tous les graphiques suivants :

Le graphique montre clairement que s5cmd est nettement plus rapide que l'outillage AWS CLI pour l'upload de fichiers, quelles que soient les tailles concernées.
s5cmd est entre 19x et 26x plus rapide pour l'upload vers S3 que l'AWS CLI laissée à ses paramètres par défaut.
Modifier les valeurs de configuration de l'AWS CLI pour mieux exploiter la parallélisation n'apporte que des gains marginaux, jusqu'à ce que vous travailliez avec des fichiers de taille moyenne à petite. Augmenter le nombre d'uploads simultanés de 10 à 64 réduit l'écart de temps d'exécution sur les 16 millions de petits fichiers, mais même dans ce cas, l'AWS CLI reste 7,6x plus lente que s5cmd.
Download depuis S3 vers EC2
Voici ci-dessous les temps d'exécution de s5cmd cp face à aws s3 cp lors du téléchargement de fichiers depuis un bucket S3 vers une instance EC2 haute performance dans la même région :

Comme pour l'upload depuis EC2 vers S3, les téléchargements depuis S3 vers EC2 sont nettement plus performants avec s5cmd qu'avec l'AWS CLI, même si quelques différences intéressantes apparaissent.
À noter, s5cmd n'est pas aussi performant en download qu'en upload — sauf lorsque les fichiers sont de petite taille.
s5cmd est entre 15x et 17x plus rapide en téléchargement que l'AWS CLI laissée à ses paramètres par défaut. C'est moins que l'accélération de 19x à 26x observée à l'upload vers S3. En revanche, lors du téléchargement de petits fichiers, s5cmd améliore encore ses performances et devient 30,5x plus rapide.
Cet écart de performance entre petits et autres fichiers n'existe pas lors de l'upload vers S3 ; pourtant, la petite taille des fichiers est manifestement un facteur déterminant lors du téléchargement depuis S3.
L'ajustement des valeurs de configuration de l'AWS CLI apporte des améliorations notables sur les temps de téléchargement — plus marquées que sur les uploads équivalents — réduisant l'avantage de s5cmd à un facteur compris entre 6,4x et 8,7x. L'exception concerne les très gros fichiers, dont le temps de téléchargement ne s'améliore que de manière minime.
Copie de bucket S3 dans la même région
Voici ci-dessous les temps d'exécution de s5cmd cp face à aws s3 cp lors de la copie de fichiers entre deux buckets S3 dans la même région :

Les bénéfices d'un SDK en langage compilé, ainsi que ceux de l'ajustement des valeurs de configuration de la CLI, deviennent vraiment frappants lorsqu'on examine les copies de bucket à bucket.
s5cmd copie entre buckets de la même région entre 27,6x et 80,2x plus vite que l'AWS CLI laissée à ses paramètres par défaut.
Cependant, le simple fait de faire passer la valeur de max_concurrent_requests de 10 à 64 entraîne d'énormes gains pour aws s3 cp, ramenant l'avantage de s5cmd dans une plage de 3,6x à 5,0x.
Copie de bucket S3 entre régions différentes
Voici ci-dessous les temps d'exécution de s5cmd cp face à aws s3 cp lors de la copie de fichiers entre deux buckets S3 situés dans des régions différentes (us-east-1 vers us-west-2) :

Si les temps de copie inter-régions sont bien plus longs dans tous les scénarios de taille de fichiers — pour s5cmd comme pour aws s3 cp — par rapport aux copies intra-région, il est intéressant de constater que les facteurs d'amélioration de s5cmd par rapport à aws s3 cp sont assez proches de ceux observés pour les copies intra-région.
s5cmd copie les fichiers entre buckets de régions différentes entre 27,6x et 40x plus vite que l'AWS CLI laissée à ses paramètres par défaut. Faire passer la valeur de max_concurrent_requests de 10 à 64 produit les mêmes gains importants sur les temps d'exécution des commandes AWS CLI, ramenant l'avantage de s5cmd dans une plage de 3,5x à 4,8x.
Résultats finaux
Le graphique linéaire ci-dessous résume les facteurs d'amélioration de s5cmd par rapport aux temps d'exécution de aws s3 cp :

À retenir : utilisez toujours s5cmd
Quelles que soient les tailles de fichiers, le nombre de fichiers à transférer ou les types d'opérations S3 utilisées, s5cmd offre des performances supérieures dans tous les scénarios.
Les gains de performance de s5cmd proviennent en grande partie du fait qu'il est écrit dans un langage compilé ; cela dit, l'absence de valeurs par défaut intelligentes ou déterminées dynamiquement pour aws s3 cp joue également un rôle important. Ajuster les valeurs de configuration de l'AWS CLI pour améliorer la parallélisation et le débit d'upload n'aura généralement qu'un impact marginal, sauf si vous travaillez avec de très petits fichiers ou si vous copiez des fichiers entre deux buckets — et même dans ce cas, un écart de performance important persiste avec s5cmd. Personnellement, je recommande d'utiliser exclusivement s5cmd pour les transferts de données, à moins que vous n'ayez des raisons très spécifiques de ne pas pouvoir le faire. Par exemple, les règles de sécurité de votre organisation peuvent n'autoriser que l'installation d'outils officiels fournis par AWS.
Si vous parvenez à réduire de 1 à 2 ordres de grandeur le temps de transfert des données depuis et vers les buckets S3, cela se traduira par des économies substantielles sur votre facture cloud à mesure que l'utilisation des données de votre organisation augmente. Cela dit, à mon sens, il n'y a aucun avantage à privilégier l'AWS CLI pour les transferts de données, hormis le souhait de rester strictement dans l'écosystème des outils maintenus par AWS.
Vous avez encore des questions sur la mise en œuvre de ces recommandations pour réussir vos projets de data warehousing GCP ou AWS au sein de votre organisation ?
Contactez-nous chez DoiT International. Composée exclusivement de talents senior en ingénierie, notre équipe est spécialisée dans le conseil cloud avancé, la conception architecturale et le débogage.