Оптимізація сервера Minecraft

Оптимізація сервера Minecraft
У нашому блозі ми вже розповідалиЯк створити свій сервер Minecraft, проте з тих пір минуло 5 років і багато що змінилося. Ділимося з вами актуальними способами створення та оптимізації серверної частини такої популярної гри.

За свою 9-річну історію (якщо рахувати від дати релізу) Minecraft заробив приголомшливу кількість шанувальників і хейтерів як серед звичайних гравців, так і серед гіків. Проста концепція світу з кубиків перетворилася із звичайної розваги на універсальне середовище для спілкування та створення різних об'єктів із реального світу.

Крім будівництва, у грі є можливість створювати логічні схемиякі дозволяють реалізовувати повноцінні алгоритми всередині Minecraft. На YouTube повно вельми вражаючих роликів, де люди, доклавши величезну кількість сил і витративши багато часу, створили копію того чи іншого електронного пристрою або побудували детальну копію існуючих и вигаданих архітектурних споруд. Все обмежується лише фантазією геймера та можливостями ігрового всесвіту.


Але не будемо далі говорити про те, що саме гравці створюють, а подивимося на серверну частину програми та висвітлимо проблеми (іноді складні), які можуть виникнути в процесі роботи під навантаженням. Відразу обмовимося, що йтиметься лише про Java Edition.

Види серверів

Найпростішим варіантом є сервер, вбудований у клієнт гри. Створили світ, натиснули на одну кнопочку, і сервер став доступний по локальній мережі. Жодного серйозного навантаження такий варіант витримати не може, а тому ми не будемо його навіть розглядати.

Vanilla

Компанія Mojang Studios розповсюджує серверну частину гри у вигляді Java-додатків безкоштовно на офіційному сайті. Це дозволяє створити свій власний виділений сервер і персональний світ, зробивши його доступним для підключення будь-якої точки планети. Для тих, хто робить це вперше, є чудовий туторіал, доступний у відповідній ігровій Wiki.

Цей підхід має один серйозний недолік, а саме — відсутність можливостей «з коробки» підключати плагіни, що розширюють функціонал сервера і дозволяють не тільки автоматизувати багато процесів, а й оптимізувати продуктивність. Крім того, офіційний сервер має велике споживання оперативної пам'яті на кожного підключеного гравця.

буккіт

Створений ентузіастами на базі Vanilla-версії серверний додаток буккіт значно розширювало можливості гри за рахунок підтримки плагінів та модів (модифікацій). Воно дозволило не тільки додавати в ігровий процес нові блоки, а й виконувати різні маніпуляції, недоступні ванільному. Що цікаво, пам'яті ця програма вимагала значно менше.

Встановити Bukkit не складає особливих труднощів, відповідна інструкція є на ресурсі GamePedia. Але це немає сенсу, оскільки з 2014 року команда Bukkit розпалася, розробники проекту стали співробітниками Mojang Studios, а репозиторій покинутий. Таким чином, Bukkit фактично мертвий, і має сенс звернути увагу на два наступні проекти.

SpigotMC

Для полегшення життя розробників плагінів була потреба в API взаємодії з ігровим світом. Саме це завдання і вирішили творці Кран, взявши за основу ядро ​​Bukkit та переробивши його для досягнення кращої надійності та продуктивності. Проте, Git-репозиторій проекту було заблоковано у зв'язку із Законом про авторське право у цифрову епоху (DMCA), і завантажити звідти вихідники неможливо.

На даний момент SpigotMC активно розвивається та використовується. Він підтримує всі плагіни, створені під Bukkit, проте з ним несумісний. Щоб уникнути заборони DMCA Takedown, був придуманий елегантний спосіб під назвою BuildTools. Цей інструмент позбавляє необхідності дистрибуції скомпільованого додатка і дозволяє користувачам виконати компіляцію Spigot, CraftBukkit та Bukkit з вихідного коду. Все це робить заборону DMCA марною.

PaperMC

Здавалося б, все круто, і Spigot став чудовим варіантом. Але деяким ентузіастам цього здалося мало, і вони запиляли свій власний форк Spigot на стероїдах. на сторінці проекту ключовою гідністю зазначено, що "It's stupid fast". Розвинене ком'юніті дозволяє оперативно вирішувати питання, а розширене API — робити цікаві плагіни. Запустити PaperMC можна однією простою командою, наведеною в документації.

З сумісністю PaperMC все чудово, так що написані плагіни під SpigotMC легко запрацюють і на PaperMC, але без офіційної підтримки. Зворотна сумісність зі SpigotMC також є. Тепер, коли ми перерахували різні варіанти створення сервера, перейдемо до проблем продуктивності, які можуть виникати.

Проблеми і рішення

Головне, що треба розуміти, — все, що стосується обробки ігрового світу, оброблятиметься лише на одному обчислювальному ядрі фізичного сервера. Тож якщо раптом у вас чудовий сервер із десятком обчислювальних ядер, то завантажено буде лише одне. Всі інші фактично простоюватимуть. Така вже архітектура програми, і нічого ви з цим вдіяти не зможете. Отже, при виборі сервера слід звертати увагу не на кількість ядер, а на тактову частоту. Чим вона буде вищою, тим краще буде продуктивність.

Що стосується питання про обсяг оперативної пам'яті, тут слід виходити з таких показників:

  • запланована кількість гравців;
  • запланована кількість світів на сервері;
  • Розмір кожного світу.

Слід пам'ятати, що Java-додатку завжди потрібний запас оперативної пам'яті. Якщо ви розраховуєте на споживання пам'яті 8 гігабайт, то фактично треба мати 12. Цифри умовні, але суть від цього не змінюється.

Для запуску серверної частини рекомендуємо скористатися прапорами, зазначеними у статті Tuning the JVM – G1GC Garbage Collector Flags for Minecraft. Ця «чорна магія» дозволяє серверу грамотно налаштувати «збирач сміття» та оптимізує використання оперативної пам'яті. Не варто пам'ятати більше, ніж реально споживає сервер при піковому напливі гравців.

Генерація картки блоків

"Ви дійсно вважаєте, що Місяць існує, тільки коли ви на нього дивитеся?" (Альберт Ейнштейн)

Абсолютно новий сервер. Як тільки гравець вперше успішно підключається, ігровий персонаж з'являється на загальній точці збору (спаун). Це єдине місце, де ігровий світ заздалегідь генерується сервером. У цей момент клієнтська частина дивиться у налаштування, і ключовим параметром є дальність промальовування. Вимірюється вона у чанках (область карти 16×16 і висотою 256 блоків) Скільки чанків там зазначено, саме стільки і буде запрошено у сервера.

На сервері зберігається глобальна карта світу, і якщо в ній ще немає згенерованих блоків у точці появи ігрового персонажа, сервер їх динамічно генерує і зберігає у себе. Мало того, що це потребує великих обчислювальних ресурсів, то ще й постійно збільшує розмір карти світу. На одному із найстаріших анархічних серверів 2b2t (2builders2tools) розмір картки вже перевищив 8 Tb, а кордон світу проходить на позначці 30 млн блоків. З цим сервером пов'язані тисячі історій, і він заслуговує на окрему статтю серії статей.

Генерація світу навколо одного гравця – не проблема. Генерація світу навколо сотні гравців викличе незначні гальма сервера протягом короткого часу, після чого навантаження зменшиться. Генерація світу на дальність промальовування клієнта навколо тисячі гравців вже здатна «впустити» сервер і викидати з нього всіх клієнтів по таймууту.

У серверному програмному забезпеченні є таке значення, як TPS (Ticks per Server - тактів за секунду). Штатно 1 такт дорівнює 50 мс. (1 секунда реального світу дорівнює 20 тактам ігрового світу). Якщо обробка одного такту зросте до 60 секунд, серверний додаток буде закрито, викинувши всіх гравців.

Вихід – обмежити світ певними координатами та виконати попередню генерацію блоків. Тим самим ми знімаємо необхідність динамічної генерації в процесі гри, і сервер достатньо прочитати вже існуючу карту. Обидва питання вирішуються одним плагіном WorldBorder.

Найпростіше задати кордон світу у вигляді кола щодо точки спауна (хоча можна його зробити будь-якої форми) однією командою:

/wb set <радиус в блоках> spawn

Якщо ігровий персонаж спробує перетнути кордон, то буде відкинутий на кілька блоків назад. Якщо це зробити кілька разів за обмежений час, порушник буде примусово телепортований на точку спауна. Попередня генерація світу виконується ще простіше, командою:

/wb fill

Оскільки ця дія потенційно може торкнутися гравців, що знаходяться на сервері, не забудьте підтвердити виконання:

/wb confirm

Загалом на те, щоб згенерувати світ радіусом у 5000 блоків (~40 млрд блоків) пішло приблизно 2 години на процесорі Intel Xeon Gold 6240. Тому, якщо хочете запустити прегенерацію більшої карти, враховуйте, що цей процес займе пристойну кількість часу , а сервер TPS буде серйозно знижено. Крім того, пам'ятайте, що навіть радіус у 5000 блоків вимагатиме приблизно 2 Гб місця на дисковому накопичувачі.

Незважаючи на те, що крайня версія плагіна була розроблена для Minecraft версії 1.14, досвідченим шляхом з'ясовано, що вона чудово працює і на наступних версіях. Повний список команд із поясненнями доступний на форумі плагіна.

Проблемні блоки

Різновидів блоків у Minecraft безліч. Проте ми хотіли б зупинити увагу читачів на такому блоці, як TNT. Як випливає з назви, цей блок є вибухівкою (Примітка редакції - це ігровий предмет віртуального світу і нічого зі справжніми ВР цей предмет не має). Його особливість така, що у момент активації нею починає діяти сила гравітації. Це змушує сервер обрахувати всі координати, якщо блок починає падати.

Якщо блоків TNT кілька, то детонація одного блоку викликає детонацію та включення гравітації у сусідніх блоків, розкидаючи їх на всі боки. Вся ця гарна механіка на стороні сервера виглядає як безліч операцій з підрахунку траєкторії кожного з блоків, а також взаємодії із сусідніми блоками. Завдання вкрай ресурсомістке, що легко може перевірити кожен. Згенеруйте та підірвіть куб із блоків TNT, розміром хоча б 30x30x30. І якщо ви думали, що у вас хороший потужний ігровий комп'ютер, то дуже помилялися 😉

/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt

Оптимізація сервера Minecraft
Подібний «експеримент» на сервері з Intel Xeon Gold 6240 привів до серйозного «просідання» TPS і 80% навантаження на CPU протягом усього часу детонації блоків. А отже, якщо хтось із гравців зможе зробити подібне, то проблема з продуктивністю торкнеться всіх гравців, що знаходяться на сервері.

Ще більш жорсткий варіант Кристали Краю. Якщо TNT все ж таки вибухає послідовно, то Кристали Краю детонують все одночасно, що в теорії може взагалі зупинити роботу серверної програми.

Уникнути цього сценарію можна лише повністю заборонивши використання даних блоків в ігровому світі. Наприклад, за допомогою плагіна WorldGuard. Зверніть увагу, що сам по собі цей плагін не працює без іншого плагіна WorldEdit. Отже, встановлюєте спочатку WorldEdit, а потім WorldGuard.

Висновок

Грамотне керування ігровим сервером – завдання не з простих. Складності та зниження продуктивності чекатимуть на кожному кроці, особливо якщо не брати до уваги саму механіку ігрового процесу. Передбачити все неможливо, адже гравці часом дуже винахідливі в спробах змусити сервер виконати те, для чого він не був призначений. Тільки розумний баланс між ризиками та встановлюваними обмеженнями дозволить серверу працювати в безперервному режимі та не знижувати свою продуктивність до критичних значень.

На карантині деякі наші співробітники скучили за улюбленими офісами і вирішили відтворити їх усередині Minecraft. Ви також маєте шанс заглянути до нас у гості, не ризикуючи своїм здоров'ям і не витрачаючи час на дорогу.

Для цього ми запрошуємо всіх бажаючих на наш сервер minecraft.selectel.ru (версія клієнта 1.15.2), де відтворено дата-центри Квіткова-1 та Квіткова-2. Не забудьте погодитись зі скачуванням додаткових ресурсів, вони необхідні для коректного відображення деяких локацій.

На вас чекають квести, промокоди, «паскалки» та приємне спілкування.

Джерело: habr.com

Додати коментар або відгук