Pull to refresh

Тюнинг linux для игр

Reading time 5 min
Views 14K
imageНесколько раз замечал жалобы новых пользователей linux на отзывчивость игр. Говорят, что после продолжительной игры в windows, в линуксе сразу заметны странные задержки системы. В пример ставится задержка между кликом по кнопке выстрела и самим выстрелом, например, это выразительно проявляется с railgun в quakelive. Конечно, время средней реакции игрока на событие (200-220мс) существенно больше выигрыша от какого-либо тюнинга системы, но если можно обратить пару десятков миллисекунд в свою пользу, то почему бы не сделать это? В общем, и сами пользователи windows, увлекшись, ищут способы тюнинговать систему для более приятной игры. Немалую роль играет и сугубо игровой тюнинг переменных, но об этом достаточно информации на специализированных форумах, и в очередной раз обсуждать это не стоит.


Ядро


Ядро linux, как и ядро любой другой системы — основа основ, корень всех корней. Производительность любых приложений напрямую зависит от производительности ядра. Для того, чтобы сделать ядро наиболее отзывчивым, я сделал две нехитрых операции. Во-первых, изменил параметр CONFIG_HZ. Он отражает частоту таймера прерываний. Чем это значение выше, тем чаще происходят прерывания и тем более отзывчивыми становятся пользовательские приложения. Обычно, его значение в дистрибутивах 250 или 300Hz. Это среднячок между частотой, рекомендуемой для сервера (100Hz) и наибольшей частотой. В ванильном ядре, а значит, в большинстве дистрибутивных ядер, максимальное значение, которое может принимать этот параметр, равно 1000Hz. Разумеется, можно пропатчить ядро и получить более брутальную линейку его значений. Например, zen-патчсет содержит патч, позволяющий устанавливать этот параметр в значение 10000Hz! Честно скажу, такое значение я не пробовал, так как у меня крутится несколько серверных задач, и какая-то стабильность тоже нужна. Смело собирайте ядро с CONFIG_HZ_1000=y, это отзывчиво, это стабильно, проверено годами. Ну, или больше, просто стабильность и поведение системы прокомментировать не могу.
Второе, что касается ядра — планировщик. По умолчанию в ванильном и дистрибутивных ядрах используется CFS, это стандартный планировщик linux, он стабилен, хорош, прекрасно выполняет свою работу. Но он не единственный в своем роде, существуют патчи, позволяющие назначить другой планировщик — BFS (Brain Fuck Scheduler), написанный Коном Коливасом. О тонкостях его работы говорить не буду, нас интересует только то, что этот планировщик тоже позволяет сделать систему более отзывчивой и «десктопной». Стабильность, сразу скажу, не ахти. Лучше не использовать его с ядром из git или rc-ядрами, а дожидаться стабильного релиза. На срезах иногда может наблюдаться непродолжительный фриз некоторых клавиш или кратковременный фриз картинки при игре. Скачайте патч BFS для своего ядра и поставьте CONFIG_SCHED_BFS=y, это хорошо улучшает отзывчивость.
Кстати, планировщик BFS содержится и в zen-патчсете, а ядра zen есть во многих дистрибутивах.
Еще одна полезная опция ядра — Preemption Model. Может принимать три значения: «No Forced Preemption (Server)», «Voluntary Kernel Preemption (Desktop)» и «Preemptible Kernel (Low-Latency Desktop)». Последнее значение включает ряд оптимизаций для использования ядра в качестве отзывчивого десктопа. Она-то нам и нужна. Установите CONFIG_PREEMPT=y, это поможет повысить отзывчивость десктопных приложений, в том числе игр.
Кроме всего этого, есть замечательный rt-патчсет, нацеленный в первую очередь на выполнение задач в realtime. Ядро rt тоже есть в большинстве дистрибутивов, что большой плюс — патчить ничего не надо. Если вы привыкли к бинарным ядрам, просто перейдите на rt, это простой и хороший способ повысить отзывчивость системы.

Мышь


Уже много лет игроки со стажем «разгоняют мыши». На самом деле мышь как таковая разгону не поддается, зато существуют способы заставить систему почаще опрашивать состояние мыши. В windows для этого существуют специальные утилиты, в линуксе же это делается на уровне драйвера. Чтобы узнать, какой драйвер используется для вашей мыши, поищите информацию в выводе команды 'dmesg | grep input'. У большинства игроков проводные usb-мыши, для которых используется драйвер usbhid, а этот модуль имеет специальную опцию mousepoll, определяющую период опроса мыши. По умолчанию она имеет значение 8 (мс), т.е. частота опроса равна 125Hz. Я использую mousepoll=2 и гоняю мышь на 500Hz. Сделал бы период и меньше, но с mousepoll=1 частота мыши все равно остается 500Hz вместо ожидаемых 1000Hz. Почему — мне неизвестно, я не программист и разобраться в коде драйвера не могу. Для того, чтобы модуль usbhid автоматически подгружался с опцией mousepoll=2, необходимо явно указать это в параметрах автозагрузки модулей. Здесь вам стоит прочесть документацию для своего дистрибутива, т.к. в разных дистрибутивах могут использоваться разные системы инициализации, и правило загрузки модулей для одного дистра может просто не сработать в другом.
Но ничего сложно нет. У меня, например, в файле /etc/modules.autoload.d/kernel-2.6 просто содержится строчка 'usbhid mousepoll=2'. У вас это может быть файл /etc/modprobe.d/hid.conf (создается руками, если каталог существует) или /etc/modprobe.conf (устаревший вариант). Проверить частоту опроса мыши можно маленькой утилитой. Для запуска нужно ее собрать (gcc evhz.c) и запустить от рута полученный a.out. Специально даю исходный код, запускайте без опаски.

Сеть


Качество сети, несомненно, имеет важное значение. Но на ее качество за пределами своей сетевой карты игрок едва ли может повлиять, если только он не пользуется услугами провайдера, где работает его друг. И, думаю, не стоит говорить о том, что лучше предпочесть провода, что так же касается и мыши. А вот управлять очередью исходящих пакетов очень даже можно. Для общения с сервером большинство игр использует порты UDP в некотором диапазоне. Следующие несколько строк позволяют повысить приоритет пакетов игры над другими жалкими пакетами:

#Сброс правил
tc qdisc del dev ppp0 root 2> /dev/null > /dev/null
tc qdisc del dev ppp0 ingress 2> /dev/null > /dev/null

#Указание к использованию дисциплины очереди HTB на интерфейсе, класс 15 - класс по умолчанию
tc qdisc add dev ppp0 root handle 1: htb default 15 r2q 10

#Описание очередей
#Указание ширины гарантированной полосы (rate) и максимально возможной (ceil)
tc class add dev ppp0 parent 1: classid 1:1 htb rate 15mbit ceil 15mbit

#Указание rate и ceil для очереди 1:10, имеющего наивысший приоритет (0)
tc class add dev ppp0 parent 1:1 classid 1:10 htb rate 10mbit ceil 15mbit prio 0

#Указание rate и ceil для очереди 1:15, используемого по умолчанию и имеющего меньший приоритет (5)
tc class add dev ppp0 parent 1:1 classid 1:15 htb rate 5mbit ceil 15mbit prio 5

#И, наконец, определение пакетов, которые должны попадать в очередь 1:10
tc filter add dev ppp0 parent 1:0 protocol ip prio 0 u32 match ip protocol 17 0xff flowid 1:10


У меня в наибольший приоритет попадает весь udp, уточнять порты для конкретных игр я не стал, так как это полезно и для других протоколов, таких как dns. Надеюсь, вы не используете uTP и не гоняете по udp торренты. А если используете, срочно отключите и никогда не включайте. Геймеры просят.
Значения rate и ceil поправьте под свой тариф. Rate — ширина гарантированной пропускной полосы для очереди, ceil — ширина максимальной, то есть, когда пакетов в других очередях нет, данной очереди предоставляется канал шириной больше rate, но никогда не больше ceil. Рекомендуется аккуратно выбирать значения rate для очередей 1:10 и 1:15, их сумма должна быть равна rate родительского класса 1:1. Интерфейс ppp0 можно оставить без изменений, если для подключения к интернету вы используется pppd, то есть, если ваш провайдер раздает интернет через PPPoE или PPTP. Если же Вы счастливый обладатель неинкапсулированного интернета по ethernet, подставьте в правила интерфейс сетевой карты, скорее всего, eth0.
Более подробно эти и другие аспекты настройки сети в линукс описаны в шикарном документе Linux Advanced Routing & Traffic Control HOWTO.

Надеюсь, это руководство поможет даже самым увлеченным игрокам по-настоящему полюбить linux. Удачи в играх!
Tags:
Hubs:
+58
Comments 45
Comments Comments 45

Articles