Ottimizzazione del server Minecraft

Ottimizzazione del server Minecraft
Nel nostro blog abbiamo già parlavano, come creare il proprio server Minecraft, tuttavia sono passati 5 anni e molte cose sono cambiate. Condividiamo con voi modi attuali per creare e ottimizzare la parte server di questo popolare gioco.

Nella sua storia di 9 anni (se si conta dalla data di rilascio), Minecraft ha guadagnato un numero straordinario di fan e detrattori sia tra i normali giocatori che tra i geek. La semplice concezione di un mondo di cubi è passata da un intrattenimento comune a un ambiente universale per comunicare e creare vari oggetti del mondo reale.

Oltre alla costruzione, nel gioco c'è la possibilità di creare circuiti logici, che consentono di realizzare algoritmi completi all'interno di Minecraft. Su YouTube ci sono molti video piuttosto impressionanti, in cui le persone, dedicando enormi sforzi e tempo, hanno creato una copia di un dispositivo elettronico o una riproduzione dettagliata di esistenti e immaginari monumenti architettonici. Tutto è limitato solo dalla fantasia del giocatore e dalle possibilità dell'universo di gioco.

Riproduci video

Ma non parliamo oltre di cosa creano i giocatori, ma guardiamo alla parte server dell'applicazione e affrontiamo i problemi (a volte piuttosto complessi) che possono sorgere durante il lavoro sotto carico. Precisamente, parleremo solo della Java Edition.

Tipi di server

La soluzione più semplice è un server incorporato nel client di gioco. Crei un mondo, premi un pulsante e voilà, il server diventa accessibile sulla rete locale. Questa opzione non può gestire carichi significativi, quindi non la prenderemo in considerazione.

Vanilla

La Mojang Studios distribuisce la parte server del gioco come applicazione Java gratuitamente sul sito ufficiale. Questo consente di creare il proprio un server dedicato e mondo personale, rendendolo accessibile per connettersi da qualsiasi punto del pianeta. Per coloro che lo fanno per la prima volta, c'è una fantastica tutorial, disponibile nella relativa Wiki di gioco.

Questo approccio ha un serio svantaggio, ossia la mancanza di possibilità di collegare plugin «out of the box» che espandono la funzionalità del server e permettono non solo di automatizzare molti processi, ma anche di ottimizzare le prestazioni. Inoltre, il server ufficiale consuma una quantità significativa di memoria RAM per ogni giocatore connesso.

Bukkit

Un'applicazione server creata da appassionati basata sulla versione Vanilla Bukkit ampliava notevolmente le possibilità del gioco grazie al supporto di plugin e mod (modifiche). Ha permesso di aggiungere nuovi blocchi al gameplay e di eseguire varie manipolazioni non disponibili nel software vanilla. Curiosamente, questa applicazione richiedeva significativamente meno memoria.

Installare Bukkit non è difficile, le istruzioni corrispondenti sono disponibili sul sito GamePedia. Ma non ha senso, poiché dal 2014 il team di Bukkit si è sciolto, gli sviluppatori del progetto sono diventati dipendenti di Mojang Studios, e repository è stato abbandonato. Pertanto, Bukkit è di fatto morto e ha senso prestare attenzione ai due progetti successivi.

SpigotMC

Per semplificare la vita agli sviluppatori di plugin, è emersa la necessità di un API per interagire con il mondo di gioco. Questo è precisamente il compito che si sono posti i creatori Spigot, partendo dal nucleo di Bukkit e rielaborandolo per migliorare l'affidabilità e le prestazioni. Tuttavia, repository Git il progetto è stato bloccato a causa del Digital Millennium Copyright Act (DMCA), e i codici sorgente non possono essere scaricati.

Attualmente, SpigotMC è in continua evoluzione e viene attivamente utilizzato. Supporta tutti i plugin creati per Bukkit, ma non è retrocompatibile. Per aggirare il divieto del DMCA Takedown, è stata ideata una soluzione elegante chiamata BuildTools. Questo strumento elimina la necessità di distribuire l'applicazione compilata e consente agli utenti di compilare Spigot, CraftBukkit e Bukkit dai codici sorgente. Tutto ciò rende il divieto del DMCA inutile.

PaperMC

Sembra che tutto vada per il meglio e Spigot sia un'ottima scelta. Ma per alcuni appassionati, questo non era abbastanza, e hanno creato il proprio fork di Spigot “potenziato”. Il pagina del progetto principale vanto è che “è incredibilmente veloce”. Una comunità ben sviluppata comunità consente di risolvere rapidamente le questioni emergenti, mentre l'API avanzato consente di creare interessanti plugin. Avviare PaperMC è possibile con un semplice comando, riportato in documentazione.

PaperMC si distingue per la sua ottima compatibilità, quindi i plugin sviluppati per SpigotMC funzioneranno facilmente anche su PaperMC, sebbene senza supporto ufficiale. È presente anche la retrocompatibilità con SpigotMC. Adesso che abbiamo elencato diverse opzioni per creare un server, passiamo ai problemi di performance che potrebbero sorgere.

Problemi e soluzioni

La cosa principale da capire è che tutto ciò che riguarda l'elaborazione del mondo di gioco verrà gestito solo da un singolo core computazionale del server fisico. Quindi, se avete un ottimo server con una dozzina di core, solo uno sarà attivo. Gli altri rimarranno praticamente inattivi. Questa è l'architettura dell'applicazione e non c'è modo di cambiarla. Pertanto, nella scelta del server, è necessario prestare attenzione non al numero di core, ma alla frequenza di clock. Maggiore è, migliore sarà la performance.

Per quanto riguarda la questione della quantità di RAM, bisogna considerare i seguenti indicatori:

  • il numero previsto di giocatori;
  • il numero previsto di mondi sul server;
  • la dimensione di ogni mondo.

È importante ricordare che un'applicazione Java ha sempre bisogno di un margine di RAM. Se prevedi un consumo di 8 gigabyte, in realtà dovresti avere 12. Questi numeri sono indicativi, ma il concetto rimane lo stesso.

Per l'avvio della parte server, ti consigliamo di utilizzare i flag indicati nell'articolo Tuning the JVM – G1GC Garbage Collector Flags for Minecraft. Questa "magia nera" consente al server di ottimizzare il "garbage collector" e migliora l'uso della RAM. Non bisognerebbe assegnare più memoria di quella realmente consumata dal server durante i picchi di accesso dei giocatori.

Generazione della mappa dei blocchi

“Credi davvero che la Luna esista solo quando la guardi?” (Albert Einstein)

Un server completamente nuovo. Quando un giocatore si connette per la prima volta con successo, il personaggio appare in un punto di raccolta comune (spawn). Questo è l'unico luogo dove il mondo di gioco viene generato in anticipo dal server. In quel momento, il client verifica le impostazioni, e un parametro chiave è la distanza di rendering. Questa viene misurata in chunk (un'area della mappa di 16x16 con un'altezza di 256 blocchi). Il numero di chunk specificato sarà esattamente quello richiesto al server.

Il server immagazzina una mappa globale del mondo, e se non ci sono ancora blocchi generati nel punto di apparizione del personaggio, il server genera dinamicamente e salva questi blocchi. Non solo questo richiede enormi risorse di calcolo, ma aumenta anche continuamente la dimensione della mappa del mondo. Su uno dei più antichi server anarchici, 2b2t (2builders2tools) la dimensione della mappa ha già superato gli 8 Tb, e il confine del mondo si estende fino a 30 milioni di blocchi. Questo server è legato a migliaia di storie e merita un articolo a parte, o meglio, una serie di articoli.

La generazione del mondo attorno a un singolo giocatore non è un problema. Tuttavia, la generazione del mondo attorno a centinaia di giocatori causerà brevi rallentamenti del server per un breve periodo, dopo di che il carico si ridurrà. La generazione del mondo alla distanza di rendering del client attorno a mille giocatori può già "abbattere" il server e disconnettere tutti i client per timeout.

Nella software del server esiste un valore chiamato TPS (Ticks per Server — tick al secondo). Di default, 1 tick equivale a 50 ms. (1 secondo del mondo reale corrisponde a 20 tick del mondo di gioco). Se il tempo di elaborazione di un tick aumenta fino a 60 secondi, l'applicazione server verrà chiusa, disconnettendo tutti i giocatori.

La soluzione consiste nel delimitare il mondo con coordinate specifiche e fare una generazione preliminare dei blocchi. In questo modo non è necessaria la generazione dinamica durante il gioco, e al server basterà leggere la mappa già esistente. Entrambi i problemi possono essere risolti con un unico plugin. WorldBorder..

È più semplice definire il confine del mondo come un cerchio attorno al punto di spawn (anche se può essere di qualsiasi forma) con un solo comando:

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

Se un personaggio di gioco tenta di attraversare il confine, verrà respinto di diversi blocchi all'indietro. Se questa operazione è ripetuta più volte in un breve periodo, il trasgressore verrà forzato a teletrasportarsi al punto di spawn. La generazione anticipata del mondo avviene in modo ancora più semplice, con il comando:

/wb fill

Poiché questa azione potrebbe potenzialmente influenzare i giocatori sul server, assicurati di confermare l'esecuzione:

/wb confirm

In totale, per generare un mondo con un raggio di 5000 blocchi (~40 miliardi di blocchi) ci sono volute circa 2 ore su un processore Intel® Xeon® Gold 6240. Pertanto, se desideri avviare la pregenerazione di una mappa più grande, considera che questo processo richiederà un bel po' di tempo e il TPS del server sarà seriamente ridotto. Inoltre, ricorda che anche un raggio di 5000 blocchi richiederà circa 2 GB di spazio di archiviazione.

Sebbene l'ultima versione del plugin sia stata sviluppata per Minecraft versione 1.14, è stato dimostrato empiricamente che funziona perfettamente su versioni successive. Un elenco completo dei comandi con spiegazioni è disponibile sul forum del plugin.

Blocchi problematici

Ci sono moltissime varietà di blocchi in Minecraft. Tuttavia, vorremmo attirare l'attenzione dei lettori su un blocco, ovvero TNT. Come suggerisce il nome, questo blocco è un'esplosivo (nota della redazione — si tratta di un oggetto di gioco del mondo virtuale e non ha alcun legame con esplosivi reali). La sua particolare caratteristica è che, nel momento in cui viene attivato, inizia a subire la forza di gravità. Questo costringe il server a calcolare tutte le coordinate, se in quel momento il blocco inizia a cadere.

Se ci sono più blocchi di TNT, la detonazione di un blocco provoca la detonazione e l'attivazione della gravità sui blocchi vicini, sparpagliandoli in tutte le direzioni. Tutta questa bella meccanica sul lato del server appare come un numero elevato di operazioni di calcolo della traiettoria di ciascun blocco e delle interazioni con i blocchi circostanti. Si tratta di un compito estremamente dispendioso in termini di risorse, che chiunque può facilmente verificare. Genera e fai esplodere un cubo di blocchi TNT di almeno 30x30x30. E se pensavi di avere un buon computer da gioco potente, ti sbagliavi di grosso 😉

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

Ottimizzazione del server Minecraft
Un simile «esperimento» su un server con Intel® Xeon® Gold 6240 ha portato a un grave «cedimento» del TPS e a un carico CPU dell'80% durante l'intera detonazione dei blocchi. Pertanto, se uno dei giocatori dovesse riuscire a eseguire un'operazione simile, il problema delle prestazioni interesserebbe tutti i giocatori presenti sul server.

Una variante ancora più severa — Cristalli del Credo. Se la TNT esplode in sequenza, i Cristalli del Credo detoneranno tutti simultaneamente, il che in teoria potrebbe fermare completamente l'applicazione server.

Evitare questo scenario è possibile solo vietando completamente l'uso di questi blocchi nel mondo di gioco. Ad esempio, utilizzando il plugin WorldGuard. Si noti che questo plugin da solo non funziona senza un altro plugin WorldEdit. Quindi installate prima WorldEdit, poi WorldGuard.

Conclusione

Gestire un server di gioco in modo efficace è un compito complesso. Difficoltà e riduzioni delle prestazioni possono sorgere ad ogni passo, specialmente se non si considera la meccanica del gioco. Prevedere tutto è impossibile, poiché i giocatori a volte possono essere molto ingegnosi nel cercare di far funzionare il server per scopi non previsti. Solo un equilibrio ragionevole tra rischi e limitazioni imposte permetterà al server di operare in modo continuo senza ridurre le proprie prestazioni a livelli critici.

Durante la quarantena, alcuni dei nostri dipendenti hanno sentito la mancanza dei loro amati uffici e hanno deciso di ricrearli all'interno di Minecraft. Anche tu hai l'opportunità di venirci a trovare, senza rischiare la tua salute e senza perdere tempo in viaggio.

Per questo motivo, invitiamo tutti a unirsi al nostro server minecraft.selectel.ru (versione client 1.15.2), dove sono stati ricreati i data center Fiore-1 e Fiore-2. Non dimenticare di accettare il download di risorse aggiuntive, poiché sono necessarie per la corretta visualizzazione di alcune località.

Ti aspettano quest, codici promozionali, "easter egg" e piacevoli conversazioni.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster