Как мой первый ивент в Minecraft пошёл не по плану

Как я провалил запуск своего первого ивента в Minecraft, а затем всё исправил со второго раза.

# Глава 1
Грядёт буря

Мы с друзьями работали над PvP ивентом в Minecraft на 60 человек. Это был простой ивент с 4 королевствами, в каждом из которых было по 15 игроков.

Всё шло не очень хорошо. У нас не хватало времени, поэтому пришлось пойти на ряд компромиссов, и по ходу дела мы наделали несколько ошибок, одна из которых вышла нам боком.

Я занимался технической стороной сервера, а также писал скрипты для ивента (с использованием Skript), в то время как мои друзья занимались сетапом для конкретных локаций с помощью командных блоков для некоторых наших актёров. Не считая того, что мы спешили и сильно нервничали, всё было нормально. Мы всё делали вовремя, и вот настал день ивента.

Перед началом ивента мы поняли, что забыли сделать глобальные барьеры, чтобы не дать игрокам проникать в королевства друг друга. Это осознание пришло за минуты до начала ивента. Мы вчетвером срочно начали строить барьеры, пока игроки зависали в лобби. За 30 секунд до старта мы закончили. Фух, это было что-то, но теперь-то всё будет хорошо… правда?

# Глава 2
Ад во плоти

Мы, актёры, заняли свои позиции в предвкушении начала чёткого ивента с чёткими диалогами и чётеньким TPS, но, увы, этому не суждено было случиться. Как только мы начали телепортировать игроков в их королевства, TPS резко упал, а MSPT взлетел в ёбанную стратосферу! Что это такое? Я дважды, нет, трижды проверил, что производительность и железо должны быть оптимальными! Даже то, что мы использовали VPS, не должно было стать проблемой, по крайней мере, не такого масштаба. Пока мои мысли метались в попытке понять, что делать дальше, я наблюдал, как TPS опустился ниже 1, а пинг людей решил присоединиться к MSPT в его путешествии в космос.

В конце концов, людей начало кикать из-за тайм-аутов, а сервер начал рассыпаться в прах. Пока это происходило, я попытался открыть отчёт Spark, может там я узнаю что идёт не так? Наивно подумал я. Конечно, он не показал ничего полезного. Количество мобов было относительно высоким, да, но это не то, что вызывает проблемы. Я смотрю на функцию, вызывающую замедление, пока интерфейс дико лагает, и вижу… ничего. Конечно, я ничего не вижу! Там лишь сказано, что обработка тика занимает хренову кучу времени, но ничего не сказано о том, где именно она занимает столько времени!

Сервер упал… Он не выдержал нагрузки. Но почему? Я знал, что железо нормальное, оно работало идеально, даже когда игроки заходили и ждали в лобби высоко в небе. Проблемы начались после того, как мы их телепортировали и прогрузили больше чанков, но что вообще могло быть причиной? У меня было мало времени на раздумья, прежде чем моя подруга по имени MommyWithBalls (не её настоящее имя) привела двух очень умных и опытных системников.

# Глава 3
Рефлексия

Я был в состоянии отчаяния. Глубоко опечаленный тем, что произошло в тот день, я слушал, как Майк и Гайд (не их настоящие имена) обсуждали, что могло стать причиной проблемы. Единственный вывод, к которому они смогли прийти после консультации со мной по поводу оптимизаций и настройки сервера, заключался в том, что виноват VPS.

"…так что тебе нужен VDS", сказал Майк, "иначе ты будешь сталкиваться с теми же проблемами! Я не сомневаюсь, что VPS всему виной, так как всё остальное выглядит нормально". Гайд говорил то же самое, хотя именно он и порекомендовал нам тот VPS, который нас подвёл. "Это всё равно очень странно…", сказал Гайд, "Я был уверен, что VPS сможет выдержать каких-то 60 игроков. Могли быть небольшие просадки TPS время от времени, но я удивлён, что всё было настолько плохо. Я никогда не видел, чтобы VPS так сильно лагал при таком малом количестве игроков".

Должен отметить, что сервер был хорошо оптимизирован для сервера Purpur. И дальность прорисовки, и дальность симуляции были установлены на 6, и всё было настроено так, чтобы выжать максимум производительности, даже более того что надо.

Теперь я был уверен, что проблема в VPS. Нам нужен был провайдер VDS, и у Майка был один на примете. Он сказал, что у HostBrr очень дешёвый и хороший VDS хостинг, и он помог нам найти отличное предложение! 9950X с 24 ГБ оперативной памяти — просто волшебно! Но прежде чем мы даже подумали об аренде этой цацы, мне нужен был план настройки, с чем они оба мне помогли.

И Майк, и Гайд разошлись каждый своей дорогой после того, как мы закончили составлять план. Мы поблагодарили MommyWithBalls за то, что она помогла нам успокоиться и позвала сисадминский отряд, чтобы проконсультировать меня. Я чувствовал себя ребёнком, я чувствовал, что ничего не знаю после разговора с ними, и это было захватывающе! Я чувствовал себя так, будто снова изучаю программирование! Но было не время радоваться осознанию того, что есть новый потолок для достижения, настало время пересмотреть и проверить план. Посмотрим…

# Глава 4
Большие планы

Вы можете пропустить эту главу, если не хотите слушать, как я болтаю об очень умных и немного сложных кампутерных штуковинах.

Помимо рутинных вещей, таких как обновление системы, настройка SSH, отключение root и тд. Были и более интересные вещи, которых я ещё не касался.

Из интересного, я знал что ZRAM это по сути, как скачивание бесплатной оперативной памяти. Он работает за счёт того, что делает определённую часть системной памяти пространством SWAP, но это не обычное пространство SWAP, потому что мы всецело даём ядру Linux понять, что пихать туда данные это хорошая идея. Вы можете подумать, что это сильно нагрузит процессор, но это не так, потому что мы собираемся использовать Святой Грааль сжатия — ZSTD! Это чрезвычайно эффективный алгоритм, который лишь немного хуже XZ по степени сжатия, но в отличие от XZ, он BLAZINGLY FAST (но он не написан на Rust). Теперь, установив его на 50%, мы, по сути, увеличили фактическую ёмкость оперативки на ~30%!

Мне также нужно было настроить XanMod Kernel и сетевой стек Google BBR. Это сделало бы пропускную способность сети намного лучше. Вы могли бы подумать, что для этого потребуются значительные танцы с бубном с моей стороны, но нет, это установка в одну строку для обоих.

После того как это будет сделано, мне просто нужно будет установить JDK Temurin и всё. Хорошо, что я использовал его на своём локальном сервере, на котором тестировал всё, прежде чем получить доступ к новому серверу… Ой, блин, нам же нужно арендовать сервер.

# Глава 5
Приобретение оборудования

После возни с невероятно раздражающими банками, нам удалось приобрести сервер. Эврика! Теперь он в моём всеобъемлющем распоряжении!

Я успешно установил на него Debian 13, запорол SSH, переустановил систему, потому что забыл пароль (дважды), и, наконец, перестал быть идиотом и заставил всё работать как следует.

Я обновил систему, проверил наличие известных уязвимостей, отключил вход по SSH для root, установил Fail2Ban, Firewall, ZRAM, XanMod и тд. И теперь у меня всё было настроено.

Хм? Майк написал сообщение, он говорит проверить железо на сервере. Я так и делаю и… Это не то железо… Ладно, без проблем, железо близко к тому, что я заказывал, но я бы всё равно хотел получить то, за которое заплатил. Я создаю тикет в поддержку, а тем временем болтаю с Майком.

Он предложил также провести проверку IP чтобы проверить насколько хорош интернет на этом звере. Он очень хорош, и, что ещё лучше, подсеть, в которой мы находимся, не заблокирована РКН! Это невероятно! Ивент был нацелен на русскоязычную аудиторию, и большинство игроков (естественно) были из России. Это означало, что нам не нужны были никакие VPN или ухищрения с обратным прокси.

Тем временем, мы ждали ответа…

# Глава 6
Потеря игроков

Многие игроки, будучи недовольными, сказали, что не придут на следующий запуск ивента, а некоторые сказали, что не смогут присутствовать из-за занятости в день следующего запуска (который должен был состояться ровно через неделю).

Это плохо, ивент зависит от баланса игроков между королевствами. Если некоторые игроки в одной команде уйдут, в то время как другие будут полными, это будет несправедливо. Нам удалось привлечь пару игроков со стороны к нашему ивенту, но этого было далеко не достаточно, чтобы компенсировать потерю игроков в одной из команд. И что самое худшее? Мы не могли просто так раскидывать игроков направо и налево в разные королевства, иначе они бы стали предателями, недовольными тем, что их забрали из сообщества их королевства из-за ухода каких-то других игроков. Нам пришлось оставить всё как есть, надеясь на лучшее.

# Глава 7
Осложнения с локацией и железом

Письмо! Поддержка ответила, что они могут начать прямо сейчас, мне просто нужно сказать, когда я буду готов. Я останавливаю сервер и отправляю сообщение. В конце дня я получаю ответ о том, что миграция на новое железо завершена, и на этот раз железо правильное! Я иду и снова всё проверяю, и… Эта подсеть в чёрном списке РКН. Это ужасно! У нас нет обратного прокси, и у нас нет ресурсов на аренду сервера для него. И даже если бы они были, сам обратный прокси должен находиться в правильном месте, чтобы пинг был хорошим.

Я лихорадочно пишу ещё один тикет.

"После миграции на новое оборудование я заметил резкое снижение скорости к российским регионам и обратно. Вот скорости [Оба отчёта]. Не могли бы вы, пожалуйста, перевести нас в старую подсеть или в ту, которая не заблокирована РКН, чтобы скорость могла быть восстановлена?"

Я получаю ещё одно сообщение, подтверждающее, что они могут это сделать. Я останавливаю сервер и прошу их начать. После того, как всё сделано, я проверяю снова, и вот оно, скорость восстановлена! Однако я иду и проверяю железо, и это не то, что я арендовал. Я спрашиваю об этом в тикете, и они говорят, что это то же самое железо, но из-за бага они не могут включить CPU Passthrough, "но это нормально", говорит Майк, "оно всего на 15-20% медленнее, чем если бы это было с CPU Passthrough". Оборудование всё ещё достаточно мощное, чтобы легко справляться с 60 людьми, поэтому я благодарю их и закрываю тикет. Я не могу рисковать потерей этой подсети.

# Глава 8
Ошибки, которые продолжают аукаться

Я закончил несколько скриптов на локальном сервере Minecraft, а затем, наконец, отправил всё это на сервер. И мы были в деле. Мы с товарищами активно работали над ивентом, следя за тем, чтобы на этот раз всё было идеально, но возникла проблема, и она не была технической…

После долгой подготовки мы закончили делать всё, что нужно было сделать. TPS был великолепен, MSPT выглядел абсолютно сексуально, а пинг был просто конфеткой. Около 50 игроков прыгали в лобби за несколько минут до начала ивента. На этот раз мы готовы.

Я и другие актёры занимаем свои места и нервно ждём. Нет, это был я, нервничал я. Наконец, после всех этих страданий, люди смогут поиграть! И вот ивент начинается, и… Стоп, что? Что с TPS? Нет, нет, нет, НЕТ, НЕТ, НЕТ, НЕТ! Проблема снова вернулась. Но почему? Мы мигрировали, это больше не может быть проблемой с железом, без шансов. Отчёт Spark показывает точно то же самое, что и в прошлый раз, когда произошла эта же катастрофа.

Я зову Гайда на помощь в отладке. Мы уменьшаем спавн мобов, настраиваем параметры, но ничего не работает. Мы копаем глубже, и один из моих друзей, ни с того ни с сего решил сломать один командный блок, и тут меня осенило. Проблемы были вызваны одним-единственным командным блоком. Мы спросили, что это за команда была такая, и он выдал что-то вроде этого:

/team join MOD @e[type=!player]

Эта конкретная команда добавляла каждую сущность в одну и ту же команду, каждый тик. И просто представьте, по всей карте были люди, у каждого из которых был свой лимит мобов. Там были тысячи мобов, и помните, это не какая-то там модная Folia, где этот процесс можно распараллелить, нет, всё это работало на одном ядре. Просто вдумайтесь. И что самое ужасное? Я был тем, кто сказал ему, что эта команда нормальная, когда меня о ней спросили. Я позволил этому случиться, Я сам создал свои ночные кошмары.

# Глава 9
Господи, пожалуйста, пусть это закончится

Пошло ли всё гладко после этого? Не совсем. Помните о пропавших игроках?

В команде с наименьшим количеством игроков было и меньше всего опытных бойцов, большинство из которых ушло из-за нашей первой неудачи. Для них это был самый неприятный опыт, и их раскатал в трубочку буквально один опытный боец из другого королевства. Мягко говоря, они были недовольны.

Кстати, об актёрах: это было единственное, что прошло гладко.

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

# Эпилог

Какова мораль этой истории? Minecraft это проклятая игра, идите играйте во что-нибудь другое LMAO XDDDDDD.

А если серьёзно, то, несмотря на вылеты, ненужные миграции железа и командный блок, которому место в аду (им всем там место, больше никогда не буду использовать командные блоки), нам всё-таки удалось это сделать. Всё было не идеально, но в конце концов мы добились своего. Эти хлопоты стоили того, так как я подарил всем этим игрокам воспоминания. Пусть и не идеально, но всё равно было в радость быть тем… нет, одним из многих людей, кто помог собрать всех этих игроков вместе. Я бы не смог этого сделать без сисадминского отряда (Майка и Гайда), MommyWithBalls и многих других, для которых я не буду придумывать фейковые имена. Спасибо вам всем за то, что дали мне эту возможность сделать что-то важное, что я не смог бы сделать в одиночку. Да будут ваши яйца благословлены!

Буду ли я продолжать делать ивенты? Ооооо, да! Но на этот раз не бесплатно, иначе я сойду с ума и мне начнёт нравиться Java.

# Бонусная глава 1
Потенциальный способ отследить командный блок

На стандартном Purpur? Забудьте. Ну, или будьте готовы принудительно выгрузить все прогруженные чанки и проверять их один за другим. Это то, что я должен был сделать, если бы с самого начала знал, что проблема в командном блоке.

Другой возможный путь это отказаться от старых, вонючих ядер на базе Paper в пользу новой модной штучки — Folia. Почему? Всё просто: там нет глобального TPS, всё разделено на регионы. Регион с лагами это проблемный регион, а значит, проблема там.

Да… Не так уж и много способов разобраться с такой проблемой. Просто не используйте командные блоки, избавьте себя от проблем, навайбкодьте плагин или что-то в этом роде, это наверняка принесёт меньше головной боли, чем попытки заставить командные блоки работать. Датапаки тоже относятся к этой категории, но они хотя бы организованы.

# Бонусная глава 2
Конфликтующие плагины

У меня были определённые трудности с тем, чтобы заставить TAB, Essentials и FlectonePulse работать вместе без конфликтов. Видите ли, все эти плагины делают больше, чем можно было бы предположить из их названия. TAB не просто управляет списком игроков, он также управляет таблицей рекордов, nametag-ами, belowname objectives и динамически создаёт и управляет командами (/team), чтобы форматировать имена. Ах да, он также форматирует имена, что делают и все остальные плагины отсюда. Видите проблему?

Мне пришлось выборочно отключить каждую конфликтующую функцию и отключить форматирование имён во всех этих плагинах, потому что для нашего ивента нам нужна была система /team. По какой-то причине это единственный способ в Minecraft раскрасить имя, дать ему префикс, суффикс и сделать некоторые другие классные вещи, например, скрывать nametag-и.