Как синхронизация TSC повлияла на плавность игр в Linux
Переход с Windows на Linux в качестве игровой платформы начался для автора как эксперимент. После установки системы он решил внимательно изучить сообщения ядра и устранить обнаруженные предупреждения. Одно из них сначала не казалось критичным, но позднее оказалось связано с неприятной особенностью работы игр.
В журнале dmesg появлялось сообщение о рассинхронизации TSC между ядрами процессора. Ядро фиксировало значительный сдвиг счётчиков, помечало TSC как нестабильный источник времени и переключалось на HPET. Речь шла о расхождении примерно в 6,3 миллиарда тактов — при частоте около 3 ГГц это соответствует приблизительно двум секундам.
Почему переход на HPET оказался заметен
TSC — высокопроизводительный счётчик тактов, который современные системы используют для измерения времени. HPET также предназначен для работы с таймерами, однако в данном случае он оказался менее быстрым. На уровне обычной работы системы переключение прошло почти незаметно, но в играх автор столкнулся с недостаточной плавностью: ввод ощущался менее отзывчивым, а при выводе изображения возникало впечатление, будто рендерингу что-то мешает.
В поисках решения автор проверил рекомендации по оптимизации Linux для игр, изучил варианты кастомных ядер, сборки вроде Zen и различные параметры загрузки. Наиболее заметный эффект дал параметр tsc=reliable. После его добавления система стала отзывчивее, а в играх появилась плавность, сопоставимая с Windows.
Попытка исправить синхронизацию в ядре
Дальнейшее изучение исходного кода Linux показало, что за синхронизацию отвечает файл tsc_sync.c. При этом предусмотренный механизм не охватывал некоторые платформы без поддержки TSC_ADJUST, включая используемый автором процессор AMD Ryzen.
Автор разработал собственный патч: первое ядро процессора использовалось как эталон, а его значение таймера переносилось на остальные ядра. После увеличения числа попыток синхронизации с трёх до 16 удалось добиться того, чтобы активным источником времени снова стал TSC, а не HPET. Однако субъективная плавность всё ещё не полностью восстановилась.
Следующая версия решения появилась после изучения аналогичных проблем и консультаций с ИИ. В патч добавили отдельную логику для первого ядра: таймер на нём нужно было перематывать вперёд, тогда как для остальных ядер первоначально применялась обратная операция. После этого автор получил ожидаемый результат — более плавный ввод и вывод в играх. Для включения исправления добавили отдельный параметр загрузки tsc_fixwarp.
Где должна исправляться проблема
Окончательного ответа на вопрос о происхождении рассинхронизации у автора нет. Одни рекомендации указывают на возможные ошибки или ограничения прошивки BIOS, другие относят проблему к операционной системе и её механизмам инициализации таймеров. В рассматриваемом случае исправление на уровне ядра оказалось достаточным, чтобы сделать работу Linux и игр заметно комфортнее.
История показывает, что предупреждение в системном журнале, которое обычно считают несущественным, в отдельных конфигурациях может влиять на субъективное качество работы. При этом применение параметров вроде tsc=reliable и сторонних патчей требует осторожности: они вмешиваются в низкоуровневую работу таймеров и не обязательно подойдут другим процессорам или системам.


