Folia: multithreaded Minecraft, en waarom het (nog) niet voor jou is
Folia is een experimentele fork van Paper die de geladen wereld opdeelt in regio's en elke regio op een eigen thread tickt. Vanilla Minecraft en Paper verwerken de hele wereldtick op een enkele thread, twintig keer per seconde, en daarom weegt de kloksnelheid van een core zwaarder dan het aantal cores. Folia breekt de meeste bestaande plugins en levert alleen winst op als spelers ver uit elkaar zitten: voor vrijwel elke server onder de honderden gelijktijdige spelers is Paper de betere keuze.
Waarom tickt Minecraft op een enkele thread?
Een Minecraft-server draait een lus die twintig keer per seconde de complete wereld bijwerkt: mobs bewegen, redstone schakelt, water stroomt, hoppers verplaatsen items en chunks worden geladen en weggeschreven. Er is dus ongeveer vijftig milliseconde per tick. Past het werk daar niet in, dan zakt de TPS en voelt alles stroperig: klokken lopen achter, farms leveren minder op, hoppers kruipen.
Dat het op een enkele thread gebeurt volgt uit hoe de spelwereld in elkaar zit: alles hangt met alles samen en de volgorde doet ertoe. Een minecart voert een hopper, die hopper vult een kist die een comparator uitleest, die comparator schakelt weer redstone. Doe je dat op twee threads tegelijk, dan krijg je races: twee threads die hetzelfde item pakken, of een chunk die half wordt opgeslagen terwijl hij nog verandert. Daar liepen servers vroeger op stuk.
Paper heeft daarom niet de tick zelf parallel gemaakt maar het werk eromheen: chunkgeneratie, chunk-I/O en netwerkverkeer draaien grotendeels naast de hoofdthread. Dat levert samen met honderden prestatiepatches boven Spigot een stabielere TPS op, zonder dat je een plugin kwijtraakt.
Waarom is kloksnelheid belangrijker dan het aantal cores?
Omdat de zwaarste taak, de wereldtick, hoe dan ook op een enkele core landt en daar binnen vijftig milliseconde klaar moet zijn. Een processor met meer cores maakt die ene tick geen milliseconde sneller; een processor die per core sneller is wel. Extra cores zijn niet nutteloos, want chunk-I/O, netwerk en de garbage collector gebruiken ze, maar ze redden je TPS niet.
Daarom staat bij ons naast de budgetlijn op AMD EPYC 7443P ook een premiumlijn op de AMD Ryzen 9 9950X. Veel cores zijn prima voor meerdere servers naast elkaar; een hogere kloksnelheid wint zodra een enkele wereld het zwaar krijgt. Meer RAM lost dit niet op: RAM bepaalt hoeveel er in het geheugen past, niet hoe snel een tick klaar is. Wat wel helpt staat in ons artikel over je Minecraft-server optimaliseren en lag verminderen.
Wat doet Folia anders?
Folia deelt de geladen wereld op in regio's: groepen chunks die dicht genoeg bij elkaar liggen om elkaar te kunnen beïnvloeden. Elke regio krijgt een eigen ticklus en draait op een eigen thread uit een threadpool. Twee spelers die duizenden blokken uit elkaar bouwen zitten in twee losse regio's, en die tikken echt tegelijkertijd op twee cores.
Regio's liggen niet vast: lopen twee spelers naar elkaar toe, dan smelten hun regio's samen tot een regio op een thread, en gaan ze weer uit elkaar dan splitst het weer. Zie Folia als een handvol mini-servers in een enkel proces. Zolang ze los van elkaar staan schaalt het mee met het aantal cores; zodra ze samensmelten ben je terug bij een enkele thread.
Waarom breekt Folia de meeste plugins?
De hele Bukkit-, Spigot- en Paper-API gaat ervan uit dat er precies een hoofdthread bestaat. Plugins plannen hun werk met Bukkit.getScheduler().runTask(...) en mogen daarna veilig elk blok, elke speler en elke entity aanraken. In Folia bestaat die ene hoofdthread niet meer: er zijn schedulers per regio, per entity en een globale, en een plugin mag alleen aanraken wat bij zijn eigen regio hoort.
Dat is geen configregel die je omzet, maar herschrijfwerk in de plugin zelf. Gebeurt dat niet, dan is de prettige uitkomst een foutmelding bij het opstarten. De vervelende is dat een plugin lijkt te werken en ondertussen data door elkaar husselt: claims die verdwijnen, dubbele items, logboeken die niet kloppen. Ga er vanuit dat een plugin niet werkt tot je een build ziet die Folia expliciet ondersteunt. Vaste namen uit ons overzicht van de beste Minecraft-plugins, zoals EssentialsX, LuckPerms en CoreProtect, zijn geschreven tegen het klassieke Paper-model.
Draai je een modpack in plaats van plugins, dan speelt Folia sowieso niet: All the Mods 10 draait op NeoForge, een ander spoor dan een Paper-fork.
Waarom helpt Folia alleen bij verspreide spelers?
Parallel draaien kan alleen als er iets te verdelen valt. Staan al je spelers bij de spawn, in een lobby of bij hetzelfde bossgevecht, dan is dat een regio, dus een thread. Folia doet dan wat Paper ook doet, met het regiobeheer als extra kosten erbovenop, en je kunt langzamer uitkomen dan waar je begon. Grofweg:
- Past goed: grote survival- of anarchyservers met een enorme map, waar spelers in hun eigen hoek bouwen en elkaar zelden tegenkomen.
- Past slecht: minigames, KitPvP, lobby's, spawn-gerichte SMP's, eventservers en alles waar spelers juist naar elkaar toe trekken.
- Past slecht: een enkele zware bron van lag, zoals een gigantische mobfarm. Die zit in een regio en dus op een thread, net als op Paper.
Paper, Purpur, Pufferfish of Folia: wat kies je?
| Software | Basis | Plugins | Waarvoor |
|---|---|---|---|
| Paper | Fork van Spigot | Volledig Bukkit- en Spigot-compatibel | De standaardkeuze voor vrijwel elke server |
| Purpur | Fork van Paper | Volledig Paper-compatibel | Extra configuratie-opties en optionele features, zoals berijdbare mobs en instelbare mob-AI |
| Pufferfish | Fork van Paper | Volledig Paper-compatibel | Zit qua doel tussen Paper en Purpur in |
| Folia | Fork van Paper, regio-gebaseerd multithreaded | Breekt de meeste bestaande plugins | Experimenteel, voor zeer hoge spelersaantallen die verspreid zitten |
De bovenste drie zijn uitwisselbaar: je ruilt Paper in voor Purpur en morgen weer terug, zonder je pluginmap aan te raken. Folia staat apart.
Wat doe je beter eerst?
In verreweg de meeste gevallen ligt de oorzaak van de lag ergens anders. Loop dit af voordat je aan experimentele software begint.
- Meet met spark. Draai een profiel tijdens de drukte en kijk waar de tick heen gaat. Meestal is het een plugin, een opeenhoping van entities of een chunkprobleem, niet het gebrek aan threads.
- Zet view-distance en simulation-distance realistisch. Dit is de goedkoopste winst die er is, zeker met veel spelers tegelijk online.
- Ruim entities en items op. ClearLagg of de limieten in de Paper-configuratie schelen vaak meer dan een hardware-upgrade.
- Snoei in je plugins. Elke plugin die in elke tick iets doet kost tickbudget, ook als niemand hem gebruikt.
- Splits op achter een proxy. Lobby, survival en minigames als losse processen, elk met een eigen hoofdthread op een eigen core, met BungeeCord of Velocity ervoor.
Die laatste stap doet in de praktijk wat Folia belooft, met plugins die het gewoon doen; hoe zo'n opzet werkt staat in onze uitleg over Minecraft-server hosting. Bij ons begint een 512 MB BungeeCord-proxy op 0,50 euro per maand en betaal je de servers eronder per GB RAM: op de budgetlijn 1,10 euro per GB, bij de grotere pakketten iets minder, zoals bij Minecraft-hosting bij MC-Node.
Wanneer wordt Folia wel zinvol?
Er is een duidelijk profiel waarvoor Folia is gebouwd. Het wordt interessant zodra al deze punten kloppen.
- Je gaat richting de honderden gelijktijdige spelers op een enkele wereld en opsplitsen past niet bij het concept.
- Die spelers zitten van nature verspreid over een grote map, niet gebundeld rond spawn of een arena.
- Je pluginlijst is kort of zelfgeschreven, zodat je de code kunt aanpassen aan de schedulers van Folia.
- Er zit iemand in je team die Java kan schrijven, want je komt problemen tegen die nog niemand voor je heeft opgelost.
- Je accepteert brekende wijzigingen, weinig documentatie en soms wachten op een nieuwe Minecraft-versie.
Zet je die stap, doe het dan naast je bestaande server en niet erop: kopieer je wereld naar een testserver en houd je back-ups bij de hand. Is de TPS met dezelfde spelers niet beter dan op Paper, dan zaten ze te dicht op elkaar en heb je vooral complexiteit gekocht. Voor de meeste servers blijft het antwoord Paper, met een snelle core en een opgeruimde configuratie.
Veelgestelde vragen
Werken EssentialsX, WorldGuard en CoreProtect op Folia? Alleen als er een build is die Folia expliciet ondersteunt. De Bukkit-API gaat uit van een enkele hoofdthread, dus zo'n plugin moet herschreven zijn, niet hercompileerd. Ga er vanuit dat het niet werkt: een plugin die stilletjes doorwerkt kan data beschadigen.
Wordt mijn server met dertig spelers sneller van Folia? Nee. Met dertig spelers zit je ver onder de schaal waarvoor Folia bedoeld is, en zit de lag vrijwel altijd in een plugin, in entities of in je view-distance. Meet met spark en blijf op Paper of Purpur.
Hoeveel cores heb je nodig voor Folia? Extra cores tellen bij Folia mee, maar alleen tot het aantal regio's dat tegelijk actief is. Zitten al je spelers bij elkaar, dan is er een regio en gebruikt Folia effectief een core, net als Paper. Veel cores, zoals op de AMD EPYC 7443P, helpen pas als de activiteit verspreid is.
Wat is het verschil tussen Purpur en Folia? Purpur is een fork van Paper met extra configuratie-opties en optionele features, zoals berijdbare mobs en instelbare mob-AI, en blijft volledig plugincompatibel. Folia is experimenteel, tickt de wereld in regio's over meerdere threads en breekt daarbij de meeste plugins.
Helpt Folia tegen lag van een grote mobfarm of redstonemachine? Nee, want zo'n bouwwerk staat op een plek en valt dus binnen een regio, die op een enkele thread tickt. Daar heb je meer aan een hogere kloksnelheid, zoals op de AMD Ryzen 9 9950X, en aan het aanpassen van de farm zelf.