Вступление
Здесь пойдет речь на об оптимизации ядра Linux для HLDS с целью получения стабильных 1000FPS.
Понадобятся прямые руки, немножко серого вещества, сигареты, пиво и 2 часа времени.
Все вопросы оставлять в этой теме.
Итак, начнем
1. Подготовка
Для начала проверьте, что в системе имеются следующие пакеты:
- gcc (компилятор)
- make, gmake или gnu-make
- fakeroot
- ncurses and ncurses-dev (libncurses5-dev в Debian и Ubuntu)
- chrt (в Debian пакет schedutils, в других может schedtool)
- zlib1g-dev (это для Debian и Ubuntu)
- kernel-package (Debian и Ubuntu)
- patch (нужен для наложения патчей на ядро)
2. Скачиваем сурцы ядра и патч
Открываем http://kernel.org/pub/linux/kernel/projects/rt/ и смотрим последнюю версию ядра, для ктоторой есть RT патч и скачиваем этот патч:
Code
wget http://kernel.org/pub/linux/kernel/projects/rt/patch-2.6.31.12-rt21.gz
Теперь идем на http://kernel.org/pub/linux/kernel/v2.6/ и качаем ядро той же версии, что и патч RT.
Code
wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.12.tar.gz
Распаковываем ядро и патчим его:
Code
tar zxf linux-2.6.31.12.tar.gz
cd linux-2.6.31.12
zcat ../patch-2.6.31.12-rt21.gz | patch -p1
3. Настройка и компиляция ядра
Открываем утилиту для редактирования конфига ядра. Утилита консольная, пойдет и на десктопах и на серверах по SSH.
И меняем следующие настройки:
- General setup:
- RCU Subsystem (ignore if not present)
- Включить RCU Implementation (Preemptible RCU)
- Отключить Enable tracing for RCU
- Processor type and features:
- Включить Tickless System (Dynamic Ticks)
- Включить High Resolution Timer Support
- Выбрать тип проца
- Поменять Preemtion Mode на Complete Preemption (Real-Time)
- Включить Enable priority boosting of RCU read-side critical sections (ignore if not present)
- Отключить Enable tracing for RCU - currently stats in debugfs (ignore if not present)
- Включить Machine Check Exception and select Intel or AMD depending on your CPU
- Поменять Timer frequency на 1000 HZ
- Power management and ACPI options
- Включить Power Management support
- Отключить Power Management Debug Support
- Отключить Suspend to RAM and standby
- Отключить Hibernation (aka 'suspend to disk')
- Включить ACPI (Advanced Configuration and Power Interface) Support
- Отключить CPU Frequency scaling
- Отключить CPU idle PM support
- Networking support
- Networking options
- Включить Packet socket: mmapped IO
- Отключить QoS and/or fair queueing
- Device Drivers
- Отключить Watchdog Timer Support
- Включить Real Time Clock
- Включить PC-style 'CMOS'
- Kernel hacking
Приступаем к компиляции:
Code
make clean
fakeroot make-kpkg clean && fakeroot make-kpkg kernel_image --initrd && cd ..
Теперь идем на часок покурить, попить пивка, расслабиться. Возвращаемся и видим готовый .deb пакет с ядром.
Code
cd ..
dpkg -i 'ИМЯ_НОВОГО_DEB_ПАКЕТА'
Этот пакет быстренько установится, все зависимости подправит, GRUB обновит.
4. Загрузка с новым ядром
Самое время перезагрузиться.
При загрузке надо будет выбрать новое ядро.
Если загрузка прошла успешно, вводим команду
В ответ консоль должна выдать что-то в духе
5. Назначение серверам RealTime приоритета
Это делается с помощью команды
Где pid - pid процесса сервера.
Также можно закинуть все такое дело в CRON скрипт. Например вот так:
Code
#!/bin/sh
PIDS=`ps ax | grep sirq-hrtimer | grep -v grep | sed -e "s/^ *//" -e "s/ .*$//"`
for p in $PIDS; do
chrt -f -p 99 $p
done
PIDS=`ps ax | grep sirq-timer | grep -v grep | sed -e "s/^ *//" -e "s/ .*$//"`
for p in $PIDS; do
chrt -f -p 51 $p
done
PIDS=`pidof srcds_linux`
for p in $PIDS; do
chrt -f -p 98 $p
done
PIDS=`pidof srcds_i686`
for p in $PIDS; do
chrt -f -p 98 $p
done
PIDS=`pidof srcds_i486`
for p in $PIDS; do
chrt -f -p 98 $p
done
PIDS=`pidof srcds_amd`
for p in $PIDS; do
chrt -f -p 98 $p
done
PIDS=`pidof hlds_i686`
for p in $PIDS; do
chrt -f -p 98 $p
done
PIDS=`pidof hlds_i486`
for p in $PIDS; do
chrt -f -p 98 $p
done
PIDS=`pidof hlds_amd`
for p in $PIDS; do
chrt -f -p 98 $p
done
Этот скрипт назначит обычным процессам приоритет пониже, а серверам - по максимуму
Проверяем!
Code
./hlds_run -game cstrike +map de_dust2 +sys_ticrate 1000 -pingboost 3
Должно получиться 990-1000 довольно стабильных фпс. У меня на домашнем P4 вот так получилось:
Code
CPU In Out Uptime Users FPS Players
99.90 0.00 0.00 4 0 995.02 0
stats
C PU I n O ut U p time Users FPS Players
99.90 0.00 0.00 4 0 993.05 0
stats
CPU In Out Uptime Use rs F PS P la yers
99.90 0.00 0.00 4 0 992.06 0
stats
CPU In Out Uptime Users FPS Players
9 9.90 0.00 0 .00 4 0 995.02 0
Нагрузка на ядро конечно бешеная, но зато стрельба на высоте
Если надо совсем впритык к 1000 FPS, то запускаем так:
Code
./hlds_run -game cstrike +map de_dust2 +sys_ticrate 1500 -pingboost 3
Спасибо за внимание!
Все вопросы в эту тему