- Dieser Artikel diskutiert in der Rust-Community die Kontroverse über den Einsatz von Multithread-Executors, also Async-Runtimes, die Work-Stealing einsetzen, um Aufgaben ausgewogen zu verteilen.
- Einige Rust-Nutzer plädieren für eine alternative Architektur namens "thread-per-core", die bessere Performance verspricht und einfacher zu implementieren sein soll.
- Der Begriff "thread-per-core" ist irreführend. Jeder Multithread-Executor ist thread-per-core, erzeugt also jeweils einen OS-Thread pro Core und plant darauf Aufgaben ein.
- Thread-per-core kombiniert drei Ideen: die Behandlung von Parallelität im User Space, asynchrones I/O zur Vermeidung blockierender Threads und die Partitionierung von Daten über CPU-Cores hinweg, um Synchronisierungskosten und Datenbewegungen zwischen CPU-Caches zu eliminieren.
- Die Kontroverse dreht sich vor allem um den dritten Punkt; mit Async Rust lassen sich die ersten beiden Anforderungen erfüllen.
- In einer Thread-per-Core-Architektur lassen sich zwei Optimierungen vornehmen: Arbeit zwischen Threads stehlen und möglichst wenig Zustand gemeinsam nutzen.
- Work-Stealing verbessert die Tail Latency, indem sichergestellt wird, dass alle Threads immer Arbeit haben, ist aber schwer zu implementieren und kann Synchronisierungskosten sowie Cache Misses verursachen.
- Share-Nothing verbessert die Tail Latency, indem Daten in den schnelleren Caches eines einzelnen CPU-Cores gehalten werden, kann aber bei komplexen Anwendungen, die Zustand über mehrere Partitionen hinweg ändern müssen, schwer umzusetzen sein.
- Der Artikel schlägt vor, dass Work-Stealing in Systemen mit gemeinsam genutztem Zustand die CPU-Auslastung unter Last verbessern könnte.
1 Kommentare
Hacker-News-Kommentare
Send + Sync + 'static, die einige als belastend empfinden.Send-Bound ist eine Anforderung, die das Verschieben von Aufgaben zwischen Executor-Threads erlaubt, und wirkt wie ein Mangel des Async-Systems von Rust.asyncgilt für viele Rust-Programme als verfrühte Optimierung.Send,Syncund'staticmit sich.