| In1ernal_Error | Дата: Воскресенье, 12.06.2011, 13:27 | Сообщение # 1 |
Группа: Администраторы
Сообщений: 69
Репутация: «121»
Статус: Offline
| Вступление Здесь пойдет речь на об оптимизации ядра 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
Спасибо за внимание! Все вопросы в эту тему
|
|
| |