Aller au contenu
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 :

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 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.

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

Lire 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 :

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
Les ressources qui ont pris le plus de temps de script pendant l’enregistrement. per tick est leur coût moyen par frame du serveur, worst tick leur 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 do dont la seule attente est Wait(0), ou un setTick. Les boucles qui s’arrêtent, attendent parfois plus longtemps ou ne tournent qu’en debug sont écartées. resmon 1 dans 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 optimize ré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.

server.cfg
set fivedock_fps_watch 1
set fivedock_fps_floor 40

fivedock_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.

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

Redé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 :

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

Les 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 :

F8
profiler record 500
profiler saveJSON lag.json

fivedock perf --file le lit comme un enregistrement du serveur :

shell
fivedock perf --file lag.json

Pour 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 20 au 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.