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:
add_ace resource.fivedock command.profiler allow
add_ace resource.fivedock command.record allow
add_ace resource.fivedock command.saveJSON allowfivedock_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.
fivedock perf my-city
fivedock perf my-city --seconds 20Den 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:
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 tickist, was sie pro Server-Frame im Schnitt kosten,worst tickihr 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 WartenWait(0)ist, oder einsetTick. Schleifen, die abbrechen, manchmal länger warten oder nur im Debug laufen, fehlen.resmon 1in 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 optimizeverkleinert 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.
set fivedock_fps_watch 1
set fivedock_fps_floor 40fivedock_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.
fivedock trace C:\FXServer\server-data\resources
fivedock trace C:\FXServer\server-data\resources --applyStarte 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:
fivedock trace C:\FXServer\server-data\resources --remove --applyDie 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:
profiler record 500
profiler saveJSON lag.jsonfivedock perf --file liest sie wie eine Aufnahme vom Server:
fivedock perf --file lag.jsonFü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 20aus, 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.