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

    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. Удачи в играх!
    Share post

    Similar posts

    Comments 45

      –11
      Отличное название опции CONFIG_HZ =)

      Вообще, всё это мутное хакерство не вяжется с идеей «линукс для геймеров». Может быть, есть какой-то дистрибутив, затьюненный под скоростной отклик для геймеров?
        +12
        А по-моему, вяжется. На деле ведь это не более сложно, чем тюнинг windows, которым игроки успешно занимаются. Еще проще, когда игрок линуксоид.
        Про специальные дистрибутивы не слыхал, но даже если они есть, я надеюсь, игрокам интересно будет знать, что в них сделано, а не просто пользоваться.
          +2
          Лично я никогда не замечал за собой боязни «лезть под капот», потому что скорее был гиком, чем геймером.

          Но я просто хотел сказать ту мысль, что геймер не обязан быть гиком.
          Хотя здесь это, наверное, оффтоп.

          Спасибо за интересную статью! :) Я думаю, что она окажется полезна не только геймерам.
            +13
            Геймеры со слабыми компами обречены становиться гиками :)
            0
            Зачем специальный дистрибутив? Вон на Генте интернет-клуб сделали.
          –16
          Игры не нужны. Одно из самых вредный изобретений человечества.
            +7
            Очень максималистское и радикальное изречение, честно говоря.
            То же самое можно сказать про многие другие формы досуга.
              0
              Игра, изначально, не форма досуга, но форма обучения.
                +2
                Ну, теоретически, это можно сказать про все формы досуга)))
                  +1
                  ну — не скажите, не вижу обучающей составляющей в валянии на диване и просмотре, скажем, дома2… Ну уж считать до 100 ребенка таким образом не научишь.

                  Вообще, досуг, мне кажется, вторичен. Надо поглядеть, что у приматов в этом направлении…
              0
              Какой вы скучный :)
                0
                Мультимедиа, а в частности игры как таковые — двигатель IT прогресса в целом.
                Если бы не игры — Вы бы до сих пор сидели на процессорах 133 гц с калькулятором.
                  +2
                  А вот и нет. M$ бы не допустила :)
                    0
                    Ну ерш вашу налево, и в этом блоге нашлись фанаты M$ и насрали в карму :)
                      +1
                      В этом вся «прелесть» тайного голосования. У меня вот тоже статья в плюсе, зато в карму насрали. Фиг с ним :)
                    0
                    Если бы не игры — я бы читал этот ресурс с Амиги.
                    Которой вполне бы хватило по вычислительной мощности до 3-го курса.
                      0
                      Ничего, что для поддержания этого ресурса сейчас нужны тысячи Амиг одновременно?
                  • UFO just landed and posted this here
                      +14
                      Комментарии не нужны. Одно из самых вредный изобретений человечества.
                        +9
                        Сказал чувак, который состоит только в одном блоге: Хабраюмор.
                          +2
                          Люди не нужны. Одно из самых вредных изобретений Бога.
                          0
                          Хм. Попробую пересобрать ядро с CONFIG_HZ=1000, очень уж интересно.
                            +3
                            Передумал, собрал с zen-патчем. Был косяк с двайвером для nvidia, хорошо что он есть с патчем же в ауре для архлинукса. Я не верю в происходящее. NetBeans загрузился раза в полтора-два быстрее чем обычно. Вкупе с ручным увеличением fps в компизике и уменьшением времени отклика там же, система будто приняла амфетамина.
                              +1
                              Впечатляет) Я, честно говоря, получил более скромные результаты, хотя тоже ощутимые.
                              Переход на zen с bfs и CONFIG_HZ_1000=y дал около 15% прироста производительности по данным теста geekbench.
                                0
                                Уточняйте пожалуйста, что «прироста производительности на процесс» :) А то это не совсем корректно так говорить
                                  0
                                  Хе) Сначала не понял, в чем разница, потом подумал — да, так более правильно.
                                +2
                                Ничего необычного. Тюнинг этой опции подразумевает более частую обработку системных вызовов. Поэтому софт прожевывается быстрее.

                                На серверах ее не рекомендуют потому, что это может привести к частой смене контекста выполнения, что при большом количестве задач может убить производительность (то же относится и к черезчур высокому значению параметра).

                                P.S.: Еще рекомендую поставить опцию preemptible kernel.
                              +3
                              Столько слов написано, и из них ни единого про настройку видео…
                              А так же упущены многие нюансы, вроде выбора адресации памяти(mtrr,pat,etc...), настройки динамического изменения частоты(либо отключение ее, либо принудительное фиксированное изменение при запуске каких-то процессов)… это так, на случай если будете писать продолжение.
                                0
                                Вы правы, про cpufreq я как-то позабыл, хотя у самого сделано.
                                А вот о тюнинге видеокарт или выборе адресации памяти написать не смогу, мне об этом ничего не известно.
                                +2
                                а чо про PREEMPT не написали?
                                  0
                                  Как-то упустил. Добавил в раздел оптимизации ядра, спасибо.
                                  +2
                                  Я всё ждал твиков про FGLRX.
                                    0
                                    а смысл его твикать, если его Xorg'овая libGL до сих пор не понимает, что от нее хочет тот же UT2007? Единственно возможный твик — перейти на открытый драйвер, с ним есть шансы получить [s]хоть что-то красноглазое[/s] работоспособный KMS.
                                    0
                                    Самое главное — композит отрубить (если включен, конечно) при запуске игрушки.
                                      0
                                      Дам рецепт из собственного опыта.

                                      Проверено на Ubuntu 7.04 и Ubuntu 8.10, на видеокарточках NVidia-FX5200 и NVidia NVidia-GT220.

                                      Суть: при использовании драйверов из репозитария (установленные через менеджер установки проприетарных драйверов), в OpenGL программах видна невооруженным глазом задержка в 0,25 — 0,5 сек. Грубо говоря, с нормальной отзывчивостью отрисовывается только десктоп и его 2D элементы — курсор, текст, рамки окон. А в OpenGL-приложениях наблюдаются явные «запаздывания», причем никаких торможений нет, отрисовывается каждый кадр. Есть именно запаздывание.

                                      Решение — установить из исходников (а не из готовых пакетов) проприетарные драйвера NVidia. Запаздывание сразу исчезает.
                                        +2
                                        Из каких исходников? Где вы их нашли? Я не помню чтобы нвидиа исходники открывала.
                                          +1
                                          > Из каких исходников? Где вы их нашли? Я не помню чтобы нвидиа исходники открывала.

                                          На сайте NVidia лежат файлы *.run с обфусцированными исходниками драйверов, которые компилируются на машине пользователя. Именно это происходит при запуске установщика драйверов NVidia.

                                          ru.download.nvidia.com/XFree86/Linux-x86/260.19.12/NVIDIA-Linux-x86-260.19.12.run

                                          В момент инсталляции можете задать флаг логировать установку, и увидите сколько раз вызывается gcc, и из чего собираются *.so и *.ko-файлы.
                                          0
                                          (а не из готовых пакетов)
                                          пакеты из каких конкретно репозиториев имеются в виду?
                                        • UFO just landed and posted this here
                                            0
                                            А зачем swap отключать? Или вы не используете tmpfs?
                                              0
                                              а зачем swap на десктопе вобще?
                                              1Гб оперативы забить очень непросто.
                                              рекомендую сбросить кеши и посмотреть скока памяти реально занято.
                                              а в наше нелегкое время обычно гораздо больше(у меня 8)
                                                +1
                                                Ну, у меня много более 1 Гб забивается при использовании баузера или виртуальных машин :)

                                                А swap нужен ещё для /tmp (или что ещё пожелаете) под tmpfs: ФС, которая хранится по возможности только в оперативе, и сбрасывается на хард только в случае нехватки RAM. В отличие от delayed allocation у ext4/XFS и прочих, tmpfs вообще не будет трогать хард, если есть свободная оператива.
                                                  +1
                                                  Главного не написал — tmpfs лезет в swap, если нет места в RAM.
                                                  0
                                                  1Гб оперативы забить очень непросто.
                                                  Ну вот у меня прямо сейчас 2 из 4G занято. И это не предел.
                                                0
                                                Согласен, что половина рекомендаций пригодится не только игрокам, но название что надо. Разгон мыши или наивысший приоритет для игровых пакетов это не типично.
                                                Вот уж отключение swap игрокам советовать не буду.

                                              Only users with full accounts can post comments. Log in, please.