Przejdź do treści
Na tej stronie

Dokumentacja / Prowadzenie serwera

Znajdź, co laguje

Kiedy serwer się przycina albo gracze tracą FPS, fivedock perf wskazuje zasoby, które za tym stoją, z plikiem i linią. Czyta wbudowany profiler FXServera, więc na serwerze nic się nie zmienia.

Pozwól agentowi używać profilera

FXServer pozwala zasobowi uruchomić profiler tylko wtedy, gdy zezwala na to server.cfg. Blok, który panel daje przy podłączaniu serwera, ma już te linijki. Na serwerze podłączonym wcześniej dopisz je i zrestartuj zasób 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 w konsoli serwera mówi, czy profiler jest dozwolony. Bez tych linijek raport i tak liczy komendy i zbiera FPS, a do tego podaje, których linijek brakuje.

Zbadaj serwer

Uruchom to, kiedy serwer laguje, na maszynie, która robi jego kopie (fivedock servers add). Agent nagrywa 10 sekund, albo od 3 do 20 z --seconds, liczy komendy każdego zasobu, mierzy grę każdego gracza i czyta skrypty klienckie oraz strony UI, które pobierają gracze. --json wypisuje ten sam raport dla skryptów.

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

Czytaj raport

Raport z serwera, który co kilka sekund przycina praca śmieciarza, a paczka emotek rejestruje komendę na każdą emotkę:

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
Zasoby, które w czasie nagrania zużyły najwięcej czasu skryptów. per tick to ich średni koszt na jedną klatkę serwera, worst tick ich najwolniejsza klatka. Powyżej 50 ms gracze czują to jako przycięcie.
Where exactly
Ten czas rozbity na wątki, handlery eventów i eksporty, z plikiem, liniami, liczbą uruchomień i najwolniejszym z nich. Wątek, który działa co tick i za każdym razem kosztuje milisekundy, zwykle za krótko czeka między obiegami.
Commands
Komendy każdego zasobu, na serwerze i w grze trzech graczy. Jeden zasób z setkami komend zwykle rejestruje komendę na każdą emotkę albo przedmiot.
Players
FPS najwolniejszej dziesiątej części graczy, mediana i najszybsza dziesiąta część, ich 1% low (FPS najwolniejszych klatek) i ilu graczy miało klatkę dłuższą niż 50 ms, co jest wokół nich, i pięciu najwolniejszych graczy z miejscem, w którym stoją. Gracze w menu pauzy i ci, którzy jeszcze się ładują, nie są liczeni. Jeśli wolni stoją w jednym miejscu, sprawdź, co się tam streamuje.
Where exactly, in players’ games
W zasobach z profilerem klienta funkcje, które kosztują najwięcej na klatkę, w grze, w której kosztują najwięcej, z plikiem, linią i liczbą graczy, u których się pojawiły. Bez profilera raport mówi, jak go dodać.
Entities scripts made
Propy, pedy i pojazdy, które skrypty klienckie zasobu stworzyły w grze gracza, tyle, ile miał najwięcej którykolwiek gracz. Setki z jednego zasobu zwykle znaczą, że je spawnuje i nigdy nie usuwa.
Client loops that never sleep
Pętle klienckie, które budzą się w każdej klatce i nigdy nie mogą zasnąć: while true do, w którym jedynym czekaniem jest Wait(0), albo setTick. Pętle, które się kończą, czasem czekają dłużej albo działają tylko w trybie debug, są pomijane. resmon 1 w konsoli F8 gracza pokazuje, ile kosztuje każda z nich.
UI pages
Strona UI każdego zasobu ładuje się w grze każdego gracza, gdy wchodzi na serwer, i zostaje załadowana. Raport wskazuje ciężkie strony i to, co każe przeglądarce gry przerysowywać obraz, gdy są widoczne: niekończące się animacje CSS, rozmycie tła (backdrop blur) i wideo, z plikiem i linią, a do tego obrazy powyżej 1 MiB i strony ładowane z innej witryny.
Streamed to every player
Najcięższe streamowane paczki i ich słowniki tekstur powyżej 16 MiB, z ostatniego skanu zasobów przez agenta. fivedock optimize zmniejsza te tekstury.
Stalls the agent caught
Przycięcia, które agent nagrał sam, od najnowszego.
FPS drops the agent caught
Spadki zapisane przez pilnowanie FPS, od najnowszych, każdy z tym, co zmieniło się w grze tego gracza. Gdy pilnowanie jest wyłączone, raport mówi, jak je włączyć.

Przycięcia, które nagrywa sam

Kiedy wątek serwera stanie na 150 ms lub dłużej, agent sam nagrywa kolejne 10 sekund, najwyżej raz na 15 minut, i trzyma trzy ostatnie nagrania do restartu zasobu. Jeśli przycięcie nie wróciło w czasie nagrania, raport to mówi, zamiast obwiniać to, co akurat działało.

Spadki FPS, które loguje sam

Z tymi linijkami agent pilnuje FPS każdego gracza. Jego gra raz na sekundę odczytuje licznik klatek, więc pilnowanie nic nie kosztuje w żadnej klatce. Gdy gracz przez pięć sekund ma mniej niż próg i wyraźnie mniej niż zwykle, agent zapisuje w Black Boxie ostrzeżenie player.low_fps: do ilu spadło, z ilu i co zmieniło się chwilę wcześniej w jego grze. Może to być zasób, który zespawnował propy albo pedy, zasób, który właśnie wystartował, UI z focusem albo jazda tak szybka, że streaming nie nadąża. Jeden gracz trafia do logu najwyżej raz na dziesięć minut.

server.cfg
set fivedock_fps_watch 1
set fivedock_fps_floor 40

fivedock_fps_floor to próg, domyślnie 40 FPS. Włączenie albo wyłączenie pilnowania w konsoli działa w ciągu 30 sekund, bez restartu. Odfiltruj Black Box po player.low_fps, żeby zobaczyć wszystkie spadki; fivedock perf pokazuje ostatnie dziesięć.

Zobacz funkcję klienta stojącą za FPS każdego gracza

FiveM trzyma czasy każdego zasobu w środku gry, poza zasięgiem skryptów. fivedock trace wkłada mały profiler do każdego zasobu, który da się przeczytać: jedną linię na górze manifestu i plik fivedock_trace.lua obok. Nic nie robi, dopóki nie poprosi fivedock perf albo pilnowanie FPS. Wtedy przez kilka sekund mierzy każdy wątek, handler eventu, callback NUI i komendę w tym zasobie. Zasoby z escrow, chronione Skalpem i zaciemnione zostają nietknięte, a lista mówi dlaczego.

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

Zrestartuj serwer, żeby gracze go załadowali. Od tej chwili raport i każde ostrzeżenie player.low_fps wskazują zasób, plik, linię i ile milisekund na klatkę to zajęło. Na Windowsie to samo robi aplikacja: Narzędzia, Profiler klienta. Żeby go wyjąć, z każdym manifestem przywróconym co do bajtu:

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

FPS jednego gracza

Ile skrypt kosztuje w grze gracza, widzi tylko ta gra. Kiedy jeden gracz ma niski FPS, poproś go, żeby nagrał to w F8 i przysłał Ci plik:

F8
profiler record 500
profiler saveJSON lag.json

fivedock perf --file czyta go tak samo jak nagranie z serwera:

shell
fivedock perf --file lag.json

Do pomiaru gracze dostają z agentem kilka linijek. Gdy poprosisz, ich gra przez trzy sekundy liczy klatki, zapisuje, czy jest w pauzie, ładuje się albo ma otwarte UI, liczy propy, pedy i pojazdy wokół gracza razem z zasobem, który stworzył każdy z nich, wypisuje zarejestrowane komendy i zbiera to, co zmierzył profiler klienta tam, gdzie go dodałeś. Nie czyta nic więcej i nic nie wysyła sama z siebie, chyba że włączysz pilnowanie FPS.

Czego nie widzi

  • Przycięcia, które wraca rzadziej, niż trwa nagranie. Uruchom fivedock perf --seconds 20, kiedy powinno się pojawić, albo poczekaj, aż agent złapie je sam.
  • Czasu poza skryptami: sieci, serwera bazy danych czy streamingu samej gry. Skrypt, który blokuje się, czekając na bazę, pojawia się w raporcie jako jego własny czas.
  • Czasu w zasobach bez profilera klienta: z escrow, chronionych Skalpem i zaciemnionych oraz napisanych w JavaScripcie albo C#. Widać je nadal w nagraniu z F8 u gracza.
  • Tego, co kod robi tylko czasami. Pętle i strony UI raport ocenia, czytając pliki, a nie mierząc ich czas, więc pętla, która jest ciężka tylko od czasu do czasu, nie zostanie wskazana, a kodu zasobów z escrow nie da się przeczytać wcale. Raport wymienia te zasoby z nazwy.