Свой сервер

Интернет-оптимизация Killing Floor Dedicated Server

Мощное железо и широкий канал сами по себе не гарантируют плавную игру в Killing Floor. Сервер на Unreal Engine может иметь хороший ping в браузере, но игроки все равно будут видеть рывки, скачущий ping, packet loss, "фантомные" попадания и вылеты при смене карт.

Меню игровых настроек Killing Floor Меню Game в Killing Floor, включая настройку сетевого подключения. Скриншот: PCGamingWiki.

Цель гайда - показать KF1-админам, как читать сетевую статистику, где искать узкое место и какие параметры IpDrv.TcpNetDriver действительно имеют смысл.

Коротко: что настраивать первым

СимптомЧто проверитьГде смотреть
Ping скачет у всех игроковCPU tick time, tickrate, outgoing bandwidthstat net, inject userflag 1, мониторинг CPU
Packet loss только у одного игрокамаршрут до сервера и локальную сеть игрокаtracert, PingPlotter, stat net
Packet loss у многих игроковканал сервера, redirect, tickrateсерверный мониторинг, bytes/sec, packets/sec
Попадания "не засчитываются"ping, packet loss OUT, server authoritystat net, клиентский FPS
Долгие подключенияdownloads, redirect, InitialConnectTimeoutIpDrv.TcpNetDriver, HTTP redirect

Начинайте с диагностики. Слепое повышение NetServerMaxTickRate часто делает ощущения лучше для части игроков и хуже для всех остальных.

1. Ping, latency и bandwidth

Для сетевой игры важны две разные вещи:

  • latency - задержка доставки пакета, обычно воспринимается как ping
  • bandwidth - сколько данных канал может передать за секунду

Высокая пропускная способность не означает низкий ping. Можно иметь быстрый канал и плохой маршрут до конкретного игрока. Поэтому жалобу "сервер лагает" нужно проверять не только по скорости интернета, но и по маршруту, packet loss и нагрузке сервера.

2. Tracert и маршрут до сервера

tracert server-ip-or-domain

Что искать:

  • резкий рост задержки на одном hop
  • packet loss на раннем hop - часто проблема у игрока или провайдера
  • packet loss на последнем hop - возможно, проблема у сервера или его хостинга
  • длинный международный маршрут - нормальный ping в соседней стране не гарантирует нормальный ping через океан

Для длительной проверки удобнее PingPlotter или аналогичный инструмент, потому что tracert показывает только моментальный снимок.

3. stat net: главная диагностика в игре

stat net

Важные поля:

ПолеЧто значит
Pingигровая задержка, не всегда равна ICMP ping
Channelsчисло релевантных actors, которые сервер ведет для клиента
Unordered/secпакеты, пришедшие не в том порядке
Packet loss INпотери от сервера к клиенту
Packet loss OUTпотери от клиента к серверу
Packets/secсколько пакетов идет в секунду
Bunches/secобновления actors в секунду
Bytes/secреальный поток данных
Netspeedлимит скорости подключения клиента

Packet loss должен быть 0. Разовые скачки бывают, но постоянное ненулевое значение означает, что игрок не получает или не отправляет часть игровой информации.

4. Почему F1 ping и stat net отличаются

Ping в таблице игроков и ping из stat net считаются по-разному. Клиентский FPS, tickrate сервера и момент отправки пакета влияют на результат, поэтому F1 может показывать красивую цифру, а игра все равно ощущается плохо.

Для диагностики важнее:

  • packet loss IN/OUT
  • bytes/sec относительно netspeed
  • packets/sec относительно tickrate
  • стабильность FPS клиента

Если клиентский FPS падает ниже входящих packets/sec, игрок может ощущать "невидимую потерю пакетов": статистика потерь чистая, но обработка пакетов запаздывает.

5. inject userflag 1: tickrate и CPU-time

inject userflag 1
inject userflag 0

Эта команда помогает увидеть максимальный tickrate и время последнего server tick. Используйте ее только для анализа: она создает дополнительный трафик и не нужна во время обычной игры.

net + act << 1000 / tickrate

Пример: при tickrate 50 один тик занимает 20 ms. Если сумма net + act регулярно близка к 20 ms, сервер не успевает держать такой tickrate.

6. Базовый блок IpDrv.TcpNetDriver

[IpDrv.TcpNetDriver]
AllowDownloads=True
ConnectionTimeout=15.0
InitialConnectTimeout=150.0
AckTimeout=1.0
KeepAliveTime=0.2
MaxInternetClientRate=10000
MaxClientRate=20000
SimLatency=0
RelevantTimeout=5.0
SpawnPrioritySeconds=1.0
ServerTravelPause=4.0
NetServerMaxTickRate=30
LanServerMaxTickRate=35
DownloadManagers=IpDrv.HTTPDownload
DownloadManagers=Engine.ChannelDownload

7. Что здесь действительно менять

ПараметрПрактика
MaxInternetClientRateОбычно 10000-15000; выше только если клиенты и канал стабильно тянут
MaxClientRateLAN-лимит, можно держать 20000
NetServerMaxTickRateГлавный параметр плавности и нагрузки
LanServerMaxTickRateДля LAN или закрытых низкопинговых игр
InitialConnectTimeoutУменьшайте только при конкретных проблемах с "зависшими" подключениями
RelevantTimeoutОбычно оставить 5.0
SpawnPrioritySecondsОбычно оставить 1.0
ServerTravelPauseОбычно оставить 4.0

MaxInternetClientRate ограничивает поток от сервера к клиенту. Он не исправляет плохой маршрут от клиента к серверу и не лечит packet loss OUT.

8. Tickrate: стартовые значения

Tickrate - это server FPS. Чем выше tickrate, тем чаще сервер принимает и отправляет обновления. Это может улучшить отзывчивость, но увеличивает CPU и сетевую нагрузку.

Тип сервераСтартовый tickrateКомментарий
6 игроков, обычный KF30Хороший базовый вариант
12 игроков40Проверяйте bytes/sec и packet loss
12 игроков, хорошие клиенты45-50Только если у игроков нет потерь
20 игроков50-55Нужны хороший CPU, канал и тесты
Международный сервер30-40Маршруты важнее теоретической скорости

Для heavily-modded серверов, большого числа zeds или mutators начинайте ниже. Больше actors означает больше Channels и Bunches/sec, а значит больше данных для клиентов.

9. Как понять, что tickrate завышен

Tickrate слишком высок, если:

  • Packet loss IN появляется у нескольких игроков одновременно
  • Bytes/sec регулярно упирается в Netspeed
  • ping растет во время поздних волн
  • CPU tick time приближается к бюджету тика
  • игроки с нормальным маршрутом начинают жаловаться на рывки

В таком случае снижайте NetServerMaxTickRate на 5 и повторяйте тест.

10. Windows и Linux серверы

Старые Linux-серверы Unreal/UT могли отправлять пакеты не так стабильно относительно NetServerMaxTickRate, даже когда CPU не был полностью занят.

Практический вывод:

  • не судите о сервере только по установленному NetServerMaxTickRate
  • смотрите фактические packets/sec
  • тестируйте поздние волны, а не пустой сервер
  • если Linux-инстанс ведет себя странно, сравните с Windows-инстансом на тех же настройках

На современных хостингах поведение может отличаться, но принцип диагностики остается тем же.

11. Downloads и HTTP redirect

AllowDownloads=True нужно для кастомного контента, но не стоит раздавать большие карты с игрового процесса. Когда игрок скачивает карту прямо с сервера, он конкурирует за канал с активными игроками.

[IpDrv.HTTPDownload]
RedirectToURL=https://example.com/kf-redirect/
UseCompression=True

Если после включения redirect появились ошибки версий, проверьте, что файлы на redirect полностью совпадают с файлами сервера.

12. Клиентские настройки тоже важны

Даже идеальный сервер не исправит плохой клиентский netspeed, слабый FPS или фоновые программы.

Игрокам стоит проверить:

  • фоновые загрузки, VPN, оверлеи, запись видео
  • firewall и antivirus inspection
  • драйвер сетевой карты или Wi-Fi
  • реальный маршрут до сервера
  • стабильный FPS выше входящих packets/sec

Для старого DSL/ISDN-класса соединений слишком высокий клиентский netspeed может создавать больше трафика, чем линия стабильно держит. Для современных соединений обычно достаточно серверных лимитов 10000-15000.

Рекомендуемый профиль для публичного сервера

[IpDrv.TcpNetDriver]
AllowDownloads=True
ConnectionTimeout=15.0
InitialConnectTimeout=150.0
AckTimeout=1.0
KeepAliveTime=0.2
MaxInternetClientRate=10000
MaxClientRate=20000
SimLatency=0
RelevantTimeout=5.0
SpawnPrioritySeconds=1.0
ServerTravelPause=4.0
NetServerMaxTickRate=30
LanServerMaxTickRate=35
DownloadManagers=IpDrv.HTTPDownload
DownloadManagers=Engine.ChannelDownload

Дальше поднимайте NetServerMaxTickRate постепенно: 30 -> 35 -> 40 -> 45 -> 50, каждый раз проверяя stat net, packet loss, CPU tick time и жалобы игроков.

Пример: агрессивный профиль на 30 слотов

В теме «Интернет оптимизация Dedicated Server» (форум killingfloor.ru, 2014) автор, Человек, выложил свои настройки для сильно модифицированного сервера на 30 игроков. Хост: Core i5, 16 ГБ ОЗУ, RAID 0, канал 100 Мбит/с.

[IpDrv.TcpNetDriver]
AllowDownloads=True
ConnectionTimeout=30.0
InitialConnectTimeout=15.0
AckTimeout=1.0
KeepAliveTime=0.2
MaxClientRate=60000
MaxInternetClientRate=60000
SimLatency=0
RelevantTimeout=5.0
SpawnPrioritySeconds=1.0
ServerTravelPause=4.0
NetServerMaxTickRate=70
LanServerMaxTickRate=75
DownloadManagers=IpDrv.HTTPDownload
DownloadManagers=Engine.ChannelDownload
AllowPlayerPortUnreach=False
LogPortUnreach=False
MaxConnPerIPPerMinute=5
LogMaxConnPerIPPerMin=False

Что он отметил:

  • По словам постоянных игроков, лагов стало меньше, а пинг за карту снизился в 2-4 раза. Сервер при этом ни разу не заполнялся полностью.
  • Клиенты стали потреблять больше оперативной памяти, а процессор хоста при той же нагрузке загружен сильнее.
  • Если остаётся «ползущий» пинг, InitialConnectTimeout можно опустить до 10.
  • Результат сильно зависит от конкретного сервера, поэтому значения нужно подбирать самому.

Это противоположность осторожному профилю выше: такой tickrate и rate имеют смысл только на мощном хосте с хорошим каналом, и проверять их стоит по разделу «Как понять, что tickrate завышен».