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: обзоры и обновления
• Поддержка графики Xe2 для Intel Lunar Lake и Battlemage включена в Linux 6.12 по умолчанию
• Как настроить Comss.one DNS в Linux
• Обновления Linux за неделю: 25 ноября – 1 декабря 2024 года
• Linux сохраняет долю более 2% в ноябрьском опросе Steam благодаря Steam Deck
• Обновление Proton 9.0-4 Beta: Новые исправления для игр на Steam Deck и Linux
• Релиз Cinnamon 6.4: обновленный дизайн и оптимизация системы