Nyulak szigete: hány játékost bír a szerver?

Terhelésteszt a studio-1 VPS-en, 2026-10-25. Robotok a laptopról, a valódi úton (Kívánjáték-átjáró).

~150 játékos egyszerre, jól

A VPS kb. 150 játékost bír egyszerre jól; 200 felett a játék egyetlen szála (a 20 Hz-es tick) akad el, 250 felett a szerver lemarad, 500-nál már másodpercekig nem érkezik adat a játékosokhoz. A mostani termékkorlát (48 játékos) ennek harmada.

48a mostani játékoslimit
200a szélén: a lassú tickek már 60 ms-osak
250+szétesik: a szerver lemarad
0újraindulás, lefagyás, memóriahiány

A szerver egy tickje

A játék 20-szor számol másodpercenként, egy tickre 50 ms jut. Ami fölötte van, ott a szerver lemarad.

átlagp95 (a lassú tickek)
050100150200ms5102550100150200250300500játékos egyszerre50 ms keretátlagp95

Állapotcsomag másodpercenként, játékosonként

A szerver 20-at küld; ha kevesebb jön meg, a többiek mozgása szaggat.

06121824db/s5102550100150200250300500játékos egyszerre20 / s

A teljes VPS processzora (Hetzner API)

A két mag összesen, 200% = mindkét mag tele. Lépcsőnként a mérési perc átlaga.

050100150200%5102550100150200250300500játékos egyszerreegy mag

A VPS processzora a teljes teszt alatt (Hetzner API, 10 mp)

Minden sáv egy lépcső. A pihenőkben a gép visszaesik.

050100150200%5102550100200300300500150250100010203040perc a teszt kezdete óta egy mag

A szomszédok válaszideje közben

Az élő Nyulak és a kivanjatek.hu, 3 mp-enként mérve. Egyik sem hibázott, és nem indult újra.

Kívánjátékélő Nyulak
050100150200ms5102550100150200250300500játékos egyszerreKJNyulak

A teljes jelentés

Újraindulás, kifagyás, OOM nem volt sehol (se a tesztben, se az élő szolgáltatásoknál). Részletek lent.

Mit mértünk, hogyan

Eredmény lépcsőnként

A tick a szerver saját /health mérése. A „Játék-folyamat CPU” egy magra vetítve (100 = egy teljes mag); a Hetzner CPU a két vCPU összege (max 200). Nyugalmi VPS CPU a teszt előtt/után: kb. 2 (a 200-ból).

JátékosMódTick átl. msp95maxLemaradt tickJáték-folyamat CPU %Egész VPS CPU % (Hetzner, max 200)Steal %RSS MB
5decode8,613,129036440205
10decode9,514,324024410211
25decode14,520,128035620219
50decode20,127,453047910241
100decode26,636,2730581100287
100 (5 perc)decode27,137,7790571140826
150decode32,746,31040651390879
200decode39,860,51170781630341
250light52,074,6200186801750823
300light67,097,4214444771780413
300decode67,998,3232401771760382
500light94,9124,4503692- (a /stress nem válaszolt)184-939

(Az RSS oszlop a folyamat összesített memóriája: a Node nem adja vissza az operációs rendszernek, ami egyszer kellett, ezért a 150-es és a 100/5 perces sor az 500-as lépcső után magas, nem a játékosszámtól. A tesztszerver a teljes teszt végén, üresen is kb. 680 MB volt.)

JátékosKi MB/s (Hetzner)KiB/s/játékosSnapshot/s a botnálBot ping átl. / max msLeghosszabb snapshot-rés msÉlő Nyulak ms átl. / maxKJ ms átl. / max
50,049,320,231 / 6712833 / 6433 / 63
100,099,520,229 / 4514935 / 7534 / 74
250,269,720,130 / 5212837 / 9036 / 88
500,521220,032 / 6113835 / 7234 / 70
1001,581520,137 / 9123035 / 7638 / 105
100 (5 perc)1,441420,137 / 12139834 / 9735 / 99
1503,021820,048 / 17152337 / 8037 / 80
2004,762020,167 / 58096047 / 11973 / 268
2507,552217,2157 / 19 83128 78236 / 7245 / 153
300 (light)8,662112,9207 / 48 20954 90851 / 13166 / 293
300 (decode)9,822315,1289 / 60 52632 06544 / 12562 / 191
50012,64-3,827 030 / 100 496109 65979 / 395188 / 953

A „Snapshot/s” a játékosonkénti állapotcsomag, a szerver 20-at küld; 20 alatt a játékos mozgása szaggat. A ping a játék saját ping-pongja (a tick-sorban várakozik, ezért a lemaradást is mutatja). A játékos oldali alap-ping ~30 ms (laptop - Caddy - VPS). Az élő Nyulak és a KJ válaszideje nyugalomban is ~35 ms (ugyanaz az útvonal, a saját mérésünk).

A mockolt szám (hostbench, a VPS-en, hálózat nélkül, az élő szerver üres volt)

JátékosTick átl. msp95maxGC ms/tickRSS MBátl. ms: players / net / npc / vehicles
53,05,2220,052520,13 / 0,65 / 1,1 / 0,5
104,16,7190,062530,60 / 1,0 / 1,3 / 0,6
256,09,2290,142671,4 / 1,7 / 1,4 / 0,8
509,013,2390,352963,1 / 2,7 / 1,4 / 0,7
10015,224,01061,73765,9 / 5,1 / 1,9 / 0,9
20028,256,611717,743412,3 / 10,2 / 2,7 / 1,2
50072,0235,340458,871730,0 / 34,1 / 2,8 / 1,7

A mockolt szám a tiszta játéklogika (a hamis kliensek ugyanabban a folyamatban dekódolnak, így a GC-t felfelé torzítják), a valódi mérés ennél 30-70%-kal magasabb 100-200 játékosnál: ez a websocket-küldés, a Caddy és az átjáró ára a valódi tick mellett. Mindkét mérés ugyanazt mondja: a költség ~lineárisan nő, 200 felett a players és net rendszer (a játékosonkénti állapot összerakása és a küldés) gyorsabban, mint a játékosszám.

Mi akad el először

  1. A tick (egy szál). A Node egyetlen szálon számolja az egész világot és építi minden játékos állapotcsomagját. Ez 200 játékosnál p95-ben átlépi az 50 ms-ot, 250-nél az átlag is, innentől a szerver tickjei lemaradnak (behind), a játékosok kevesebb mint 20 állapotot kapnak másodpercenként (300-nál 13-15, 500-nál 4), a ping másodpercekre nő. A két vCPU-ból a játék csak az egyiket használja (a játék-folyamat 80% körül tetőzik), a másikon a Caddy, a kernel hálózati rétege és a többi szolgáltatás osztozik.
  2. A VPS egésze 200-nál 80%, 250 fölött 88-92% (Hetzner CPU). A steal (a hipervizor elvonása) a teljes teszt alatt 0 volt: a megosztott vCPU nem lassult be mástól.
  3. Hálózat nem szűk: 12,6 MB/s kifelé a 500-nál (kb. 100 Mbit/s), játékosonként ~20 KiB/s (~160 kbit/s). 100 játékossal kb. 135 GB/nap kimenő forgalom lenne, ha egész nap tele lenne.
  4. Memória nem szűk: a játék 340 MB (200 játékosnál) - 940 MB (500-nál); a VPS memóriája nem fogyott el (nem volt OOM). A tesztunit csúcsa 976 MB volt a 1,5 GB-os határ alatt.
  5. Lemez nem látszott szűk keresztmetszetnek a Hetzner lemezmetrikái szerint.

Újraindulás, kifagyás

Termékkorlát és a hardver határa

Érték
Termékkorlát mostcore.maxPlayers 48 (állítható 1-64), perIp 8, maxConns 96
48 játékosnál a tickkb. 20 ms átlag, p95 27 ms (az 50 ms-nak 40%-a)
Kényelmes határ (p95 < 50 ms, 0 lemaradás)kb. 150 játékos
Szélén (p95 60 ms, de még 20 snapshot/s)200 játékos
Szétesik250 és fölötte

A termékkorlát tehát a hardvernél jóval szigorúbb: a 48 játékos mellett a VPS-nek ~60% tartaléka van. A maxPlayers max-értéke a beállításokban 64 (a jelenlegi kód szerint), amit a VPS a mérés szerint bírna (50 és 100 között a tick 20-27 ms átlag). Tovább menni (96-150) a core.maxPlayers, core.perIp (egy IP-ről több játékos: kollégium, mobilháló) és maxConns együttes emelését kéri, és 100+ fölött érdemes az perf.shed-et megtartani bekapcsolva.

Két figyelmeztetés: a botok véletlenszerűen mozognak, a valódi játékosok csoportosulnak (egy ponton sokan: több lövedék, több látható entitás egy játékosnak - ez rosszabb lehet a mostaninál, a battle hostbench-szcenáriót érdemes külön futtatni); és a mérés alatt a KJ-n és az Akkufaluban nem volt valódi forgalom, a számok ehhez képest „üres szomszédok” esetét mutatják.

Mivel lehetne többet

Ami nem ment simán (a teljesség kedvéért)

Takarítás

A VPS-en leállítva és törölve: a nyulak-stress és nyulak-hostbench unit, /srv/studio/nyulak-stress, /srv/studio/nyulak-stress-data; a 24791-es port szabad, nincs maradék folyamat vagy unit; a lemez és a memória visszaállt az indulás előtti szintre. Az ideiglenes nyulak-stress.kivanjatek.hu Caddy-útvonalat a vezető távolítja el. A laptopon nem fut tunnel, nincs maradék bot.

Nyers adatok és eszközök