Firezone veröffentlicht sanstun: WireGuard in Rust, das Krypto-Arbeit auslagert und 45-fachen Speedup verspricht
Sanstun: A sans-IO, parallel-friendly WireGuard implementation in Rust
Firezone hat sanstun vorgestellt, eine WireGuard-Implementierung in Rust nach dem sans-IO-Prinzip. Nach über zwei Jahren Arbeit an einem eigenen boringtun-Fork haben sie eine API entworfen, die Ein- und Ausgabezustand strikt trennt. Der Clou: Verschlüsselung lässt sich auf Worker-Threads auslagern, während die Verwaltung single-threaded bleibt. Benchmarks zeigen, dass bei 1280-Byte-Paketen nur 2 % der Zeit für Buchhaltung anfallen – theoretisch über 45-fache Beschleunigung.
Bei einer Paketgröße von 1280 Bytes beträgt der Buchhaltungsanteil beim Verschlüsseln eines neuen Pakets nur 2 %. Wenn wir die eigentliche Verschlüsselung auf einen anderen Thread verlagern, deutet dies auf eine potenzielle Beschleunigung von mehr als 45x hin!
- Twey
Es lief alles großartig, bis ich las
> Das Design vermeidet auch Probleme wie Function Coloring und harmoniert gut mit Rusts Ownership-Regeln.
Async ist nicht I/O. Es kann für I/O verwendet werden, aber es ist einfach eine Art, reine, deterministische Zustandsmaschinen zu schreiben, die einen logischen Ablauf zusammenhält, statt ihn über eine Reihe von Übergängen zu verteilen.
Selbst wenn du dich entscheidest, deine Async-Flows manuell in explizite Zustandsmaschinen zu kompilieren, musst du dich immer noch mit ‚Function Colouring‘ (a.k.a. Typisierung) herumschlagen: Ein Flow, der mehrere Zustandsübergänge durchläuft (und bei dem möglicherweise andere, disjunkte Teile des Zustands in der Zwischenzeit über andere Übergänge aktualisiert werden), muss nun als (eine Reihe von) Zustandsübergängen neu geschrieben werden und kann nicht aus einer blockierenden Funktion aufgerufen werden. Wenn überhaupt, macht das Neuschreiben all deiner Zustandsmaschinen ohne `async` das Function-Colouring-‚Problem‘ schlimmer, weil Multi-Transition-Flows sich noch stärker von normalen Funktionen unterscheiden.
- monocasa
Süß, so entwerfe ich im Grunde auch meine Protokollimplementierungen in Rust.
Viel besser testbar, der Großteil kann zwischen asynchroner und blockierender I/O geteilt werden, es ist viel einfacher, unsafe in deinen Abhängigkeiten komplett zu verbieten (außer std und core), usw.
- temp0826
Mullvad hat ebenfalls ihre eigene Implementierung von boringtun abgespalten (genannt gotatun[0])