Ottimizzazione del server Minecraft

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

Nella sua storia di 9 anni (se contiamo dalla data di rilascio) Minecraft ha guadagnato un'incredibile quantità di fan e haters sia tra i giocatori comuni che tra i nerd. Il semplice concetto di un mondo di cubi è passato da un normale intrattenimento a un ambiente universale per comunicare e creare vari oggetti dal mondo reale.

Oltre a costruire, nel gioco è possibile creare circuiti logici, che consentono di implementare algoritmi completi all'interno di Minecraft. Su YouTube ci sono molti video molto impressionanti, dove le persone, dopo aver dedicato una enorme quantità di sforzi e tempo, hanno creato una copia di un certo dispositivo elettronico o costruito una replica dettagliata di e strutture architettoniche esistenti. Tutto è limitato solo dalla fantasia del giocatore e dalle possibilità dell'universo di gioco.

Guarda il video

Ma non parliamo oltre di ciò che i giocatori creano, ma diamo un'occhiata alla parte server dell'applicazione e illuminiamo i problemi (a volte piuttosto complessi) che possono sorgere durante il lavoro sotto carico. Chiariremo subito che parleremo solo della Java Edition.

Tipi di server

La soluzione più semplice è il server integrato nel client del gioco. Crei un mondo, premi un pulsante ed ecco che il server diventa disponibile sulla rete locale. Questo tipo di soluzione non può sopportare un carico serio, quindi non lo prenderemo nemmeno in considerazione.

Vanilla

La compagnia Mojang Studios distribuisce la parte server del gioco come applicazione Java gratuitamente sul sito ufficiale. Questo consente di creare il proprio server dedicato e personale mondo, rendendolo accessibile per connessioni da qualsiasi parte del pianeta. Per chi lo fa per la prima volta, c'è un ottimo tutorial, disponibile nella Wiki di gioco corrispondente.

Questo approccio ha un grande svantaggio, ovvero l'assenza di opzioni predefinite per collegare plugin che espandono le funzionalità del server, consentendo 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 collegato.

Bukkit

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

Installare Bukkit non è particolarmente difficile, ci sono istruzioni appropriate sul sito GamePedia. Tuttavia, non ha senso farlo, poiché dal 2014 il team di Bukkit si è sciolto, i sviluppatori del progetto sono diventati dipendenti di Mojang Studios, e il repository è stato abbandonato. Pertanto, Bukkit è di fatto morto e ha senso prestare attenzione ai due progetti successivi.

SpigotMC

Per semplificare la vita degli sviluppatori di plugin, era necessaria un'API per interagire con il mondo di gioco. Questo è esattamente ciò che i creatori di Spigothanno realizzato, prendendo come base il nucleo di Bukkit e rielaborandolo per ottenere una maggiore affidabilità e prestazioni. Tuttavia, Git repository del progetto è stato bloccato a causa della Legge sul copyright nell'era digitale (DMCA), e non è possibile scaricare i sorgenti da lì.

Attualmente, SpigotMC è attivamente sviluppato e utilizzato. Supporta tutti i plugin creati per Bukkit, ma non è retrocompatibile. Per aggirare il divieto del DMCA Takedown, è stata inventata una soluzione elegante chiamata BuildTools. Questo strumento elimina la necessità di distribuire un'applicazione compilata e consente agli utenti di compilare Spigot, CraftBukkit e Bukkit dai sorgenti. Tutto questo rende il divieto DMCA inutile.

PaperMC

A prima vista, tutto sembra fantastico e Spigot è diventato una scelta eccellente. Ma a qualche appassionato è sembrato troppo poco, così hanno creato un proprio fork di Spigot "sui steroidi". Sulla pagina del progetto è indicato che “è stupidamente veloce”. Una comunità sviluppata è presente. consente di risolvere rapidamente le questioni che sorgono, mentre l'API avanzata consente di creare plugin interessanti. Avviare PaperMC è possibile con un semplice comando, come indicato in documentazione.

La compatibilità con PaperMC è eccellente, quindi i plugin scritti per SpigotMC funzioneranno facilmente anche su PaperMC, anche se senza supporto ufficiale. È presente anche la retrocompatibilità con SpigotMC. Ora che abbiamo elencato le diverse opzioni per creare un server, passiamo ai problemi di prestazioni che potrebbero sorgere.

Problemi e soluzioni

La cosa principale da comprendere è che tutto ciò che riguarda l'elaborazione del mondo di gioco sarà gestito solo su un nucleo di calcolo fisico del server. Quindi, se per caso hai un eccellente server con una decina di nuclei di calcolo, solo uno sarà in uso. Gli altri rimarranno sostanzialmente inattivi. Questa è l'architettura dell'applicazione, e non puoi fare nulla al riguardo. Pertanto, quando scegli un server, dovresti prestare attenzione non al numero di nuclei, ma alla frequenza di clock. Maggiore sarà, migliore sarà la prestazione.

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

  • il numero previsto di giocatori;
  • il numero previsto di mondi nel server;
  • la dimensione di ciascun mondo.

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

Per avviare la 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 configurare correttamente il "garbage collector" e ottimizza l'uso della memoria RAM. Non dovresti allocare più memoria di quella realmente necessaria al 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)

Server assolutamente nuovo. Non appena un giocatore si connette con successo per la prima volta, il personaggio appare in un punto di raccolta comune (spawn). Questo è l'unico luogo dove il mondo di gioco viene generato previamente dal server. In quel momento, la parte client guarda nelle impostazioni e un parametro chiave è la distanza di rendering. Questa è misurata in chunk (area della mappa di 16×16 e alta 256 blocchi). Quanti più chunk ci sono indicati, tanto più ne verranno richiesti al server.

Il server conserva una mappa globale del mondo e, se non ci sono blocchi generati nel punto di apparizione del personaggio, il server li genera dinamicamente e li memorizza. Oltre a richiedere grandi risorse computazionali, aumenta anche costantemente la dimensione della mappa del mondo. Su uno dei server anarchici più antichi, 2b2t (2builders2tools) la dimensione della mappa ha già superato gli 8 Tb, e il confine del mondo si trova al valore di 30 milioni di blocchi. Questo server è legato a migliaia di storie e merita un articolo a parte in una serie di articoli.

La generazione del mondo attorno a un giocatore non è un problema. La generazione del mondo attorno a cento giocatori causerà lievi rallentamenti del server per un breve periodo, dopo di che il carico diminuirà. La generazione del mondo alla distanza di rendering del client attorno a mille giocatori è già in grado di "far cadere" il server ed espellere tutti i client per timeout.

Nel software del server esiste un valore chiamato TPS (Ticks per Server – tick al secondo). Normalmente, 1 tick corrisponde a 50 ms. (1 secondo del mondo reale corrisponde a 20 tick del mondo di gioco). Se il processamento di un tick cresce fino a 60 secondi, l'applicazione server verrà chiusa, espellendo tutti i giocatori.

La soluzione è limitare il mondo a determinate coordinate e eseguire una generazione precedente dei blocchi. In questo modo, eliminiamo la necessità di generazione dinamica durante il gioco e il server sarà in grado di leggere già la mappa esistente. Entrambi i problemi possono essere risolti con un unico plugin WorldBorder.

È più semplice definire il confine del mondo sotto forma di cerchio rispetto 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 oltrepassare il confine, verrà respinto di diversi blocchi all'indietro. Se ciò viene ripetuto più volte in un tempo limitato, il trasgressore verrà teletrasportato forzatamente al punto di spawn. La generazione preliminare del mondo si esegue ancora più facilmente con il comando:

/wb fill

Dal momento che questa azione potrebbe potenzialmente influenzare i giocatori sul server, non dimenticate di confermare l'esecuzione:

/wb confirm

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

Nonostante l'ultima versione del plugin sia stata sviluppata per Minecraft versione 1.14, è stato constatato che funziona perfettamente anche nelle versioni successive. L'elenco completo dei comandi con spiegazioni è disponibile sul forum del plugin.

Blocchi problematici

Ci sono molte varietà di blocchi in Minecraft. Tuttavia, ci piacerebbe soffermarci su un blocco, ovvero TNT. Come suggerisce il nome, questo blocco è un'esplosivo (nota della redazione - questo è un oggetto di gioco nel mondo virtuale e non ha nulla a che fare con esplosivi veri). La sua caratteristica è che, al momento dell'attivazione, inizia ad agire su di esso 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à degli altri blocchi vicini, sparpagliandoli in tutte le direzioni. Tutta questa bella meccanica lato server appare come un gran numero di operazioni di calcolo della traiettoria di ciascun blocco, così come delle interazioni con i blocchi vicini. L'operazione è estremamente dispendiosa in termini di risorse, come può verificare chiunque. Genera e fai esplodere un cubo di blocchi TNT di almeno 30x30x30. E se pensavi che il tuo potente computer da gioco fosse all'altezza, ti sbagliavi di grosso 😉

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

Ottimizzazione del server Minecraft
Un «esperimento» simile su un server con Intel® Xeon® Gold 6240 ha portato a una seria «caduta» del TPS e a un carico CPU dell'80% durante tutto il periodo di detonazione dei blocchi. Quindi, se qualcuno dei giocatori riuscisse a fare qualcosa di simile, il problema delle prestazioni riguarda tutti i giocatori presenti sul server.

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

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

Conclusione

Gestire correttamente un server di gioco è un compito non facile. Difficoltà e riduzione delle prestazioni saranno in agguato ad ogni passo, soprattutto se non si considera la meccanica del processo di gioco stesso. Prevedere tutto è impossibile, poiché i giocatori possono essere molto ingegnosi nel tentativo di far funzionare il server per scopi per i quali non è stato progettato. Solo un equilibrio ragionevole tra rischi e restrizioni imposte consentirà al server di funzionare in modo continuo senza ridurre le sue prestazioni a valori critici.

In quarantena, alcuni dei nostri dipendenti si sono mancati dei loro uffici preferiti e hanno deciso di ricrearli all'interno di Minecraft. Anche tu hai l'opportunità di farci visita, senza correre rischi per la tua salute e senza perdere tempo in viaggio.

A tal fine, invitiamo tutti gli interessati sul 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, sono necessarie per la corretta visualizzazione di alcune location.

Ti aspettano missioni, codici promozionali, «easter egg» e piacevoli conversazioni.

Fonte: habr.com

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