Аптымізацыя сервера Minecraft

Аптымізацыя сервера Minecraft
У нашым блогу мы ўжо расказвалі, як стварыць свой сервер Minecraft, аднак з тых часоў прайшло 5 гадоў і шмат што памянялася. Дзелімся з вамі актуальнымі спосабамі стварэння і аптымізацыі сервернай часткі гэтак папулярнай гульні.

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

Апроч будаўніцтва, у гульні ёсць магчымасць ствараць лагічныя схемы, якія дазваляюць рэалізоўваць паўнавартасныя алгарытмы ўнутры Minecraft. На YouTube поўна вельмі ўражлівых ролікаў, дзе людзі, прыклаўшы велізарную колькасць сіл і выдаткаваўшы мноства часу, стварылі копію той ці іншай электроннай прылады або пабудавалі дэталёвую копію існуючых и выдуманых архітэктурных збудаванняў. Усё абмяжоўваецца толькі фантазіяй геймера і магчымасцямі гульнявога сусвету.


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

Віды сервераў

Самым простым варыянтам з'яўляецца сервер, убудаваны ў кліент гульні. Стварылі мір, націснулі на адну кнопачку, і вось сервер стаў даступны па лакальнай сетцы. Ніякай сур'ёзнай нагрузкі такі варыянт вытрымаць не можа, а таму мы не будзем яго нават разглядаць.

ваніль

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

У гэтага падыходу ёсць адзін сур'ёзны недахоп, а менавіта - адсутнасць магчымасцяў "са скрынкі" падлучаць убудовы, якія пашыраюць функцыянал сервера і дазваляюць не толькі аўтаматызаваць шматлікія працэсы, але і аптымізаваць прадукцыйнасць. Акрамя таго, у афіцыйнага сервера дастаткова вялікае спажыванне аператыўнай памяці на кожнага падлучанага гульца.

Bukkit

Створанае энтузіястамі на базе Vanilla-версіі сервернае прыкладанне Bukkit значна пашырала магчымасці гульні за кошт падтрымкі плагінаў і модаў (мадыфікацый). Яно дазволіла не толькі дадаваць у гульнявы ​​працэс новыя блокі, але і выконваць розныя маніпуляцыі, недаступныя ванільнаму ПА. Што цікава, памяці гэта дадатак патрабавала значна менш.

Усталяваць 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 блокаў) Колькі чанкаў там паказана, менавіта столькі і будзе запытана ў сервера.

На серверы захоўваецца глабальная карта свету, і калі ў ёй яшчэ няма згенераваных блокаў у пункце з'яўлення гульнявога персанажа, то сервер іх дынамічна генеруе і захоўвае ў сябе. Мала таго, што гэта патрабуе вялікіх вылічальных рэсурсаў, дык яшчэ і ўвесь час павялічвае памер карты свету. На адным са старэйшых анархічных сервераў 2б2т (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, памерам хаця б 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

Дадаць каментар