Sur cette page
Documentation / Faire tourner le serveur
Trouver ce qui fait laguer
Quand le serveur saccade ou que les joueurs perdent des FPS, fivedock perf nomme les ressources en cause, jusqu’au fichier et à la ligne. Il lit le profiler intégré de FXServer, donc rien ne change sur le serveur.
Autoriser le profiler pour l’agent
FXServer ne laisse une ressource lancer le profiler que si server.cfg l’autorise. Le bloc que donne le panel quand vous connectez un serveur contient déjà ces lignes. Sur un serveur connecté avant, ajoutez-les et redémarrez la ressource fivedock :
add_ace resource.fivedock command.profiler allow
add_ace resource.fivedock command.record allow
add_ace resource.fivedock command.saveJSON allowfivedock_check dans la console du serveur indique si le profiler est autorisé. Sans ces lignes, le rapport compte quand même les commandes et mesure les FPS, et vous dit quelles lignes manquent.
Mesurer le serveur
Lancez-le pendant que le serveur lag, depuis une machine qui le sauvegarde (fivedock servers add). L’agent enregistre 10 secondes, ou de 3 à 20 avec --seconds, compte les commandes de chaque ressource, mesure le jeu de chaque joueur et lit les scripts client et les pages d’interface que les joueurs téléchargent. --json affiche le même rapport pour les scripts.
fivedock perf my-city
fivedock perf my-city --seconds 20Lire le rapport
Un rapport d’un serveur qu’un job d’éboueur bloque toutes les quelques secondes, et dont le pack d’emotes enregistre une commande par emote :
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
- Les ressources qui ont pris le plus de temps de script pendant l’enregistrement.
per tickest leur coût moyen par frame du serveur,worst tickleur frame la plus lente. Au-delà de 50 ms, les joueurs le ressentent comme un blocage. - Where exactly
- Ce temps réparti entre threads, handlers d’events et exports, avec le fichier, les lignes, le nombre d’exécutions et la plus lente. Un thread qui tourne à chaque tick et coûte des millisecondes à chaque fois attend en général trop peu entre deux tours.
- Commands
- Les commandes de chaque ressource, sur le serveur et dans le jeu de trois joueurs. Une ressource qui en a des centaines enregistre en général une commande par emote ou par objet.
- Players
- Les FPS du dixième le plus lent des joueurs, la médiane et le dixième le plus rapide, leur 1 % low (les FPS de leurs images les plus lentes) et combien ont eu une image de plus de 50 ms, ce qui les entoure, et les cinq joueurs les plus lents avec leur position. Les joueurs dans le menu pause ou encore en chargement ne sont pas comptés. Si les plus lents sont au même endroit, regardez ce qui y est streamé.
- Where exactly, in players’ games
- Dans les ressources équipées du profileur client, les fonctions qui coûtent le plus par image, dans le jeu où elles coûtent le plus, avec le fichier, la ligne et le nombre de jeux de joueurs concernés. Sans profileur, le rapport indique comment l’ajouter.
- Entities scripts made
- Les props, peds et véhicules que les scripts client d’une ressource ont créés dans le jeu d’un joueur, au plus ce qu’un seul joueur en avait. Des centaines venant d’une seule ressource signifient en général qu’elle les fait apparaître sans jamais les supprimer.
- Client loops that never sleep
- Les boucles client qui se réveillent à chaque image et ne dorment jamais : un
while true dodont la seule attente estWait(0), ou unsetTick. Les boucles qui s’arrêtent, attendent parfois plus longtemps ou ne tournent qu’en debug sont écartées.resmon 1dans la console F8 d’un joueur montre ce que coûte chacune. - UI pages
- La page d’interface de chaque ressource se charge dans le jeu de chaque joueur à son arrivée et reste chargée. Le rapport nomme les plus lourdes et ce qui fait redessiner le navigateur du jeu tant qu’elles s’affichent : animations CSS sans fin, flou d’arrière-plan (backdrop blur) et vidéo, avec le fichier et la ligne, ainsi que les images de plus de 1 Mio et les pages chargées depuis un autre site.
- Streamed to every player
- Les packs streamés les plus lourds et leurs dictionnaires de textures de plus de 16 Mio, d’après le dernier scan des assets de l’agent.
fivedock optimizeréduit ces textures. - Stalls the agent caught
- Les blocages que l’agent a enregistrés de lui-même, du plus récent au plus ancien.
- FPS drops the agent caught
- Les chutes enregistrées par la surveillance des FPS, de la plus récente à la plus ancienne, chacune avec ce qui a changé dans le jeu du joueur. Si la surveillance est désactivée, le rapport indique comment l’activer.
Les blocages qu’il enregistre de lui-même
Quand le thread du serveur s’arrête 150 ms ou plus, l’agent enregistre de lui-même les 10 secondes suivantes, au plus une fois toutes les 15 minutes, et garde les trois derniers jusqu’au redémarrage de la ressource. Si le blocage n’est pas revenu pendant l’enregistrement, le rapport le dit au lieu d’accuser ce qui tournait à ce moment.
Les chutes de FPS qu’il enregistre seul
Avec ces lignes, l’agent surveille les FPS de chaque joueur. Leur jeu lit son compteur d’images une fois par seconde : la surveillance ne coûte donc rien à chaque image. Quand un joueur passe sous le plancher et nettement sous ses FPS habituels pendant cinq secondes, l’agent enregistre un avertissement player.low_fps dans la Black Box : jusqu’où, depuis combien, et ce qui a changé dans son jeu juste avant. Ce peut être une ressource qui a fait apparaître des props ou des peds, une ressource qui vient de démarrer, une interface qui avait le focus, ou une conduite trop rapide pour le streaming. Un joueur est enregistré au plus une fois toutes les dix minutes.
set fivedock_fps_watch 1
set fivedock_fps_floor 40fivedock_fps_floor fixe le plancher, 40 FPS si vous ne le changez pas. Activer ou désactiver la surveillance dans la console prend effet en 30 secondes, sans redémarrage. Filtrez la Black Box par player.low_fps pour voir toutes les chutes ; fivedock perf liste les dix dernières.
Voir la fonction client derrière les FPS de chaque joueur
FiveM garde les temps de chaque ressource dans le jeu, hors de portée des scripts. fivedock trace place un petit profileur dans chaque ressource lisible : une ligne en haut de son manifeste et un fivedock_trace.lua à côté. Il ne fait rien tant que fivedock perf ou la surveillance des FPS ne le demande pas, puis chronomètre pendant quelques secondes chaque thread, gestionnaire d’événement, callback NUI et commande de cette ressource. Les ressources sous escrow, protégées par Skalp ou obfusquées ne sont pas touchées, et la liste dit pourquoi.
fivedock trace C:\FXServer\server-data\resources
fivedock trace C:\FXServer\server-data\resources --applyRedémarrez le serveur pour que les joueurs le chargent. Dès lors, le rapport et chaque avertissement player.low_fps nomment la ressource, le fichier, la ligne et le nombre de millisecondes par image. Sous Windows, l’application fait de même dans Outils, Profileur client. Pour le retirer, chaque manifeste revenant à l’octet près :
fivedock trace C:\FXServer\server-data\resources --remove --applyLes FPS d’un joueur
Ce qu’un script coûte dans le jeu d’un joueur, seul ce jeu le voit. Quand un joueur a peu de FPS, demandez-lui de l’enregistrer dans F8 et de vous envoyer le fichier :
profiler record 500
profiler saveJSON lag.jsonfivedock perf --file le lit comme un enregistrement du serveur :
fivedock perf --file lag.jsonPour la mesure, les joueurs reçoivent quelques lignes avec l’agent. Quand vous le demandez, leur jeu compte les images pendant trois secondes, note s’il est en pause, en chargement ou a une interface ouverte, compte les props, peds et véhicules autour du joueur avec la ressource qui a créé chacun, liste les commandes enregistrées et recueille ce que le profileur client a mesuré là où vous l’avez ajouté. Il ne lit rien d’autre et n’envoie rien de lui-même, sauf si vous activez la surveillance des FPS.
Ce qu’il ne voit pas
- Un blocage qui revient moins souvent que la durée d’un enregistrement. Lancez
fivedock perf --seconds 20au moment où il doit revenir, ou laissez l’agent l’attraper. - Le temps passé hors des scripts : le réseau, le serveur de base de données ou le streaming du jeu. Un script qui se bloque en attendant la base apparaît, lui, comme son propre temps.
- Le temps passé dans une ressource sans profileur client : sous escrow, protégée par Skalp, obfusquée, ou écrite en JavaScript ou en C#. L’enregistrement F8 d’un joueur les montre toujours.
- Ce que le code ne fait que de temps en temps. Le rapport juge les boucles et les pages d’interface en lisant les fichiers, pas en les chronométrant : une boucle lourde seulement par moments n’est donc pas nommée, et le code des ressources sous escrow ne peut pas être lu du tout. Le rapport cite ces ressources par leur nom.