LinuxでSteamクライアントの安定性を改善
(ttimo.typepad.com)Steamクライアントの安定性改善
-
背景: 11月5日のSteamクライアントアップデートで、Linuxにおける一般的なクラッシュを修正。このうち最も大きな影響があったのは、
setenvとgetenv関数の使用方法の変更。 -
問題点:
setenvはLinuxで安全ではないAPIであり、マルチスレッド環境で使用すると問題が発生する可能性がある。getenv呼び出し後に、別スレッドで SIGABRT のようなクラッシュが発生することがある。 -
解決策:
- ほとんどの
setenv呼び出しを削除し、プロセス生成時にexecvpeを使って環境を渡すようにリファクタリング。 getenvへの依存を減らすため、呼び出しをキャッシュ。- 残っている
setenvの使用例については、「環境マネージャー」を導入し、起動時に十分に大きな値バッファをあらかじめ割り当て。
- ほとんどの
-
結果: これらの変更により、SIGABRT の発生頻度は大幅に減少。ただし完全な解決策ではなく、外部ライブラリが
setenvを呼び出す場合は依然としてクラッシュのリスクがある。 -
今後の計画: glibc では、この問題を解決するために、非同期シグナル安全性を維持しつつ
envpの使用と同期する方法を研究中。この作業は複雑だが、長期的には POSIX 仕様から逸脱しない範囲で解決策を提案する予定。
1件のコメント
Hacker Newsの意見
Red Hatのグラフィックスタックの安定性問題により、パッチが検討中
getenvのスレッド安全性修正が glibc 2.41 に含まれる可能性が高いsetenvはすでに環境文字列を解放しないため、対処しやすいunsetenvは並行性の問題があるため複雑getenvにロックを導入したくない理由は、非同期シグナル安全性を維持するためvfork+execveのため、メモリリークを避けるのが難しく、環境処理の修正には議論があるLinux で Steam がうまく動作していることに感謝している
環境変数は起動時に読み込み、
setenvを使わないのが最善の方法getenv/setenvを IPC メッセージング機構として使うのは問題になる可能性があるsetenvが Linux API なのかという疑問があるsetenvは POSIX で定義されており、Linux カーネルではなくユーザー空間で実装されているプログラムがあるスレッドで
setenvを呼び出し、別のスレッドでその効果を必要とする場合があるのかという疑問があるSteam が接続がないと文句を言う問題がある
Steam クライアントと Linux プログラミングに関する洞察が興味深い
glibc で問題を解決するには、機能面でのトレードオフが必要になるかもしれない
Steam クライアントのレンダリング性能は、マウスがウィンドウ内にあるとき良くない
Linux 版 Steam クライアントには長年続いているバグがある