Заканчивается память сервера — общий подход к диагностике
Сервер падает по OOM, игроки жалуются на фризы раз в несколько часов, а в панели хостинга график RAM медленно ползёт вверх весь вечер — знакомая картина почти для любой игры, будь то Minecraft с горой модов, ARK с кластером карт или Rust с раздутой базой данных. Проблема в том, что "не хватает памяти" — это симптом, а не диагноз: за ним может стоять утечка в конкретном плагине, разовый пик от ивента с толпой игроков, или просто честный рост проекта, который перерос свой тариф. Ниже — методика, которая работает одинаково для любой игры: как отличить одно от другого и что делать в каждом случае, без гадания на кофейной гуще.
Содержание
- Шаг 1: посмотреть на цифры, а не на ощущения
- Шаг 2: утечка или разовый пик — как отличить по графику
- Шаг 3: диагностика утечки — сузить круг подозреваемых
- Шаг 4: диагностика пика — считать реальную потребность
- Шаг 5: swap как временная мера — и её реальные границы
- Шаг 6: когда пора увеличивать тариф, а не бороться с симптомом
Шаг 1: посмотреть на цифры, а не на ощущения
Прежде чем что-то чинить, нужно понять, сколько памяти реально используется и куда она уходит. На Linux-сервере (а подавляющее большинство игровых серверов крутится именно на Linux, даже если сама игра винда-only внутри Wine/Proton) есть три базовых инструмента.
free -h
Даёт снимок на текущий момент: сколько всего RAM, сколько занято, сколько в буферах/кэше, сколько реально свободно (available, не free — это важное отличие, free почти всегда маленький, потому что Linux агрессивно кэширует диск, и это нормально).
htop
Интерактивный монитор процессов — сортируйте по Mem% (клавиша Shift+M), чтобы увидеть, какой именно процесс жрёт больше всего. Для игрового сервера это обычно сам процесс игры (java, srcds_run, RustDedicated, ArkAscendedServer.exe под Proton и т.д.), но иногда виноват соседний процесс — бэкап-скрипт, панель управления, мониторинг-агент.
watch -n 5 'free -h'
Обновляет вывод free каждые 5 секунд — удобно смотреть за динамикой вживую, пока сервер под нагрузкой (например, во время ивента или наплыва игроков).
Если у хостинга есть встроенный график потребления RAM за последние 24-72 часа (в MAATRIX GAMES такой график есть в панели каждого сервера) — начните с него, это экономит время: форма графика сразу подсказывает, утечка перед вами или пик.
Шаг 2: утечка или разовый пик — как отличить по графику
Это ключевая развилка всей диагностики, потому что решения для утечки и для пика — разные.
Признаки утечки памяти:
- график RAM растёт монотонно, без просадок, на протяжении часов или дней;
- рестарт процесса сразу возвращает потребление к базовому уровню — и цикл роста начинается заново;
- рост не коррелирует с онлайном игроков — память растёт даже ночью, когда на сервере никого нет;
- чем дольше сервер живёт без рестарта, тем ближе он к OOM.
Признаки разового пика:
- скачок RAM привязан к конкретному событию — заход большого числа игроков одновременно, генерация нового чанка/региона карты, крафт/спавн тяжёлого объекта, ивент с боссом или массовым PvP;
- после пика память либо сама снижается (garbage collector отработал), либо остаётся на новом уровне, но дальше не растёт — то есть это новое плато, а не тренд;
- проблема воспроизводится в конкретное время (вечер пятницы, старт сезона) и не проявляется в спокойные часы.
Если сомневаетесь — постройте график на неделю. Утечка на недельном масштабе выглядит как лестница или ровный подъём; пиковая нагрузка — как отдельные зубцы на фоне ровной базовой линии.
Нужен игровой сервер?
MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.
Создать серверШаг 3: диагностика утечки — сузить круг подозреваемых
Если это утечка, дальше нужно понять, где именно она происходит: в самом ядре игры, в модах/плагинах, или в стороннем процессе на сервере.
Практический метод — бинарный поиск по нагрузке:
- Поднимите тестовый сервер (или временно отключите половину модов/плагинов на существующем, если можете себе это позволить в окно с низким онлайном) с минимальным набором — только ядро игры без сторонних дополнений.
- Понаблюдайте за памятью 30-60 минут под похожей нагрузкой (можно самому побродить по серверу или использовать бота для симуляции активности, если игра это позволяет).
- Если утечки нет — возвращайте моды/плагины пачками по 3-5 штук, каждый раз наблюдая за трендом RAM.
- Как только утечка вернулась — сужайте пачку до одного подозреваемого.
Для игр на Java (Minecraft и производные на Forge/Fabric/Paper) это особенно эффективно, потому что там утечки чаще всего дают конкретные моды с плохо написанными кэшами сущностей или незакрытыми listener'ами — подробнее про поиск конфликтующего мода можно почитать в статье про конфликт плагина с модом, методика поиска там пересекается с этой.
Дополнительно проверьте логи на характерные сообщения:
- Java:
OutOfMemoryError,GC overhead limit exceededв логе краша или консоли; - generic Linux:
dmesg | grep -i "killed process"покажет, убивал ли OOM Killer процесс и с каким PID — по логам сервера можно сопоставить время убийства с временем последнего рестарта.
dmesg -T | grep -i oom
Флаг -T выводит человекочитаемое время вместо секунд с загрузки — так проще сопоставить с логами игры.
Шаг 4: диагностика пика — считать реальную потребность
Если проблема в пиках, задача другая — понять, укладывается ли пиковая потребность в лимит тарифа с запасом, или сервер балансирует на грани постоянно.
Ориентировочно: если пиковое потребление регулярно превышает 85-90% от выделенной RAM, это уже не запас, а систематический риск OOM при малейшем дополнительном скачке (например, обновление игры, которое на старте требует чуть больше памяти на прогрев кэшей). Точные цифры зависят от игры и конфигурации — не существует универсального "безопасного" процента, но подход "меньше 90% на пике" — разумный ориентир, а не измеренный факт.
Что обычно провоцирует пики:
- Minecraft — генерация новых чанков при исследовании карты, особенно с модами, добавляющими новые измерения или биомы (world generation держит в памяти сгенерированные, но ещё не выгруженные чанки);
- ARK/Rust — одновременный вход большого числа игроков после рестарта или вайпа, когда сервер загружает данные всех подключившихся сразу;
- FiveM — скрипты, которые кэшируют данные по каждому онлайн-игроку без выгрузки при дисконнекте.
Если пики предсказуемы (например, вы знаете расписание ивента), временное решение — заранее увеличить тариф на этот период, если хостинг это позволяет, а после ивента вернуться к базовому.
Шаг 5: swap как временная мера — и её реальные границы
Swap (подкачка на диск) не решает нехватку RAM — она просто отодвигает момент OOM, платя за это скоростью. Для игрового сервера, где важна отзывчивость в реальном времени, активное использование swap означает лаги и просадки тикрейта, потому что диск на порядки медленнее оперативной памяти даже на NVMe.
Тем не менее swap полезен как страховка от жёсткого краша, пока вы разбираетесь с истинной причиной. Проверить текущий swap:
swapon --show
free -h
Если swap не настроен, добавить временный swap-файл (пример на 2 ГБ, требует root-доступа):
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
Чтобы swap выжил перезагрузку, добавьте строку в /etc/fstab:
/swapfile none swap sw 0 0
Настройте параметр vm.swappiness — он определяет, насколько агрессивно ядро уходит в swap до того, как исчерпает RAM полностью. Для игрового сервера имеет смысл снизить значение по умолчанию (обычно 60) до 10, чтобы swap использовался только как последний рубеж, а не постоянно:
sysctl vm.swappiness=10
echo "vm.swappiness=10" >> /etc/sysctl.conf
Важно: если у вас VPS с ограничением дискового пространства или тариф с NVMe-хранилищем небольшого объёма, лишний swap-файл может съесть место, нужное под мир/сохранения. Проверяйте df -h перед созданием swap-файла.
Если хостинг работает в контейнерах (LXC/Docker) без прямого доступа к ядру хоста, swap может быть недоступен вообще или настраиваться только на стороне провайдера — уточните это в панели или у поддержки, прежде чем тратить время на команды выше.
Шаг 6: когда пора увеличивать тариф, а не бороться с симптомом
После утечки-фикса или анализа пиков наступает момент честного решения: чинить дальше или расти. Вот признаки, что дело не в конфигурации, а в том, что проект перерос текущий RAM:
- вы уже прошли бинарный поиск, отключили все подозрительные моды/плагины по одному — а базовое потребление всё равно близко к лимиту даже без них;
- онлайн игроков стабильно вырос (новый сезон, реклама, вайп привлёк аудиторию) — и это постоянный, а не временный фактор;
- количество контента на сервере (сохранённые чанки, база данных экономики, количество построек/баз) органически растёт и не будет уменьшаться;
- swap используется не эпизодически, а постоянно, даже вне пиков — по
free -hвидно ненулевойSwap usedв спокойные часы.
Примерные ориентиры по RAM для базового старта (это именно ориентир, не гарантия — конкретная цифра зависит от версии игры, количества модов и онлайна):
| Игра | Стартовый онлайн | Ориентировочная RAM |
|---|---|---|
| Minecraft (Vanilla/Paper) | 10-20 игроков | 4-6 ГБ |
| Minecraft (модпак, Forge) | 10-20 игроков | 8-12 ГБ |
| Rust | 50-100 игроков | 8-16 ГБ |
| ARK: Survival Ascended | 1 карта, 30-50 игроков | 12-16 ГБ |
| CS2 | 1 сервер, 10-32 игрока | 2-4 ГБ |
Актуальный список игр и рекомендованных ресурсов по каждой — в каталоге на games.maatrix.io, там цифры подобраны под конкретную сборку.
Если вы регулярно сталкиваетесь с той или иной игрой, у нас есть отдельные разборы конкретных случаев: для Minecraft — статья про низкий TPS и лаги, для выживалок с ростом потребления памяти во времени — переполнение памяти в Project Zomboid и чрезмерное потребление памяти в Palworld — там разобраны игро-специфичные причины, которые дополняют общий подход из этой статьи. Если проблема шире, чем память — общая методика мониторинга TPS и лагов описана в статье про мониторинг TPS и лагов.
Нужен игровой сервер?
MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.
Создать серверЧастые вопросы
Сколько RAM должно оставаться свободной "про запас"?
Универсального числа нет, но как ориентир: если на пике потребление стабильно ниже 85-90% от лимита, у вас есть разумный запас на случай скачка. Если выше — риск OOM при любом неожиданном событии (обновление игры, наплыв игроков) резко растёт.
OOM Killer убил процесс сервера — как узнать, что это был именно он?
Выполните dmesg -T | grep -i oom — там будет запись с временем и PID убитого процесса. Сопоставьте время с логами игры, чтобы подтвердить совпадение.
Поможет ли просто перезапускать сервер по расписанию, если это утечка?
Как временная мера — да, рестарт сбрасывает накопленную утечку и оттягивает OOM. Но это не лечит причину: если утечка есть, она вернётся, а рестарт по расписанию (например, раз в 6-12 часов через cron) — это костыль, а не диагноз. Используйте время между рестартами, чтобы найти источник.
Нужен ли swap, если сервер работает стабильно и памяти хватает с запасом?
Небольшой swap (1-2 ГБ) как страховочная сетка не помешает почти никогда — он не используется активно, пока RAM хватает, но спасает от мгновенного краша при редком случайном пике. Просто следите, чтобы vm.swappiness был низким, а не по умолчанию.
Отличается ли диагностика для Windows-серверов (например, ARK на Windows-тарифе)?
Логика та же — снимок потребления, разделение утечки и пика, бинарный поиск по модам. Инструменты другие: вместо free/htop — Диспетчер задач или Get-Process | Sort-Object WS -Descending в PowerShell, вместо dmesg — журнал событий Windows (Event Viewer, раздел System, события Kernel-General с причиной нехватки ресурсов).