- Este artículo analiza el debate en la comunidad de Rust sobre el uso de ejecutores multihilo, es decir, runtimes async que realizan work-stealing para distribuir equilibradamente las tareas.
- Algunos usuarios de Rust defienden una arquitectura alternativa llamada "thread-per-core", que promete mejor rendimiento y una implementación más sencilla.
- El término "thread-per-core" es engañoso. Todos los ejecutores multihilo son thread-per-core: crean un hilo del sistema operativo por núcleo y programan tareas sobre esos hilos.
- Thread-per-core combina tres ideas: manejar la concurrencia en espacio de usuario, hacer que la E/S sea asíncrona para evitar bloquear hilos, y particionar los datos entre núcleos de CPU para eliminar el costo de sincronización y el movimiento de datos entre cachés de CPU.
- La controversia gira principalmente en torno al tercer punto, y con async Rust se pueden cumplir los dos primeros requisitos.
- En una arquitectura thread-per-core se pueden aplicar dos optimizaciones: robar trabajo entre hilos y compartir la menor cantidad de estado posible.
- El work-stealing mejora la tail latency al permitir que todos los hilos tengan siempre trabajo, pero es difícil de implementar y puede provocar costos de sincronización y fallos de caché.
- El enfoque share-nothing mejora la tail latency al mantener los datos en la caché más rápida asociada a un solo núcleo de CPU, pero puede ser difícil de implementar en aplicaciones complejas que necesitan modificar estado en múltiples particiones.
- El artículo sugiere que, en sistemas con estado compartido, el work-stealing podría mejorar el uso de CPU bajo carga.
1 comentarios
Opinión de Hacker News
async/awaiten Rust es una buena abstracción.asyncde Rust, incluyendo que exigeSend + Sync + 'static, algo que a algunos les resulta pesado.Sendes un requisito que permite mover tareas entre hilos del ejecutor, y parece ser una deficiencia del sistemaasyncde Rust.asyncse considera una optimización prematura para muchos programas en Rust.Send,Syncy'static.