RE:NODE

Návody12 min čtení

Lagy serveru Garry's Mod a chyby Lua

Jak najít příčinu lagů na serveru Garry's Mod: čtení chyb Lua, měření nákladů addonů, profilování hooků, fyzika a limity propů, tickrate, paměť a sv.db.

3 čtenáři

Když server Garry's Mod laguje, příčinou je téměř vždy Lua - jeden addon, který dělá příliš mnoho práce v každém ticku, nebo který v každém ticku vyhazuje chybu - nebo fyzika kvůli příliš mnoha propům, které se navzájem dotýkají. Hardware je to jen zřídka a větší tarif samotný to skoro nikdy nspraví. Postup je krátký: v konzoli najdi opakující se chyby Lua a opravuj nebo odstraň addon, který je vyhazuje, během lagu změř čas snímku serveru pomocí stats, hooky proprofiluj profilerem a najdi ten drahý a pokud nic jiného viníka nepojmenuje, půl po půlce hledej v seznamu addonů na testovací kopii. Potom nastav rozumný tickrate, limity propů a noční restart, aby to zůstalo opravené. Tento průvodce prochází každý krok i s příkazy.

Kam se na serveru Garry's Mod ztrácí čas#

Server Garry's Mod počítá herní simulaci v jednom vlákně. V každém ticku - 66krát za sekundu při -tickrate 66, 33krát při -tickrate 33 - zpracuje fyziku, logiku entit a každý hook v Lua, který zaregistroval gamemode a addony, a pak pošle hráčům aktualizace. Pokud práce na jeden tick trvá déle než interval ticku (15 ms při 66 ticích), server se opožďuje a hráči to cítí jako sekání, zpožděné výstřely a trhající se propy.

Zdroj nákladůTypický příznakKde hledat
Hook v Lua dělající těžkou práci každý tickLag, který roste s počtem hráčůProfiler, půlení addonů
Chyba Lua uvnitř hookuSpam v konzoli, trvalý mírný lagKonzole, log chyb
Fyzika: mnoho propů v kontaktuLag, když někdo staví nebo se zřítí hromadaPočet propů, nastavení fyziky
Net zprávy: příliš mnoho odesláno najednouHráči se odpojují s chybami přetečeníKonzole klienta, půlení addonů
Databázové dotazy v hlavním vlákněŠpičky při připojení, smrti nebo konci kolaAddony používající SQL, velikost sv.db
Tlak na paměťPád po hodinách nebo dnechGraf paměti, 32bit vs 64bit

Pořadí je důležité. Chyby Lua se hledají nejlevněji a vyskytují se nejčastěji, takže začni u nich. Nastavení serveru Garry's Mod pokrývá základní instalaci a první diagnostický průchod; tento článek jde hlouběji.

Čtení chyb Lua#

Chyba Lua se vypíše do konzole serveru se souborem, řádkem a výpisem zásobníku:

code
[ERROR] addons/coolhud/lua/autorun/server/sv_hud.lua:42: attempt to index a nil value  1. fn - addons/coolhud/lua/autorun/server/sv_hud.lua:42   2. unknown - lua/includes/modules/hook.lua:96

Čti to odshora. První řádek říká, který soubor a řádek selhal a proč; cesta pojmenovává addon (tady coolhud, nebo název addonu z workshopu u obsahu z workshopu). Zásobník ukazuje, co ho zavolalo - hook.lua znamená, že běžel z hooku, tedy poběží znovu v dalším ticku i v tom po něm.

Běžné hlášky a co obvykle znamenají:

HláškaObvyklá příčina
attempt to index a nil valueKód předpokládal, že hráč, entita nebo tabulka existuje, a ona ne
attempt to call a nil valueChybí funkce z jiného addonu nebo odstraněné API
attempt to compare number with nilHodnota z konfigurace nebo síťová proměnná nebyla nikdy nastavena
Tried to use a NULL entity!Entita byla odstraněna, zatímco ji kód stále používal
bad argument #1 to ...Předán špatný typ, často poté, co aktualizace Garry's Mod něco změnila
stack overflowNekonečná rekurze, často dva addony, které se hookují navzájem

Z hlediska výkonu je nejdůležitější chyba uvnitř hooku, který běží každý tick. Samotný obsluhující kód chyb stojí čas, konzole se plní spamem a log roste. Jediný rozbitý addon s HUD, který vyhazuje chybu v hooku Think pro každého hráče, může stát víc než zbytek seznamu addonů dohromady.

Jak získat chyby, které si přečteš později

Živá konzole na vytíženém serveru rolují příliš rychle, než aby se dala číst. Pomáhají dvě nastavení:

garrysmod/cfg/server.cfg
con_logfile "console.log"lua_log_sv 1

con_logfile zapisuje všechno, co konzole vypíše, do souboru pod garrysmod/, a lua_log_sv 1 žádá server, aby logoval i své chyby Lua. Oba soubory rostou; mazej je nebo rotuj jednou týdně. Čtení konzole popisuje, které řádky jsou důležité a které jsou šum.

Chyby na straně klienta - v HUD, menu a efektech - se dějí na počítači každého hráče a objevují se v jeho konzoli, ne v tvé. Pokud hráči hlásí chyby, které nikdy nevidíš, požádej o snímek jejich konzole po zadání lua_log_cl 1; cesta v chybě stále pojmenovává addon.

Oprava nebo odstranění addonu s chybami#

Jakmile konzole pojmenuje addon, máš čtyři možnosti, seřazené od nejvhodnější:

  1. Aktualizuj ho. Mnoho chyb se objeví poté, co aktualizace Garry's Mod změnila API, a autor to už opravil. Addony z workshopu se aktualizují samy při restartu; starší addony v garrysmod/addons/ ne.
  2. Zkontroluj konflikt. Addon, který samostatně funguje a selhává s jiným nainstalovaným, obvykle znamená, že oba přepisují stejnou funkci nebo název hooku. Odstraň ten druhý a otestuj.
  3. Oprav si ho sám. Pokud umíš číst Lua, soubor a řádek jsou přímo tam. Kontrola nil (if not IsValid(ent) then return end) opraví velkou část chyb z praxe.
  4. Odstraň ho. Opuštěný addon, který vyhazuje chyby každý tick, nestojí za to držet. Odeber ho z kolekce nebo smaž jeho složku.

Chyby nepotlačuj tím, že všude obalíš kód do pcall. Tím chybu skryješ, ale náklady zůstanou.

Měření: stats, status a profiler#

Lag, který jsi neměřil, nespravíš. Tři nástroje, od nejlevnějšího po nejpodrobnější.

stats v konzoli serveru vypíše využití CPU, příchozí a odchozí provoz, uptime, počet změn map a snímkovou frekvenci serveru. Spusť to během lagu. Pokud je frekvence snímků pod tickratem, server to nestíhá - problém na straně serveru. Pokud je na úrovni tickratu a hráči si přesto stěžují, podívej se místo toho na jejich připojení a na net zprávy.

status vypíše hráče s jejich pingem a ztrátami. Jeden hráč se 400 ms a ztrátami je problém jeho trasy; pokud mají 400 ms všichni, je to server. Latence, jitter a ztráta paketů vysvětluje rozdíl.

Profiler ukáže, které funkce Lua spotřebovávají čas. FProfiler je dlouholetý profilovací addon pro Garry's Mod: nainstaluj ho, spusť nahrávání, když je server vytížený, po minutě ho zastav a vypíše nejdražší hooky a funkce s celkovým a průměrným časem. Ten seznam je obvykle rozhodující - jeden hook z jednoho addonu nahoře s desetinásobnou cenou oproti čemukoli jinému.

Užitečné jsou i rychlé kontroly přes lua_run z konzole serveru:

code
lua_run print(#ents.GetAll())lua_run print(#player.GetAll())lua_run print(collectgarbage("count"))

První vypíše počet entit, který na serveru sandbox nebo DarkRP ukáže, jestli se nehromadí propy. Poslední vypíše paměť Lua v kilobajtech; pokud během hodin stabilně roste a nikdy neklesne, nějaký addon ztrácí tabulky.

Cena addonu: co addon zdražuje#

Některé vzory jsou spolehlivě drahé a jejich rozpoznání ve výsledku profileru šetří čas:

  • Smyčky přes hráče nebo entity v každém ticku. Hook Think nebo Tick, který volá player.GetAll() nebo ents.FindInSphere a pro každý výsledek dělá práci. Levné při 10 hráčích, drahé při 60.
  • Časovače s drobným intervalem. timer.Create s prodlevou 0 nebo 0.01, opakující se donekonečna. Prakticky další hook na každý tick.
  • Síťování v hoocích. Posílání net zpráv všem hráčům každý tick nebo posílání velkých tabulek. Stojí šířku pásma i CPU a způsobuje odpojení kvůli přetečení.
  • Přístup k souborům a SQL v hoocích. Čtení nebo zápis souborů či sql.Query proti lokální databázi SQLite uvnitř častého hooku. Obojí blokuje herní vlákno.
  • Entity náročné na fyziku. Vozidla, lana, wire konstrukce a cokoli, co vytváří mnoho fyzikálních objektů.

Když se nic zjevného neukáže, půl po půlce. Vytvoř kopii serveru na testovací instanci, odstraň polovinu addonů a měř při stejné zátěži. Půl po půlce pokračuj, dokud lag nesleduje jediný addon. Je to zdlouhavé a je to jediná metoda, která funguje vždy.

Typický případ od začátku do konce

Roleplay server běží dobře s dvaceti hráči a se čtyřiceti se vleče. V konzoli nic. stats při špičce ukazuje, že snímková frekvence serveru padá k hodnotě kolem dvaceti při tickratu 33, takže server opravdu zaostává. Jednominutové nahrávání profilerem dá nahoru jednu funkci: hook z addonu poblíž HUD, který v každém ticku projde všechny hráče a pro každého z nich projde všechny entity, aby našel nejbližší dveře. Čtyřicet hráčů krát několik tisíc entit, 33krát za sekundu.

Na tom hooku nebylo nic rozbité. Fungoval, nevyhazoval chyby a při dvaceti hráčích stál milisekundu na tick. Při čtyřiceti hráčích se cena zčtyřnásobila, protože se oba seznamy zdvojnásobily. Oprava spočívala v tom, že se stejná kontrola spouští jednou za sekundu místo každého ticku, což konfigurace addonu dovolovala a nikdo se na ni nepodíval. Snímková frekvence se vrátila na tickrate a tarif se nezměnil.

Tak vypadá většina problémů s výkonem v Garry's Mod: ne chyba, ale práce, která roste s počtem hráčů krát počtem entit, ukrytá v addonu, který při spuštění vypadal neškodně. Profiler to najde za minuty; hádání trvá týdny.

Fyzika, propy a limity#

Fyzika běží také v každém ticku a zdražuje nelineárně: sto propů, které leží v klidu, je levných; sto propů nakupených na sobě a dotýkajících se levných není, protože se každý kontakt řeší v každém ticku. Na serverech sandbox a roleplay pochází nejhorší lag obvykle z jedné hráčovy konstrukce nebo ze záměrné hromady propů.

garrysmod/cfg/server.cfg
sbox_maxprops 150sbox_maxragdolls 5sbox_maxvehicles 2sbox_maxeffects 50sbox_maxballoons 10sbox_maxthrusters 20sbox_noclip 1

Tyto limity platí na hráče. Drž je tak nízko, jak tvůj gamemode dovolí; server sandbox s sbox_maxprops 1000 a třiceti hráči může teoreticky udržet třicet tisíc propů. Přidej v admin modu nastavení úklidu propů po odpojení nebo addon pro úklid a zvaž addon proti pádům, který zmrazí propy, když se jich najednou srazí příliš mnoho. TTT a další kolové módy uklízejí každé kolo a potřebují mnohem méně z toho. Průvodce serverem TTT se tomuto gamemodu věnuje konkrétně.

Tickrate, hibernace a paměť#

-tickrate na spouštěcím řádku určuje, kolik ticků server provede za sekundu. 66 je plynulejší; 33 půlí cenu na tick a pro roleplay a sandbox, kde na přesném míření tolik nezáleží, je pořád v pořádku. Nastav ho explicitně, nespoléhej na výchozí hodnotu.

GamemodeRozumný tickrateProč
Sandbox, DarkRP, roleplay33Mnoho entit, míření tolik nehraje roli
TTT, Murder, Prop Hunt33-66Kolové, střední počty entit
Gamemody zaměřené na boj66Záleží na míření a registraci zásahů

Zvýšení tickratu zhruba zdvojnásobí cenu CPU na tick a na server, který už zaostává, nemá žádný vliv. Nejdřív oprav náklady, pak frekvenci zvyš, pokud je rezerva. Co tick rate vlastně znamená obsahuje delší výklad.

Prázdný server Garry's Mod ve výchozím stavu hibernuje a téměř nespotřebovává CPU. sv_hibernate_think 1 ho nechá přemýšlet i prázdný, což některé addony potřebují; pokud tvůj nečinný server ukazuje stálé využití CPU, zkontroluj, jestli je to nastaveno, nebo jestli nějaký addon nespouští časovač bez ohledu na hráče.

Problémy s pamětí vypadají jinak. Standardní server Garry's Mod je 32bitový proces, takže dokáže adresovat jen asi 4 GB bez ohledu na to, kolik toho tarif má; velké kolekce na tento strop narazí a padají s chybami nedostatku paměti, zatímco graf vypadá v pořádku. Betaverze větve x86-64 toto omezení odstraňuje, za cenu nutnosti 64bitových sestavení všech binárních modulů. Lokální databáze SQLite, garrysmod/sv.db, je další pomalý únik: některé addony do ní zapisují neustále a soubor o stovkách megabajtů zpomaluje každý dotaz. Občas zkontroluj jeho velikost a vyčisti nebo přesuň data, která tam addony ukládají.

chyba pojmenuje addonžádné chybyfps pod tickratemhook pojmenuje addonnic zjevnéhoHráči hlásí lagkdy a kolik jich jeKonzoleopakující se chyby Luastatsfps serveru vs tickrateProfilerdrahé hookyPůlení addonůna testovací kopiiOpravaaktualizace, odebrání, limit
Hledání příčiny lagů v Garry's Mod

Restarty, pády a jak to udržet opravené#

I dobře vyladěný server Garry's Mod za dny nahromadí entity, časovače a paměť Lua. Noční restart v hodině, kdy je server prázdný, drží časy snímků rovné a nic nestojí. Na RE:NODE ho spouští záložka Schedules z výrazu cron, volitelně s varovným příkazem několik minut předem. Plány restartů, které pomáhají popisuje načasování.

Pády jsou samostatný problém oproti lagu. Chyba Lua server neshodí; pád způsobí binární modul, fyzikální exploze, 32bitový strop paměti nebo zastavení procesu na limitu paměti tarifu. Na RE:NODE se server, který dosáhne limitu paměti, zastaví a restartuje načisto, místo aby se nechal swapovat, a hlídač počítá neočekávané restarty - tři za hodinu vloží varování na stránku serveru a automaticky otevře tiket, takže smyčka pádů neunikne pozornosti. Proč se tvůj herní server pořád restartuje pomáhá tyto případy rozlišit.

Řešení potíží#

Konzole je plná stejné chyby Lua. Jeden addon v hooku. Přečti cestu v prvním řádku, addon aktualizuj nebo odstraň a restartuj.

Lag jen když je server plný. Náklady na hráče. Profiluj při špičce; hledej hooky, které procházejí hráče.

Špičky lagu, když se někdo připojí. Addony dělající práci s databází nebo soubory v PlayerInitialSpawn, nebo velký sv.db. Proprofiluj připojení.

Hráči se odpojují s „reliable channel overflowed“. Addon posílá příliš mnoho najednou, obvykle při spawnu. Odebírej addony, dokud to nepřestane; konzole klienta ukazuje poslední přijatou zprávu.

Server padá po hodinách, ačkoli je paměť volná. 32bitový adresní prostor. Zredukuj addony nebo přejdi na 64bitovou větev s odpovídajícími moduly.

Nečinný server využívá CPU. sv_hibernate_think 1, nebo časovač addonu běžící bez hráčů.

FAQ#

Způsobují chyby Lua lag?

Chyba, která se stane jednou, nevadí. Chyba uvnitř hooku, který běží každý tick, ano, protože obsluha chyb běží pokaždé a konzole i log se plní. Nejdřív oprav opakující se chyby.

Jaký tickrate má server Garry's Mod používat?

33 pro sandbox a roleplay, 33 až 66 pro kolové módy, 66 pro gamemody zaměřené na boj. Uveď ho explicitně na spouštěcím řádku a zvyšuj ho, až když má server při špičce rezervu CPU.

Spraví můj lag větší tarif?

Jen pokud serveru po opravě problémů s addony opravdu chybí CPU nebo paměť. Jeden drahý hook nebo hromada srážejících se propů bude lagovat na jakémkoli hardwaru. Nejdřív měř, pak dimenzuj.

Jak zjistím, který addon způsobuje lag?

Přečti v konzoli opakující se chyby a pak použij profiler, například FProfiler, když je server vytížený. Pokud ani jedno viníka nepojmenuje, odstraň polovinu addonů na testovací kopii a měř, a opakuj, dokud lag nesleduje jediný addon.

Mám provozovat 64bitový server Garry's Mod?

Pokud tvůj server padá s chybami paměti, ačkoli má tarif paměti nazbyt, ano. Nejdřív zkontroluj, že každý binární modul, který používáš, má 64bitové sestavení.


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