Skip to main content

Gaming Optimierungen

Ausgangslage

System: AMD Ryzen 9 7950X3D, AMD Radeon RX 7900 (Navi 31), 62 GB RAM, NixOS mit linuxPackages_zen. Bereits vor der Analyse gut konfiguriert:

  • services.scx.scheduler = "scx_lavd": sched_ext Scheduler, der speziell für Gaming/interaktive Workloads gebaut ist und die asymmetrische Cache-Topologie des 7950X3D (zwei CCDs, eines mit V-Cache) berücksichtigt.
  • amd_pstate=active mit EPP balance_performance.
  • hardware.amdgpu.overdrive.ppfeaturemask = "0xffffffff": entsperrt Overclocking-Funktionen für corectrl.
  • zramSwap mit zstd-Kompression.
  • programs.gamemode, programs.gamescope, programs.corectrl aktiv.
  • GE-Proton und MangoHud installiert.

Durchgeführte Änderungen

Alle Änderungen liegen in /etc/nixos/configuration.nix (Repo nix-config).

GameMode GPU-Boost

programs.gamemode = {
  enable = true;
  settings = {
    gpu = {
      apply_gpu_optimisations = "accept-responsibility";
      gpu_device = 1;
      amd_performance_level = "high";
    };
  };
};

Setzt den amdgpu Performance-Level automatisch auf high, sobald GameMode eine Spielsession startet (vorher: auto). gpu_device = 1 entspricht /sys/class/drm/card1, der einzigen vorhandenen GPU in diesem System.

NVMe I/O-Scheduler

services.udev.extraRules = ''
  ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="none"
'';

Ersetzt den Standard-Scheduler kyber durch none für alle NVMe-Geräte. NVMe-Queues regeln Reihenfolge und Latenz selbst besser, als es ein Software-Scheduler könnte.

Swappiness

boot.kernel.sysctl."vm.swappiness" = 120;

Erhöht von Standard 60 auf 120, damit der Kernel eher ins schnelle zram-Swap auslagert, statt Page-Cache zu verdrängen.

Einordnung der Wirkung

Keine der drei Änderungen ist ein großer Hebel, eher Feinschliff:

  • GameMode GPU-Boost: der wirksamste der drei Punkte. Kaum mehr durchschnittliche FPS, aber weniger Mikroruckler/Stutter, wenn auto die Powerstate bei plötzlichen Lastspitzen zu langsam hochfährt. Wirkung eher in den 1%-Lows/Frame-Time-Konsistenz sichtbar als im FPS-Average.
  • NVMe-Scheduler none: praktisch irrelevant für FPS, betrifft nur Storage-I/O (Ladezeiten, Shader-/Asset-Streaming). Meist nicht spürbar.
  • Swappiness 120: bei 62 GB RAM ohne Memory-Pressure kaum messbarer Effekt, reine Absicherung für Randfälle.

Die eigentlich großen Hebel (siehe Ausgangslage oben) waren schon vorher gesetzt.

Noch nicht umgesetzt, aber sinnvoll

  • PBO/Curve-Optimizer-Undervolt über corectrl: mehr Sustained-Boost-Headroom, weniger Throttling. Potenziell größerer Effekt als alle obigen Punkte zusammen.
  • RAM-Profil prüfen: EXPO-Profil aktiv? Bei DDR5 auf Ryzen macht das oft mehr Unterschied als Software-Tuning.
  • VRR/Freesync und korrekte Refresh-Rate am Monitor sicherstellen, falls noch nicht geschehen.

Verifikation nach nixos-rebuild switch

cat /sys/block/nvme0n1/queue/scheduler        # sollte [none] zeigen
cat /proc/sys/vm/swappiness                   # sollte 120 zeigen
cat /sys/class/drm/card1/device/power_dpm_force_performance_level   # "high" während eines Spiels