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:
add_ace resource.fivedock command.profiler allow
add_ace resource.fivedock command.record allow
add_ace resource.fivedock command.saveJSON allowfivedock_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.
fivedock perf my-city
fivedock perf my-city --seconds 20Czytaj raport
Raport z serwera, który co kilka sekund przycina praca śmieciarza, a paczka emotek rejestruje komendę na każdą emotkę:
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 tickto ich średni koszt na jedną klatkę serwera,worst tickich 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 jestWait(0), albosetTick. Pętle, które się kończą, czasem czekają dłużej albo działają tylko w trybie debug, są pomijane.resmon 1w 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 optimizezmniejsza 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.
set fivedock_fps_watch 1
set fivedock_fps_floor 40fivedock_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.
fivedock trace C:\FXServer\server-data\resources
fivedock trace C:\FXServer\server-data\resources --applyZrestartuj 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:
fivedock trace C:\FXServer\server-data\resources --remove --applyFPS 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:
profiler record 500
profiler saveJSON lag.jsonfivedock perf --file czyta go tak samo jak nagranie z serwera:
fivedock perf --file lag.jsonDo 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.