Verbesserung der Stabilität des Steam-Clients unter Linux
(ttimo.typepad.com)Verbesserung der Stabilität des Steam-Clients
-
Hintergrund: Im Steam-Client-Update vom 5. November wurden einige allgemeine Abstürze unter Linux behoben. Der größte Einflussfaktor darunter war eine Änderung bei der Verwendung der Funktionen
setenvundgetenv. -
Problem:
setenvist unter Linux eine unsichere API und kann in Multithreading-Umgebungen Probleme verursachen. Nach einem Aufruf vongetenvkönnen in einem anderen Thread Abstürze wie SIGABRT auftreten. -
Lösung:
- Die meisten Aufrufe von
setenvwurden entfernt und so refaktoriert, dass die Umgebung beim Starten von Prozessen mitexecvpeübergeben wird. - Um die Abhängigkeit von
getenvzu verringern, werden die Aufrufe zwischengespeichert. - Für die verbleibenden Einsatzfälle von
setenvwurde ein „Environment Manager“ eingeführt, der beim Start vorab einen ausreichend großen Wertpuffer allokiert.
- Die meisten Aufrufe von
-
Ergebnis: Durch diese Änderungen ist die Häufigkeit von SIGABRT deutlich zurückgegangen. Es handelt sich jedoch nicht um eine perfekte Lösung, und wenn externe Bibliotheken
setenvaufrufen, besteht weiterhin Absturzgefahr. -
Ausblick: In glibc wird derzeit untersucht, wie sich dieses Problem lösen lässt, indem die Async-Signal-Sicherheit gewahrt bleibt und gleichzeitig die Nutzung von
envpsynchronisiert wird. Diese Arbeit ist komplex, aber langfristig soll eine Lösung vorgeschlagen werden, die nicht von der POSIX-Spezifikation abweicht.
1 Kommentare
Hacker-News-Kommentare
Aufgrund von Stabilitätsproblemen im Grafik-Stack von Red Hat wird ein Patch geprüft
getenvwird voraussichtlich in glibc 2.41 aufgenommensetenvist bereits leichter zu behandeln, da Umgebungs-Strings nicht freigegeben werdenunsetenvist wegen Nebenläufigkeitsproblemen kompliziertgetenvkeine Sperren einführen will, ist die Wahrung der Asynchronous-Signal-Safetyvfork+execveist es schwer, Memory Leaks zu vermeiden, weshalb Änderungen an der Umgebungsverarbeitung umstritten sindDankbarkeit dafür, dass Steam unter Linux gut funktioniert
Am besten liest man Umgebungsvariablen beim Booten ein und verwendet
setenvnichtgetenv/setenvals IPC-Messaging-Mechanismus kann problematisch seinEs gibt Zweifel daran, ob
setenveine Linux-API istsetenvist in POSIX definiert und wird nicht im Linux-Kernel, sondern im User Space implementiertEs gibt die Frage, ob Programme Fälle haben, in denen ein Thread
setenvaufruft und ein anderer Thread die Wirkung sehen sollEs gibt ein Problem, bei dem Steam sich darüber beschwert, dass keine Verbindung besteht
Die Einblicke in den Steam-Client und Linux-Programmierung sind interessant
Um das Problem in glibc zu lösen, könnten funktionale Kompromisse nötig sein
Die Rendering-Performance des Steam-Clients ist schlecht, wenn sich die Maus im Fenster befindet
Es gibt einen seit Langem bestehenden Bug im Linux-Steam-Client