- Cet article traite de la controverse, dans la communauté Rust, autour de l’usage des exécuteurs multithread, c’est-à-dire des runtimes async qui pratiquent le work-stealing pour répartir les tâches de manière équilibrée.
- Certains utilisateurs de Rust défendent une architecture alternative appelée « thread-per-core », qui promet de meilleures performances et une implémentation plus simple.
- Le terme « thread-per-core » est trompeur. Tous les exécuteurs multithread sont de type thread-per-core : ils créent un thread OS par cœur et planifient les tâches sur ces threads.
- Le thread-per-core combine trois idées : gérer la concurrence en espace utilisateur, rendre les E/S asynchrones pour éviter de bloquer les threads, et partitionner les données entre les cœurs CPU afin d’éliminer les coûts de synchronisation et les déplacements de données entre caches CPU.
- La controverse porte surtout sur le troisième point, et l’async Rust permet de satisfaire les deux premières exigences.
- Dans une architecture thread-per-core, deux optimisations sont possibles : voler le travail entre threads et partager aussi peu d’état que possible.
- Le work-stealing améliore la tail latency en permettant à tous les threads de toujours avoir du travail, mais il est difficile à implémenter et peut entraîner des coûts de synchronisation ainsi que des défauts de cache.
- Le share-nothing améliore la tail latency en conservant les données dans les caches plus rapides associés à un seul cœur CPU, mais il peut être difficile à mettre en œuvre pour des applications complexes qui doivent modifier l’état sur plusieurs partitions.
- L’article suggère que, dans les systèmes utilisant un état partagé, le work-stealing pourrait améliorer l’utilisation du CPU sous charge.
1 commentaires
Avis Hacker News
async/awaitest une bonne abstraction en Rust.Send + Sync + 'static, que certains jugent contraignante.Sendest une exigence qui permet de déplacer des tâches entre les threads de l’exécuteur, ce qui semble être un défaut du système async de Rust.asyncest considéré comme une optimisation prématurée pour beaucoup de programmes Rust.Send,Syncet‘static.