RE:NODE

Návody14 min čtení

Factorio módy a UPS na serveru s megabase

Jak se módy dostanou na server Factorio, proč musí mít všichni klienti stejný seznam, co doopravdy žere UPS a jak změřit save pomocí benchmarku v headless verzi.

6 čtenářů

Server Factorio má jedno výkonnostní číslo a tím je UPS: updaty za sekundu, cíl 60. Pod 60 běží samotná hra pomalu - pásy se pohybují pomaleji, pece taví pomaleji, hodiny v rohu se opožďují za skutečným časem - pro všechny připojené a žádná šířka pásma ani paměť to nespraví. UPS je dané tím, jak dlouho trvá jeden tick simulace na jednom jádru CPU, a módy jsou nejrychlejší způsob, jak ten tick prodloužit. Tento článek se věnuje správnému nahrání módů na headless server, pravidlu, které dostane každého (všichni klienti spouštějí totožný seznam), tomu, co skutečně spotřebovává rozpočet ticku, a tomu, jak save změřit místo hádání.

Rozhoduje UPS, ne FPS#

Factorio spouští simulaci pevnou rychlostí 60 updatů za sekundu. Server tak má 16,67 milisekundy na to, aby jednou aktualizoval každou entitu na každém povrchu. Pokud skončí za 9 ms, hra jede na 60 UPS s rezervou. Pokud mu to trvá 22 ms, jede zhruba na 45 UPS a všechno ve světě se děje na tři čtvrtiny normální rychlosti.

FPS je samostatné číslo na straně klienta: jak často tvůj počítač vykresluje svět. Headless server nemá vůbec žádný renderer, takže nemá ani FPS. Tohle je první, co je potřeba ujasnit, když někdo říká, že server laguje, protože tři běžné stížnosti mají tři různé příčiny:

  • Všechno je pomalé, všem, včetně hodin. To je UPS. Server nestíhá simulovat dost rychle.
  • Moje hra se sekává, ale továrna běží normálně. To je FPS klienta, na jeho počítači.
  • Moje postava se vrací zpátky, ostatní vypadají v pořádku. To je jeho připojení, ne server.

Stejné rozlišení se tahá celým článkem co doopravdy znamená tick rate u jiných her. Factorio je neobvyklé jen tím, že rychlost simulace a herní čas jsou jedno a totéž, takže ztráta UPS je ztráta skutečné rychlosti, ne jen plynulosti.

Protože je update smyčka prakticky jedno vlákno, UPS zvedne jen rychlejší jádro. Přidání vCPU k tarifu Factorio ti koupí rezervu na ukládání, síť a občasný úkol na pozadí, a nic víc. Je to nejjasnější případ myšlenky z článku CPU vs RAM pro herní servery: ty dvě věci nejsou zaměnitelné a úzkým hrdlem je jen jedna z nich.

Instalace módů na headless server#

Módy jsou soubory zip v adresáři mods/ instalace, pojmenované přesně Name_Version.zip - Krastorio2_1.4.0.zip, ne Krastorio2.zip ani Krastorio2 (1).zip. Verze v názvu souboru musí odpovídat verzi uvnitř info.json módu, protože podle toho Factorio řeší závislosti.

code
/opt/factorio/mods/  mod-list.json  mod-settings.dat  Krastorio2_1.4.0.zip  flib_0.15.0.zip  stdlib_1.4.6.zip

Headless verze nemá prohlížeč módů, takže jsou dvě praktické cesty. Stáhnout zipy z mods.factorio.com v prohlížeči a nahrát je, nebo - cesta, která se opravdu škáluje - sestavit seznam módů v singleplayerové hře na vlastním počítači, kde ti závislosti vyřeší správce ve hře, a pak nahrát celou složku mods. Nahrání přes SFTP nebo správce souborů je v obou případech stejná práce; SFTP a správce souborů obsahuje podrobnosti o připojení, pokud jsi to ještě nedělal.

Závislosti jsou deklarovány v info.json každého módu a server se odmítne spustit, pokud nějaká chybí, a vypíše jméno a rozsah verzí, které chtěl. Ta chyba je při instalaci módů to nejužitečnější v logu, takže ji čti, místo abys náhodně přeinstalovával. Úvodní ? v závislosti znamená volitelná, ! neslučitelná a ~ znamená, že mód je povinný, ale neovlivňuje pořadí načítání.

Módy patří do stejné složky na jakémkoli hostingu. Na RE:NODE je složka mods k dispozici od prvního spuštění a módy do ní nahraješ přímo přes SFTP nebo správce souborů v prohlížeči, který umí archivy také rozbalit na místě.

mod-list.json, verze a mod-settings.dat#

mods/mod-list.json určuje, které z přítomných zipů se skutečně načtou. Zapisuje ho hra a je bezpečné ho upravovat ručně:

mods/mod-list.json
{  "mods": [    { "name": "base", "enabled": true },    { "name": "elevated-rails", "enabled": true },    { "name": "quality", "enabled": true },    { "name": "space-age", "enabled": true },    { "name": "flib", "enabled": true },    { "name": "Krastorio2", "enabled": false }  ]}

Dvě věci stojí za povšimnutí. base je mód a v seznamu je vždy. A rozšíření Space Age se dodává jako tři samostatné módy - space-age, quality a elevated-rails - které lze zapínat nezávisle, takže server může jet s elevated rails bez zbytku.

Vypnutí módu tady není totéž co smazání zipu. Vypnuté módy se při startu stále kontrolují na konflikty verzí, ale nenačítají se. Smazání obsahového módu, který už save používá, je jiná a mnohem nebezpečnější operace, popsaná níže.

mods/mod-settings.dat obsahuje nastavení všech módů. Je to binární soubor, takže ho nejde upravit textovým editorem, a headless server nemá GUI s nastavením. Jediný rozumný způsob, jak změnit startup nastavení, je načíst totožnou sadu módů v singleplayerové hře na vlastním počítači, vše tam nastavit a nahrát výsledný mod-settings.dat. Runtime-global nastavení může admin měnit ve hře; startup nastavení nejde změnit vůbec bez restartu, protože mění prototypy.

Synchronizace módů, desyncy a pravidlo totožného seznamu#

Factorio nezná mód jen na straně klienta. Každý mód je součástí simulace - i ten, který přidává jen GUI, spouští Lua, kterou musí všechny počítače spouštět totožně - takže server a každý klient musí mít stejné módy ve stejných verzích a se stejným startup nastavením. Hra to vynucuje: nesoulad je odmítnut už při připojení se seznamem rozdílů.

Zní to hůř, než to je, protože klient to za tebe opraví. Když se hráč připojí na server s módy, hra nabídne stažení a zapnutí přesně toho, co má server, přímo z oficiálního portálu módů, a vypnutí všeho navíc. Ve dvou případech to selže: u módů, které nejsou na portálu zveřejněné - osobní skript, mód stažený z vydání na GitHubu - a u módů, které byly z portálu odstraněny po tvé instalaci. Ty se musí distribuovat ručně.

Desyncy jsou druhou stranou determinismu. Pokud se simulace jednoho počítače rozejde se serverem, Factorio to zjistí, klienta odpojí, zapíše report desyncu a donutí ho stáhnout mapu znovu. Ve vanille je to tak vzácné, že si zaslouží nahlásit jako bug. S módy je to obvykle mód, který dělá něco nedeterministického, a hra to často v logu řekne jasně - volání math.random() mimo event je neplatné právě proto, že by různé počítače dostaly různá čísla.

Pokud konkrétní mód opakovaně desyncuje jednoho hráče, užitečné informace jsou v reportu desyncu, který hra zapíše, a číst ho umí autor módu. Ze strany serveru můžeš zajistit, aby všichni měli stejné verze módů, a zabránit tomu, aby se módy aktualizovaly pod rukama - což je argument pro jejich připíchnutí, viz níže.

Co doopravdy stojí UPS#

Rozpočet ticku se spotřebuje téměř celý na aktualizaci aktivních entit. Cokoli, co spí, je skoro zadarmo; Factorio je agresivní v uspávání nečinných inserterů, strojů a pásů. Otázka tedy nikdy nezní „jak velká je moje základna“, ale „kolik věcí dělá něco každý tick“.

NákladPročCo pomáhá
Logistic robotiKaždý létající robot se aktualizuje každý tick, plus nabíjeníPásy nebo přímé vkládání ve velkém
RadaryNepřetržité skenování sektorů, za každý radarMěj dva nebo tři, ne třicet
CombinatoryKaždý se aktualizuje každý tick, vždyHodiny a západky místo počítání každý tick
Biteři a znečištěníDifuze po chunkech, hledání cest při útokuMéně, větší zdi; omez expanzi
VlakyLevné při jízdě, drahé při přepočtu trasyMéně, delších vlaků; jednodušší křižovatky
Počet entit obecněVšechno výše, znásobenéBeacony a moduly, aby méně strojů dělalo víc
Další povrchyKaždý povrch se simuluje pořádNenechávej mrtvé platformy ani nepoužívané planety

Tři z nich si zaslouží víc než řádek v tabulce.

Roboti versus pásy. Logistická síť, která přesouvá tisíc položek za sekundu pomocí robotů, dělá za tick mnohem víc práce než sada pásů přesouvající totéž, protože každý robot je samostatná entita s pozicí a stavem nabití, zatímco pásy používají vysoce optimalizovanou reprezentaci transportních linek, kde je zkomprimovaný řetěz položek skoro zdarma. Roboti jsou úžasní na stavění, na logistiku s nízkou propustností a na cokoli nepravidelného. Na hlavní bus jsou špatný nástroj. Přímé vkládání - stroj do stroje, žádný pás ani robot - je levnější než oboje.

Beacony a produktivita. Nejlevnější entita je ta, která neexistuje. Dvacet asemblerů s beacony, které vyrobí totéž co osmdesát bez nich, není jen úspora místa; je to šedesát aktualizací entit méně, šedesát inserterů méně a kratší síť pásů. Proto megabase vypadají tak, jak vypadají.

Lua v módech. Mód, který zaregistruje handler na event každého ticku a dělá v něm skutečnou práci, platí tu cenu šedesátkrát za sekundu navždy, navíc k entitám, které přidává. Overhaul packy bývají v tomhle obvykle dobře napsané; malé módy pro pohodlí jsou ty, které potichu stojí 2 ms na tick. Benchmark níže ti řekne, který z nich, protože můžeš pustit stejný save s módem a bez něj.

Měření pomocí přepínače benchmark#

Hádání je ztráta odpoledne. Headless verze umí pustit save tak rychle, jak CPU dovolí, bez klientů a bez vykreslování, a ohlásit, jak dlouho trval tick:

bash
$ cd /opt/factorio$ ./bin/x64/factorio --benchmark ./saves/world.zip \    --benchmark-ticks 2000 --benchmark-runs 3 \    --benchmark-verbose all --mod-directory ./mods

--benchmark-ticks je počet simulovaných ticků, --benchmark-runs celé měření zopakuje, abys viděl rozptyl, a --benchmark-verbose all přidá rozpis po systémech: aktualizace entit, transportní linky, circuit síť, vlaky, elektrická síť, kapaliny, roboti a zbytek. --mod-directory ti umožní ukázat na jinou složku s módy, což je přesně způsob, jak otestovat „kolik mě tenhle mód stojí“ - změř save dvakrát se dvěma složkami.

Čti průměrné milisekundy na tick proti rozpočtu 16,67 ms. Pod 10 ms je pohodlné. Mezi 12 a 16 ms server udrží 60 UPS na klidném stroji a klesne pod ně, když je na boxu zaneprázdněné něco jiného. Nad 16,67 ms už hra běží pomalu.

Dvě výhrady. Benchmark pouští save deterministicky dopředu, takže měří továrnu, ne hráče; dvanáct lidí, kteří otevírají mapu a pokládají blueprinty, přidává práci, kterou neuvidí. A benchmark na tvém vlastním desktopu vypovídá o CPU tvého desktopu, ne serveru. Pokud to jde, pusť ho na stroji, který bude mapu hostovat - konzole panelu příkaz přijme, protože je to stejná binárka.

V grafickém klientu otevírá F4 ladicí nastavení a F5 přepíná ladicí překryv, kde panel využití času ukazuje stejný rozpis po systémech živě. Při připojení k multiplayerové hře ukazuje práci tvého vlastního stroje, ale údaj UPS je sdílený.

Overhaul packy, Space Age a paměť#

Velké balíky módů mění úvahy o dimenzování úplně. Krastorio 2, Bob's a Angel's, Industrial Revolution 3, Pyanodons a různé vesmírné overhauly přidávají prototypy, recepty a často celé nové povrchy. Dopad na server je trojí: hra se při startu načítá déle, spotřeba paměti trvale stoupne a tick je dražší na entitu, protože ve hře je víc typů entit.

Space Age je oficiální verze téhle věci. Každá planeta, kterou osídlíš, je další povrch, simulovaný kdykoli je na něm cokoli aktivní, a platforma na cestě je zase další. Hra Space Age o pěti površích je blíž provozu pěti serverů než jednoho a 4-6 GB je spíš realistická než štědrá hodnota.

Paměť se chová jinak než UPS a lidé je zaměňují. Víc paměti nezvýší tvoji rychlost updatů. Koupíš si schopnost držet větší mapu, víc povrchů a víc prototypů módů, aniž by se kontejner zastavil na limitu. Factorio také při ukládání na okamžik potřebuje víc paměti než při běhu, a proto server, který je hodinu v pohodě, umře přesně při autosave. Na RE:NODE dosažení limitu paměti kontejner zastaví a čistě restartuje, místo aby swapoval, což je pro takovou hru správné chování - ale restart uprostřed ticku tě stojí všechno od posledního autosave, takže se vyplatí dimenzovat nad špičku, ne přesně na ni. Kdy upgradovat tarif je obecná verze téhle úvahy.

Než se pustíš do dlouhé hry s balíkem, zkontroluj, kterou verzi hry podporuje. Přepis na 2.0 rozbil velké množství módů a některé velké balíky se vracely dlouho; mapa založená na módu, který je pak opuštěn, je mapa, kterou nejde aktualizovat.

Jak vrátit UPS na zpomalující se server#

Zhruba v pořadí podle toho, kolik vrátí za vynaloženou práci:

  1. Nejdřív benchmark. Zjisti, který systém je drahý, než cokoli změníš. Polovina veškeré „optimalizace“ Factoria míří na špatný podsystém.
  2. Smaž přebytečné radary. Hrstka radarů pokrývajících základnu je v pořádku. Třicet rozmístěných po mapě kvůli přehledu je skutečný náklad bez herní hodnoty; použij raději pingy na mapě a pár prozkoumaných chunků.
  3. Omez nečinné roboty. Podívej se na záložku logistické sítě: roboti, kteří jsou trvale ve vzduchu, jsou ti drazí. Snížení počtu roboportů v síti nebo nahrazení vysokokapacitního spoje robotů pásem pohne ručičkou.
  4. Vypni, co nepoužíváš. Vypni expanzi nepřátel v map-settings.json nebo přejdi na pokojný režim, pokud hra s biteři není smyslem tvé hry. Difuze znečištění a hledání cest jsou na velké znečištěné mapě skutečně drahé.
  5. Dej na velké výrobní bloky beacony a moduly. Méně strojů, které dělají víc, je strukturální oprava.
  6. Podívej se na špagety z combinatorů. Aritmetika každý tick přes stovky combinatorů se sčítá. Zapoj ji za hodiny.
  7. Restartuj server týdně. Není to oprava UPS, ale drží to paměť rovnou a dává to čistý bod uložení. Zvládne to záložka Schedules - viz restarty podle plánu, které pomáhají.

A pak přestaň. Server na 60 UPS s rezervou 6 ms optimalizaci nepotřebuje a přestavba fungující základny kvůli číslu, které nikdo nepostřehne, je způsob, jak skupiny ztrácejí o mapu zájem. Optimalizuj, když hodiny ujíždějí, ne dřív.

Pokud je UPS v pořádku, ale server stále působí špatně, problém je jinde: hlučný soused na sdíleném hardwaru, síťová cesta s jitterem nebo klient, který nestíhá. První pokrývá článek sdílené CPU a hluční sousedé, druhý latence, jitter a ztráta paketů.

Aktualizace módů bez rozbití savu#

Módy na portálu se aktualizují, kdykoli to jejich autoři zveřejní, a neexistuje žádný soubor zamykající závislosti. Na serveru, na kterém záleží, ber složku s módy jako připíchnutý stav:

  1. Před jakýmkoli zásahem udělej backup savu a kopii celé složky mods. Backup, který nikdo neobnovil, je hypotéza, takže některý občas obnov - backupy, které opravdu obnovíš to obhajuje podrobně.
  2. Když to jde, aktualizuj jeden mód po druhém a přečti si jeho changelog kvůli poznámkám k migraci.
  3. Spusť server a sleduj log po celou dobu načítání. Migrační skripty běží jednou, při prvním načtení po aktualizaci, a chyby v nich jsou ty, které poškozují save.
  4. Řekni hráčům, ať se synchronizují ze serveru a neaktualizují sami z portálu, aby se verze nemohly rozejít.

Když aktualizace módu mapu opravdu rozbije, oprava je téměř vždy vrátit starý zip, ne mód odstranit. Co dělat, když aktualizace módu něco rozbije obsahuje celý postup a udržování serveru s módy v pořádku pokrývá hygienu, která ti ho ušetří.

FAQ#

Kolik módů může server Factorio provozovat?

Žádný limit neexistuje a počet je špatná míra. Padesát malých módů pro pohodlí může stát míň než jeden overhaul pack. Záleží na tom, kolik entit výsledná mapa má a kolik Lua běží každý tick, což ti přepínač benchmark řekne za minutu.

Proč je můj server na 45 UPS, když graf CPU ukazuje 40 %?

Protože graf průměruje přes jádra. Factorio používá pro simulaci jedno z nich a to je na 100 %. Přidělení čtyř jader pro jednovláknovou zátěž bude vždy vypadat nedostatečně využité, přestože je jedno jádro úplně nasycené.

Musí si hráči módy instalovat sami?

Ne, pokud jsou módy na oficiálním portálu. Po připojení klient nabídne stažení a zapnutí přesně toho, co server provozuje, a vypnutí všeho navíc. Módy z mimo portál je nutné hráčům poslat ručně.

Můžu přidat mód do mapy, která už běží?

Přidání je obvykle bezpečné; odebrání ne. Obsah nového módu se prostě objeví. Odebráním módu se trvale smaže každá entita, kterou poskytoval. Před obojím udělej backup savu a nikdy z živé mapy neodebírej overhaul pack.

Zvýší víc RAM UPS?

Ne. Paměť dovolí serveru držet větší mapu, aniž by ho systém zabil; tick nezkrátí. To dokáže jen rychlejší jádro CPU nebo levnější továrna.

Jaký je realistický cíl UPS pro velkou základnu?

Šedesát a měl bys stavět tak, abys na něm zůstal. Vážní megabaseři přijmou míň, protože honí produkční číslo, ale pro skupinu, která hraje spolu, v okamžiku zpomalení hodin hra přestane působit správně, takže ber 60 UPS jako omezení a stavěj v jeho rámci.


Komentáře

Zcela anonymně: žádný účet, žádný e-mail, žádné cookie. Ukládáme jen jméno, které napíšeš, text a čas - nic dalšího. Počet odkazů je omezený a značkování se nevykresluje.

0/2000