A modern PC-s játékok – mint például a Death Stranding 2 – sokszor az utolsó csepp teljesítményt is kippréselik a processzorból, főleg ha az egy régi egyed(i5 8600K). Ilyenkor a háttérben futó apró akadások, az úgynevezett micro-stutteringek vagy a váratlanul 90-ről 60 alá zuhanó FPS-értékek mögött meglepő módon nem mindig a gyenge hardver áll. Nagyon sokszor maga a Linux kernel „Túlfékezési mechanizmusa” és öngyógyító rendszere okozza a problémát.
Ebben a cikkben körbejárjuk, hogy miért születik meg a naplókban a rettegett perf: interrupt took too long hibaüzenet, és miért segíthet két speciális kernel-beállítás felülírása a játékélmény simábbá tételében.
1. A mintavételezési plafon kitolása: kernel.perf_event_max_sample_rate=100000
A hiba oka
A Linux kernel rendelkezik egy perf nevű alrendszerrel, amelynek feladata a processzor állapotának folyamatos ellenőrzése és mintavételezése. Ez figyeli, hogy az egyes folyamatok mennyi CPU-időt igényelnek.
Amikor a rendszer extrém terhelés alatt áll, ezek a mintavételek hosszabb időt vehetnek igénybe. Alapértelmezés szerint a kernel rendelkezik egy védelmi funkcióval: ha a mintavételezés a CPU-idő több mint 25%-át felemészti, a rendszer automatikusan visszaveszi (korlátozza) a mintavételi sebességet, nehogy a számítógép teljesen lefagyjon.
Mi történik a játék során?
Amikor a kernel működésbe lépteti ezt a fékrendszert, a háttérben egy apró várakozási láncreakció indul el. A processzor nem tudja időben átadni a szükséges adatokat a videókártyának, ami miatt a GPU kihasználtsága egy pillanatra bezuhan – a képernyőn pedig ezt akadásként, illetve az FPS hirtelen leeséseként érzékeljük.
Mit csinál a parancs?
sudo sysctl -w kernel.perf_event_max_sample_rate=100000
Ezzel a beállítással megemeljük a mintavételezés maximális határértékét. Megmondjuk a kernelnek, hogy ne korlátozza le magát pánikszerűen, ha egy erőforrás-igényes számítási feladat során a mintavétel több időt vesz igénybe a megszokottnál.
2. A háttérben futó „őrszem” kikapcsolása: kernel.nmi_watchdog=0
A működési elv
Az NMI (Non-Maskable Interrupt) egy olyan magas prioritású megszakítás, amelyet a CPU semmilyen körülmények között nem utasíthat vissza. Erre épül a Watchdog, ami egyfajta biztonsági „halott ember kapcsolója”.
A Watchdog rendszeres időközönként jelet küld a processzornak. Ha a CPU egy hibás kód vagy végtelen ciklus miatt nem válaszol, a Watchdog úgy érzékeli, hogy a rendszer véglegesen lefagyott, és a biztonság érdekében kényszerített újraindítást (kernel panic) vált ki.
A probléma a játékoknál
A Watchdog folyamatos jelenléte extra megszakításokat és apró terhelést generál. Intenzív feladatok során – mint például a komplex árnyékolók (shader) háttérben történő fordítása vagy a PCIe sávszélesség maximális kihasználása – a processzor rövid időre teljesen lekötötté válhat. A Watchdog ilyenkor tévesen fagyásnak érzékelheti ezt a rendkívül hosszú számítási ciklust, vagy maga a megszakítás zavarhat be a számítások folyamatosságába.
Mit csinál a parancs?
sudo sysctl -w kernel.nmi_watchdog=0
Ezzel a lépéssel teljesen kikapcsoljuk ezt a biztonsági ellenőrt.
A sysctl -w paranccsal elvégzett módosítások csak a következő újraindításig érvényesek. Ahhoz, hogy a beállítások minden rendszerindításkor automatikusan betöltődjenek, a /etc/sysctl.d/ könyvtárban kell létrehozni egy konfigurációs fájlt.
Hozz létre egy új konfigurációs fájlt: Sudo jogosultság szükséges.
A legtisztább megoldás, ha egy külön fájlt hozol létre a saját módosításaidnak a /etc/sysctl.d/ mappában.
Nyiss meg egy terminált, és írd be a következő parancsot egy szövegszerkesztő (például nano) megnyitásához:
sudo nano /etc/sysctl.d/99-game-performance.conf
Add hozzá a beállításokat: Másold be a két paramétert.
Illeszd be az alábbi két sort a fájlba:
kernel.perf_event_max_sample_rate = 100000
kernel.nmi_watchdog = 0
Mentéshez nyomd meg a Ctrl + O, majd az Enter billentyűt. A kilépéshez nyomd meg a Ctrl + X kombót.
Alkalmazd a változtatásokat újraindítás nélkül:
Nem szükséges azonnal újraindítanod a számítógépet, az új beállításokat azonnal betöltheted a következő paranccsal:
sudo sysctl --system
Ellenőrizd az eredményt:
Győződj meg róla, hogy a rendszer sikeresen átvette az új értékeket:
sysctl kernel.perf_event_max_sample_rate kernel.nmi_watchdog
A kimenetnek ezt kell mutatnia:
kernel.perf_event_max_sample_rate = 100000
kernel.nmi_watchdog = 0
Összegzés és gyakorlati hatás
Paraméter | Alapértelmezett viselkedés | Beállított állapot | Hatás a játékokra |
kernel.perf_event_max_sample_rate
| Túlterhelésnél visszaveszi a mintavételezést (visszafogja a CPU-t) | Magasabb plafon (100 000 minta/mp) | Megszünteti a mintavételi korlátozásból fakadó FPS-zuhanásokat |
kernel.nmi_watchdog
| Aktív biztonsági őrszem (rendszeres megszakítások) | Kikapcsolva (0) | Felszabadítja az NMI-megszakítások erőforrásait, egyenletesebb frametime-ot nyújt |
Mindkét parancs alkalmazásával kikapcsoljuk a Linux kernel túlzottan óvatos, szerveres környezetre tervezett védelmi reflexeit, így a processzor teljes kapacitását a játékok gördülékeny futtatására fordíthatja. Innentől kezdve megszűntek a játékbeli fagyások.