Zum Inhalt springen
Auf dieser Seite

Dokumentation / Server betreiben

Finden, was laggt

Wenn der Server ruckelt oder Spieler FPS verlieren, nennt fivedock perf die Ressourcen dahinter, bis auf Datei und Zeile. Es liest den eingebauten Profiler von FXServer, am Server ändert sich nichts.

Dem Agent den Profiler erlauben

FXServer lässt eine Ressource den Profiler nur starten, wenn server.cfg es erlaubt. Der Block, den das Panel beim Verbinden eines Servers ausgibt, enthält diese Zeilen schon. Auf einem früher verbundenen Server füg sie hinzu und starte die Ressource fivedock neu:

server.cfg
add_ace resource.fivedock command.profiler allow
add_ace resource.fivedock command.record allow
add_ace resource.fivedock command.saveJSON allow

fivedock_check in der Serverkonsole zeigt, ob der Profiler erlaubt ist. Ohne diese Zeilen zählt der Bericht trotzdem Befehle und misst FPS, und er sagt dir, welche Zeilen fehlen.

Den Server messen

Führ es aus, während der Server laggt, auf einer Maschine, die ihn sichert (fivedock servers add). Der Agent nimmt 10 Sekunden auf, oder 3 bis 20 mit --seconds, zählt die Befehle jeder Ressource, misst das Spiel jedes Spielers und liest die Client-Skripte und UI-Seiten, die Spieler herunterladen. --json gibt denselben Bericht für Skripte aus.

shell
fivedock perf my-city
fivedock perf my-city --seconds 20

Den Bericht lesen

Ein Bericht von einem Server, den ein Müllabfuhr-Job alle paar Sekunden anhält und dessen Emote-Paket für jedes Emote einen Befehl registriert:

fivedock perf my-city
my-city  profiled 10 s · 214 players online
  server thread  late by 3.8 ms on average, 212 ms at worst in the last minute

Server  198 ticks, the slowest took 212 ms
  resource          total   per tick  worst tick
  jobs_garbage   1,236 ms     6.2 ms      205 ms
  hud              412 ms     2.1 ms      6.3 ms
  oxmysql           96 ms     0.5 ms       14 ms
  emotes            12 ms     0.1 ms      0.4 ms

Where exactly  the threads, events and exports that took longest
  jobs_garbage     611 ms  thread · server/main.lua:88-131 · 3× · worst 203 ms
  jobs_garbage     598 ms  thread · server/main.lua:12-40 · 198× · worst 6.1 ms
  hud              380 ms  event hud:sync · server.lua:52-77 · 1,420× · worst 4.2 ms
  oxmysql           88 ms  export · dist/build.js:310 · 402× · worst 14 ms

Commands  on the server, and in the game of 3 sampled players
  resource     server  players
  emotes            –    2,034
  admin_menu       61       12
  hud               9        4
  total           248    2,310
  A command per emote or item adds up fast. Check whether that resource needs them all.

Players  207 of 214 answered · 5 players in the pause menu or loading, left out
  FPS          24 for the slowest tenth · 47 median · 71 for the fastest tenth
  1% low       19 median · 64 players had a frame over 50 ms
  around them  980 objects · 310 peds · 180 vehicles (median)
  slowest
    Player 112   13 fps  1% low 4 · 9 frames over 50 ms · 4,210 objects  at 1693, 3245
    Player 17    16 fps  1% low 6 · 7 frames over 50 ms · 3,980 objects · a UI open  at 1702, 3251

Where exactly, in players’ games  the client functions that cost most, in the game they cost most
  hud              3.8 ms  thread · client/status.lua:14 · 9 players
  jobs_garbage     2.4 ms  thread · client/bags.lua:52 · 4 players
  phone            0.9 ms  NUI getMessages · client/nui.lua:88 · 2 players
  hud              0.6 ms  event hud:updateStatus · client/main.lua:120 · 12 players
  Measured in 31 traced resources, per frame.

Entities scripts made  in a player’s own game, the most any one of them had
  jobs_garbage  2,940 objects
  hud           12 objects
  A script that spawns props or peds and never deletes them slows every frame after.

Client loops that never sleep  each runs on every frame, in every player’s game
  hud         2  client/status.lua:14 · client/minimap.lua:41
  A while true do whose only Wait is Wait(0), or a setTick. resmon 1 in F8 shows what each costs.

UI pages  each loads in every player’s game on join and stays loaded
  phone      41.8 MiB  video ui/wallpapers/live.mp4 · endless animation ×4 ui/assets/index.css:1 · backdrop blur ×6 ui/assets/index.css:1
  hud         0.6 MiB  endless animation html/hud.css:212
  An endless animation, a backdrop blur or a video makes the game’s browser repaint every frame while it shows.

Streamed to every player  the heaviest packs, from the last asset scan
  [cars]       2.4 GiB · 23 texture dictionaries over 16 MiB
  sandy_mlo  479.7 MiB · 2 texture dictionaries over 16 MiB
  fivedock optimize <folder> shows what shrinking them saves, and --apply does it.

  Escrowed, so their client code could not be read: vehicle_shop

Exact cost per client resource  only a player’s own profiler can see it
  Ask Player 112 to type these two lines in F8:
    profiler record 500
    profiler saveJSON lag.json
  It saves into FiveM Application Data › citizen. fivedock perf --file lag.json reads it.

Stalls the agent caught  each one recorded for 10 s after it happened
  21:04  212 ms stall  then jobs_garbage took 203 ms in one tick
         jobs_garbage · server/main.lua:88-131

FPS drops the agent caught  players below 40 fps and well under their usual, newest first
  21:12  Player 112   58 → 14 fps  jobs_garbage
         jobs_garbage spawned 1,800 objects in the minute before
  20:51  Player 17    71 → 22 fps
         driving at 170 km/h, so the game streams fast
  20:30  Player 64    66 → 19 fps  phone
         phone started in the minute before · a UI had focus · the phone UI has a video and an endless animation
Server
Die Ressourcen, die während der Aufnahme die meiste Skriptzeit gebraucht haben. per tick ist, was sie pro Server-Frame im Schnitt kosten, worst tick ihr langsamster einzelner Frame. Über 50 ms spüren Spieler das als Hänger.
Where exactly
Diese Zeit aufgeteilt in Threads, Event-Handler und Exports, mit Datei, Zeilen, wie oft jeder lief und seinem langsamsten Lauf. Ein Thread, der jeden Tick läuft und jedes Mal Millisekunden kostet, wartet meist zu kurz zwischen den Runden.
Commands
Die Befehle jeder Ressource, am Server und im Spiel von drei Spielern. Eine Ressource mit Hunderten davon registriert meist einen Befehl pro Emote oder Item.
Players
Die FPS des langsamsten Zehntels der Spieler, der Median und das schnellste Zehntel, ihre 1% Low (die FPS ihrer langsamsten Frames) und wie viele einen Frame über 50 ms hatten, was um sie herum ist, und die fünf langsamsten Spieler mit ihrem Standort. Spieler im Pausemenü oder noch beim Laden zählen nicht mit. Stehen die langsamen am selben Ort, schau dir an, was dort gestreamt wird.
Where exactly, in players’ games
In Ressourcen mit Client-Profiler die Funktionen, die pro Frame am meisten kosten, in dem Spiel, in dem sie am meisten kosten, mit Datei, Zeile und in wie vielen Spielen sie vorkamen. Ohne Profiler sagt der Bericht, wie man ihn hinzufügt.
Entities scripts made
Props, Peds und Fahrzeuge, die die Client-Skripte einer Ressource im Spiel eines Spielers erstellt haben, so viele, wie ein einzelner Spieler höchstens hatte. Hunderte von einer Ressource heißen meist, dass sie sie spawnt und nie löscht.
Client loops that never sleep
Client-Schleifen, die in jedem Frame aufwachen und nie schlafen können: ein while true do, dessen einziges Warten Wait(0) ist, oder ein setTick. Schleifen, die abbrechen, manchmal länger warten oder nur im Debug laufen, fehlen. resmon 1 in der F8-Konsole eines Spielers zeigt, was jede kostet.
UI pages
Die UI-Seite jeder Ressource lädt im Spiel jedes Spielers beim Beitritt und bleibt geladen. Der Bericht nennt die schweren und das, was den Browser des Spiels neu zeichnen lässt, solange sie zu sehen sind: endlose CSS-Animationen, Backdrop-Blur und Video, mit Datei und Zeile, dazu Bilder über 1 MiB und Seiten, die von einer anderen Website laden.
Streamed to every player
Die schwersten gestreamten Pakete und ihre Texture Dictionaries über 16 MiB, aus dem letzten Asset-Scan des Agents. fivedock optimize verkleinert diese Texturen.
Stalls the agent caught
Die Hänger, die der Agent von selbst aufgenommen hat, die neuesten zuerst.
FPS drops the agent caught
Die Einbrüche, die die FPS-Überwachung protokolliert hat, die neuesten zuerst, jeweils mit dem, was sich im Spiel dieses Spielers geändert hat. Ist die Überwachung aus, sagt der Bericht, wie man sie einschaltet.

Hänger, die er selbst aufnimmt

Wenn der Server-Thread 150 ms oder länger steht, nimmt der Agent von selbst die nächsten 10 Sekunden auf, höchstens einmal alle 15 Minuten, und behält die letzten drei, bis die Ressource neu startet. Kam der Hänger während der Aufnahme nicht wieder, sagt der Bericht das, statt dem die Schuld zu geben, was gerade lief.

FPS-Einbrüche, die er selbst protokolliert

Mit diesen Zeilen behält der Agent die FPS jedes Spielers im Blick. Ihr Spiel liest einmal pro Sekunde seinen Frame-Zähler, das Beobachten kostet also in keinem Frame etwas. Fällt ein Spieler fünf Sekunden lang unter die Untergrenze und deutlich unter seine üblichen FPS, schreibt der Agent eine player.low_fps-Warnung in die Black Box: wie tief, von wie viel, und was sich kurz davor in seinem Spiel geändert hat. Das kann eine Ressource sein, die Props oder Peds gespawnt hat, eine, die gerade gestartet ist, eine UI mit Fokus oder eine Fahrt, die schneller ist als das Streaming. Ein Spieler landet höchstens alle zehn Minuten einmal im Log.

server.cfg
set fivedock_fps_watch 1
set fivedock_fps_floor 40

fivedock_fps_floor ist die Untergrenze, 40 FPS, wenn du nichts setzt. Ein- oder Ausschalten in der Konsole wirkt innerhalb von 30 Sekunden, ohne Neustart. Filtere die Black Box nach player.low_fps, um jeden Einbruch zu sehen; fivedock perf listet die letzten zehn.

Die Client-Funktion hinter den FPS jedes Spielers sehen

FiveM hält die Zeiten jeder Ressource im Spiel fest, außer Reichweite von Skripten. fivedock trace setzt in jede lesbare Ressource einen kleinen Profiler: eine Zeile oben im Manifest und eine fivedock_trace.lua daneben. Er tut nichts, bis fivedock perf oder die FPS-Überwachung fragt, und misst dann einige Sekunden lang jeden Thread, Event-Handler, NUI-Callback und Befehl dieser Ressource. Escrow-, Skalp-geschützte und verschleierte Ressourcen bleiben unberührt, und die Liste sagt, warum.

shell
fivedock trace C:\FXServer\server-data\resources
fivedock trace C:\FXServer\server-data\resources --apply

Starte den Server neu, damit die Spieler ihn laden. Ab dann nennen der Bericht und jede player.low_fps-Warnung die Ressource, die Datei, die Zeile und wie viele Millisekunden pro Frame es gekostet hat. Unter Windows macht die Desktop-App dasselbe unter Werkzeuge, Client-Profiler. Wieder entfernen, jedes Manifest bis aufs Byte wie vorher:

shell
fivedock trace C:\FXServer\server-data\resources --remove --apply

Die FPS eines Spielers

Was ein Skript im Spiel eines Spielers kostet, sieht nur dieses Spiel. Hat ein Spieler niedrige FPS, bitte ihn, es in F8 aufzunehmen und dir die Datei zu schicken:

F8
profiler record 500
profiler saveJSON lag.json

fivedock perf --file liest sie wie eine Aufnahme vom Server:

shell
fivedock perf --file lag.json

Für die Messung bekommen Spieler mit dem Agent ein paar Zeilen. Wenn du fragst, zählt ihr Spiel drei Sekunden lang die Frames, merkt sich, ob es pausiert, lädt oder eine UI offen hat, zählt die Props, Peds und Fahrzeuge um den Spieler mit der Ressource, die sie jeweils erstellt hat, listet die registrierten Befehle und sammelt, was der Client-Profiler dort gemessen hat, wo du ihn hinzugefügt hast. Es liest sonst nichts und sendet nichts von sich aus, außer du schaltest die FPS-Überwachung ein.

Was es nicht sieht

  • Einen Hänger, der seltener wiederkommt, als eine Aufnahme dauert. Führ fivedock perf --seconds 20 aus, wenn er fällig ist, oder lass den Agent ihn erwischen.
  • Zeit außerhalb von Skripten, etwa im Netzwerk, im Datenbankserver oder im Streaming des Spiels. Ein Skript, das blockiert, während es auf die Datenbank wartet, taucht dagegen auf, als seine eigene Zeit.
  • Die Zeit in Ressourcen ohne Client-Profiler: Escrow-, Skalp-geschützte und verschleierte Ressourcen sowie solche in JavaScript oder C#. Die F8-Aufnahme eines Spielers zeigt sie weiterhin.
  • Was der Code nur manchmal tut. Schleifen und UI-Seiten beurteilt der Bericht, indem er die Dateien liest, nicht indem er sie misst. Eine Schleife, die nur ab und zu schwer ist, wird also nicht genannt, und Code in Escrow-Ressourcen lässt sich gar nicht lesen. Der Bericht nennt diese Ressourcen beim Namen.