vmsplice est trop rapide
- Certains programmes utilisent l’appel système
vmsplice pour déplacer les données plus rapidement à travers des pipes
- Il a été constaté que les pipes Linux sont plus lents que prévu lorsqu’on n’utilise pas
vmsplice
- Un programme est en cours de développement pour encoder/décoder rapidement du code Morse, et il utilise des pipes pour cela
Écrire des données dans des conditions idéales
- Le programme ci-dessous copie les données sans appel système
- Il s’exécute à une vitesse de 167 Go/s avec AVX-512
- En désactivant AVX-512 et en testant avec AVX2 et SSE2, on obtient la même vitesse (167 Go/s)
- Tant que la vectorisation est utilisée, il est possible d’atteindre 167 Go/s
Écrire réellement des données dans un pipe
- Après avoir écrit un programme qui envoie des données dans un pipe et l’avoir mesuré, une vitesse de 17 Go/s a été observée
- C’est 10 fois plus lent que l’écriture dans un buffer
- Le profilage montre que la majeure partie du temps est consommée par les appels
write
- La fonction
pipe_write passe beaucoup de temps à allouer des pages mémoire
- La copie des données elle-même ne représente que 20 % du temps CPU, mais reste malgré tout deux fois plus lente que
__memset_avx512_unaligned_erms
L’aide de vmsplice
vmsplice déplace les buffers de l’espace utilisateur vers le kernel sans les copier
- Avec
vmsplice, il est possible d’atteindre 210 Go/s
vmsplice contourne la partie coûteuse de l’appel système write
Conclusion
- Écrire dans un pipe est 10 fois plus lent qu’écrire dans la mémoire brute
- Cela est dû au coût du verrouillage des buffers et à celui de la sauvegarde et de la restauration du contexte SIMD
splice et vmsplice évitent ces coûts et déplacent les données efficacement
Résumé GN⁺
- Cet article explique comment maximiser les performances des pipes Linux avec
vmsplice
vmsplice améliore fortement les performances en déplaçant directement les données sans les copier dans l’espace kernel
- C’est utile pour les programmes de traitement de données à haute vitesse comme l’encodage/décodage du code Morse
- D’autres projets offrant des fonctionnalités similaires incluent
splice et sendfile
1 commentaires
Commentaires Hacker News
La raison pour laquelle
JMPn’est pas remplacé parRETest l’option CONFIG_RETHUNKRETest remplacé parJMP __x86_return_thunkLes instructions NOP au début et à la fin de la fonction permettent à ftrace d’insérer des instructions de traçage
Le side project d’un utilisateur propose un appel système fournissant un ring buffer pour les descripteurs de fichiers
Dire que les pipes Linux sont « lents », c’est comme dire qu’une Toyota Corolla est « lente »
Sur les CPU modernes,
rep movsbest aussi rapide que les versions vectorisées les plus rapidescopy_user_enhanced_fast_stringle laisse entendreAVX512 consomme beaucoup d’énergie et déclenche un ajustement de la fréquence du CPU
Le « hug of death » de Hacker News est en train de se reproduire
Il serait intéressant de voir une version utilisant io_uring
Affirmer qu’un blog met environ 20 secondes à se charger est audacieux
Presque toutes les formes d’IPC sont « lentes »
Au départ, il ne comprenait pas pourquoi splice était si lent