Valve раскрыла детали работы по повышению стабильности Steam на Linux
Недавно была выпущена встроенная функция записи игр в Steam, став частью большого обновления стабильной версии клиента Steam, включающего исправления "различных распространённых сбоев" на Linux. Теперь мы узнали больше о том, что происходит за кулисами.
В блоге разработчика Тимоте Бессета, активно работающего в Valve, упоминается, что важное изменение, касающееся функций setenv и getenv, значительно повлияло на стабильность клиента Steam на Linux.
Немного контекста:
- setenv: изменение или добавление переменной окружения.
- getenv: получение значения переменной окружения.
По словам Бессета, один из его коллег назвал setenv "худшим API для Linux", хотя это распространённый API, доступный на всех платформах, — "сложно было поверить, что всё настолько плохо". Однако уже было известно, что на Linux "setenv и getenv небезопасны для использования в многопоточных средах".
Скриншот клиента Steam
Частью проблемы является разнообразие Linux-дистрибутивов, с различными оконными менеджерами, окружениями рабочего стола, версиями драйверов и пользовательскими настройками. В итоге отчёты о сбоях становятся "очень шумными". Ещё одна сложность заключается в том, что setenv может вызывать сбой в многопоточной программе, и помимо этого, "другие потоки обычно заканчиваются ошибкой SIGABRT вскоре после вызова getenv", а трассировки сбоев оказываются "хаотичными и не привязанными к одной причине".
Что же они сделали? Вот их подход:
- Убрали большинство вызовов
setenv
. Они использовались в основном при запуске процессов, и рефакторинг с переходом наexecve
для передачи подготовленной среды улучшил ситуацию.- Сократили зависимость от
getenv
, в основном за счёт кэширования вызовов. В системных библиотеках (x11, xcb, dbus и др.) использование остаётся высоким, но они продолжают работать над его уменьшением.- Для оставшихся случаев использования
setenv
, которые сложно было рефакторить, они ввели "менеджер окружения", который выделяет достаточно большие буферы значений на старте для фиксированных переменных окружения, ещё до начала работы потоков.
Эту запись в блоге стоит прочитать, если вам интересны закулисные подробности, ведь разработка для Linux порой напоминает минное поле.
Согласно одному из комментариев к записи, эти проблемы рассматриваются и в glibc, так что, возможно, они не будут столь серьёзными в будущем для разработчиков на Linux.
Чем стабильнее станет клиент Steam, тем лучше будет опыт для новых пользователей Linux, а также для владельцев Steam Deck, так как SteamOS базируется на Linux. Приятно видеть, как разработчики Valve постоянно стремятся улучшать продукт.
Linux: обзоры и обновления
• VacuumTube — лучший способ смотреть YouTube на Steam Deck и SteamOS
• Steam Deck и SteamOS: более 20 000 игр получили статус «Полностью совместима» или «Можно играть»
• Proton Experimental получил исправления для Warframe, Enshrouded, Crysis 2 Remastered и других игр на Linux и Steam Deck
• Wine 10.10: новые функции и исправления для Windows-приложений
• 3DMark планирует выпустить версию для Linux
• Manjaro KDE Plasma переходит на Wayland по умолчанию