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říznak | Kde hledat |
|---|---|---|
| Hook v Lua dělající těžkou práci každý tick | Lag, který roste s počtem hráčů | Profiler, půlení addonů |
| Chyba Lua uvnitř hooku | Spam v konzoli, trvalý mírný lag | Konzole, log chyb |
| Fyzika: mnoho propů v kontaktu | Lag, když někdo staví nebo se zřítí hromada | Počet propů, nastavení fyziky |
| Net zprávy: příliš mnoho odesláno najednou | Hráč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 kola | Addony používající SQL, velikost sv.db |
| Tlak na paměť | Pád po hodinách nebo dnech | Graf 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:
[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áška | Obvyklá příčina |
|---|---|
attempt to index a nil value | Kód předpokládal, že hráč, entita nebo tabulka existuje, a ona ne |
attempt to call a nil value | Chybí funkce z jiného addonu nebo odstraněné API |
attempt to compare number with nil | Hodnota 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 overflow | Nekoneč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í:
con_logfile "console.log"lua_log_sv 1con_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ší:
- 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. - 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.
- 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. - 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:
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
ThinkneboTick, který voláplayer.GetAll()neboents.FindInSpherea 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.Creates prodlevou0nebo0.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.Queryproti 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ů.
sbox_maxprops 150sbox_maxragdolls 5sbox_maxvehicles 2sbox_maxeffects 50sbox_maxballoons 10sbox_maxthrusters 20sbox_noclip 1Tyto 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.
| Gamemode | Rozumný tickrate | Proč |
|---|---|---|
| Sandbox, DarkRP, roleplay | 33 | Mnoho entit, míření tolik nehraje roli |
| TTT, Murder, Prop Hunt | 33-66 | Kolové, střední počty entit |
| Gamemody zaměřené na boj | 66 | Zá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í.
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.