Майнкрафт оптимизация на сървъра

Майнкрафт оптимизация на сървъра
В нашия блог вече имаме каза, как да създадете свой собствен Minecraft сървър, но оттогава минаха 5 години и много се промени. Споделяме с вас актуални начини за създаване и оптимизиране на сървърната част на толкова популярна игра.

През своята 9-годишна история (броейки от датата на пускане), Minecraft спечели невероятен брой фенове и хейтъри сред обикновените играчи и маниаците. Простата концепция за свят, направен от блокове, еволюира от проста форма на забавление в универсална среда за комуникация и създаване на различни обекти от реалния свят.

В допълнение към конструкцията, играта има способността да създава логика, които ви позволяват да внедрявате пълноценни алгоритми в Minecraft. YouTube е пълен с много впечатляващи видеоклипове, в които хора, след като са положили огромни усилия и са отделили много време, са създали копие на това или онова електронно устройство или са създали подробно копие съществуващ и измислен архитектурни структури. Всичко е ограничено само от въображението на геймъра и възможностите на игровата вселена.


Но нека не говорим повече за това какво точно създават играчите, но нека да разгледаме сървърната част на приложението и да подчертаем проблемите (понякога много сложни), които могат да възникнат по време на работа под натоварване. Нека направим резервация веднага, че ще говорим само за изданието на Java.

Видове сървъри

Най-простият вариант е сървър, вграден в клиента на играта. Създадохме свят, натиснахме един бутон и сървърът стана достъпен през локалната мрежа. Тази опция не може да издържи сериозно натоварване и затова дори няма да я разгледаме.

ванилия

Mojang Studios разпространява безплатно сървърната част на играта като Java приложение на официалния уебсайт. Това ви позволява да създадете свой собствен специален сървър и личен свят, което го прави достъпен за връзка от всяка точка на планетата. За тези, които правят това за първи път, има страхотно урок, наличен в съответното Wiki за игри.

Този подход има един сериозен недостатък, а именно липсата на готови възможности за свързване на плъгини, които разширяват функционалността на сървъра и позволяват не само да се автоматизират много процеси, но и да се оптимизира производителността. Освен това официалният сървър има доста голяма консумация на RAM за всеки свързан играч.

Букит

Сървърно приложение, създадено от ентусиасти на базата на версията 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 „на стероиди“. На страница на проекта основното предимство е, че „Бързо е глупаво“. Разработено общност ви позволява бързо да разрешавате възникващи проблеми, а разширеният API ви позволява да създавате интересни добавки. Можете да стартирате PaperMC с една проста команда, дадена в документация.

PaperMC има отлична съвместимост, така че плъгините, написани за SpigotMC, могат лесно да работят на PaperMC, но без официална поддръжка. Налице е и обратна съвместимост със SpigotMC. Сега, след като изброихме различните опции за създаване на сървър, нека да преминем към проблемите с производителността, които могат да възникнат.

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

Основното нещо, което трябва да разберете е, че всичко, свързано с обработката на света на играта, ще се обработва само на едно изчислително ядро ​​на физическия сървър. Така че, ако изведнъж имате отличен сървър с дузина изчислителни ядра, тогава само едно ще бъде заредено. Всички останали ще бъдат практически бездействащи. Това е архитектурата на приложението и не можете да направите нищо по въпроса. Така че, когато избирате сървър, трябва да обърнете внимание не на броя на ядрата, а на тактовата честота. Колкото по-високо е, толкова по-добро ще бъде представянето.

Що се отнася до въпроса за капацитета на RAM, трябва да изхождаме от следните показатели:

  • планиран брой играчи;
  • планиран брой светове на сървъра;
  • размера на всеки свят.

Трябва да се помни, че едно Java приложение винаги се нуждае от резерв от RAM. Ако очаквате консумация на памет от 8 гигабайта, тогава трябва да имате 12. Числата са относителни, но същността не се променя.

За да стартирате сървърната част, препоръчваме да използвате флаговете, посочени в статията Настройка на флаговете на JVM – G1GC Garbage Collector за Minecraft. Тази „черна магия“ позволява на сървъра да конфигурира правилно „събирача на отпадъци“ и да оптимизира използването на RAM. Не трябва да разпределяте повече памет, отколкото сървърът действително консумира по време на пиковия приток на играчи.

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

„Наистина ли мислиш, че луната съществува само когато я гледаш?“ (Алберт Айнщайн)

Изцяло нов сървър. Веднага щом играчът се свърже успешно за първи път, персонажът на играта се появява на общата събирателна точка (спаун). Това е единственото място, където светът на играта е предварително генериран от сървъра. В същия момент клиентската част преглежда настройките, като основният параметър е разстоянието на чертане. Измерва се в парчета (площта на картата е 16×16 и височина 256 блока).Колко парчета са посочени там, точно колко ще бъдат поискани от сървъра.

Сървърът съхранява глобална карта на света и ако в нея все още няма генерирани блокове в момента на появата на игровия герой, тогава сървърът ги генерира динамично и ги съхранява. Това не само изисква големи изчислителни ресурси, но и постоянно увеличава размера на световната карта. На един от най-старите анархистки сървъри 2b2t (2builders2tools) Размерът на картата вече надхвърли 8 Tb, а границата на света е около 30 милиона блока. Има хиляди истории, свързани с този сървър и той заслужава своя собствена статия в поредицата.

Създаването на свят около един играч не е проблем. Генерирането на свят около стотици играчи ще доведе до незначително забавяне на сървъра за кратко време, след което натоварването ще намалее. Генерирането на свят в рамките на разстоянието за изобразяване на клиента около хиляда играчи вече е в състояние да „изпусне“ сървъра и да изхвърли всички клиенти от него поради изчакване.

В сървърния софтуер има стойност като TPS (Тикове на сървър - тикове в секунда). Обикновено 1 тактов цикъл е равен на 50 ms. (1 секунда от реалния свят е равна на 20 тика от света на играта). Ако обработката на една отметка се увеличи до 60 секунди, сървърното приложение ще бъде затворено, изхвърляйки всички играчи.

Решението е да се ограничи света до определени координати и да се извърши предварително генериране на блокове. По този начин ние премахваме необходимостта от динамично генериране по време на играта и сървърът ще трябва само да чете съществуваща карта. И двата проблема могат да бъдат решени с един плъгин Световна граница.

Най-лесният начин е да зададете границата на света под формата на кръг спрямо точката на хвърляне на хайвера (въпреки че можете да я направите във всякаква форма) с една команда:

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

Ако персонажът на играча се опита да пресече границата, той ще бъде отблъснат няколко блока назад. Ако това бъде направено няколко пъти в рамките на ограничено време, нарушителят ще бъде принудително телепортиран до точката на хвърляне на хайвера. Предварителното генериране на света се извършва още по-лесно, с командата:

/wb fill

Тъй като това действие може потенциално да засегне играчите на сървъра, не забравяйте да потвърдите:

/wb confirm

Общо генерирането на свят с радиус от 5000 блока (~40 милиарда блока) на процесор Intel® Xeon® Gold 2 отне приблизително 6240 часа. Следователно, ако искате предварително да генерирате по-голяма карта, имайте предвид, че този процес ще отнеме доста време и TPS на сървъра ще бъде сериозно намален. Освен това не забравяйте, че дори радиус от 5000 блока ще изисква приблизително 2 GB дисково пространство.

Въпреки факта, че най-новата версия на приставката е разработена за Minecraft версия 1.14, експериментално беше установено, че тя работи чудесно на следващите версии. Наличен е пълен списък с команди с обяснения във форума за плъгини.

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

В Minecraft има голямо разнообразие от блокове. Въпреки това бихме искали да насочим вниманието на читателите към такъв блок като TNT. Както подсказва името, този блок е експлозивен (бележка на редактора - това е игрови елемент от виртуалния свят и този предмет няма нищо с истински експлозиви). Неговата особеност е такава, че в момента на активиране върху него започва да действа силата на гравитацията. Това принуждава сървъра да изчисли всички координати, ако в този момент блокът започне да пада.

Ако има няколко блока TNT, тогава детонацията на един блок предизвиква детонация и активиране на гравитацията в съседните блокове, разпръсквайки ги във всички посоки. Цялата тази красива механика от страна на сървъра изглежда като много операции за изчисляване на траекторията на всеки блок, както и взаимодействие със съседните блокове. Задачата е изключително ресурсоемка, което всеки може лесно да провери. Генерирайте и взривете куб от TNT блокове с размер най-малко 30x30x30. И ако сте мислили, че имате добър, мощен компютър за игри, много сте се заблудили 😉

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

Майнкрафт оптимизация на сървъра
Подобен „експеримент“ на сървър с Intel® Xeon® Gold 6240 доведе до сериозен спад на TPS и 80% натоварване на процесора по време на цялото време на детонация на блока. Следователно, ако някой играч може да направи това, тогава проблемът с производителността ще засегне всички играчи на сървъра.

Още по-труден вариант - Крайни кристали. Ако TNT въпреки това експлодира последователно, тогава Edge Crystals детонират всички по едно и също време, което на теория може напълно да спре работата на сървърното приложение.

Този сценарий може да бъде избегнат само чрез пълна забрана на използването на тези блокове в света на играта. Например с помощта на приставката WorldGuard. Моля, имайте предвид, че този плъгин сам по себе си не работи без друг плъгин WorldEdit. Така че първо инсталирайте WorldEdit и след това WorldGuard.

Заключение

Правилното управление на сървър за игри не е лесна задача. Трудности и намалена производителност ще ви очакват на всяка крачка, особено ако не вземете предвид самата механика на играта. Невъзможно е да се предвиди всичко, защото играчите понякога могат да бъдат много креативни в опитите си да принудят сървъра да направи нещо, за което не е предназначен. Само разумен баланс между рисковете и установените ограничения ще позволи на сървъра да работи непрекъснато и да не намалява производителността си до критични стойности.

По време на карантина някои от нашите служители пропуснаха любимите си офиси и решиха да ги пресъздадат в Minecraft. Вие също имате шанс да ни посетите, без да рискувате здравето си или да губите време в път.

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

Очакват ви куестове, промоционални кодове, великденски яйца и приятна комуникация.

Източник: www.habr.com

Добавяне на нов коментар