Beim automatischen Setup von Testdatenbanken im Rahmen eines GitLab-CI Pipeline Jobs müssen meist mehre SQL-Dumps importiert werden. Dazu wird üblicherweise mysql als Service gestartet und dann die Datenbank via CLI importiert. Aber eigentlich importieren die mariadb Docker container automatisch dateien im verzeichnis /docker-entrypoint-initdb.d/ . Aber da es in CI keine direkten Volume-Mounts gibt benötigt man einen Workaround.
Ein Bash-Skript zur Überwachung von mehrstufigen, lang laufenden Prozessen in Echtzeit, mit Simultananzeige von Fortschritt und vollständiger Log-Erfassung.
Speichern Dialog öffnen um 2 Sekunden verzögert. Bilder anzeigen um 2 Sekunden verzögert
Symptome
Ich habe lange gedacht, ich bilde mir das nur ein. Aber jedes Mal, wenn ich z. B. im Firefox etwas speichern will, braucht es 2 Sekunden, bis der Dialog dazu aufgeht. Genauso beim Anschauen eines Bildes. Ich habe die Ursache gefunden: es hat mit dem Energiesparen der GPU zu tun.
Ursache
Der Öffnen-Dialog von Snap-Apps wird nicht von der App selbst gezeichnet, sondern per xdg-desktop-portal von Nautilus – und Nautilus ist GTK4. GTK4 legt für jedes neue Fenster einen Vulkan-Renderer an, und der zählt beim Start alle installierten Grafiktreiber auf. Dabei greift er auf die dedizierte NVIDIA RTX A500 zu, obwohl der Bildschirm an der Intel-GPU hängt.
Im PRIME-Modus on-demand schläft die RTX A500 rund 21 Sekunden nach dem letzten Zugriff wieder ein, und sie aus dem Standby zu wecken kostet ~3 Sekunden. Weil das bei praktisch jedem Dialog erneut passiert, hängt es jedes Mal.
Das Ganze betrifft nicht nur den Dateidialog, sondern jede GTK4-App, die ein Fenster aufbaut – also auch den Bildbetrachter, die Vorschau und diverse GNOME-Anwendungen.
Nachgemessen
Zeit vom Start bis das Fenster sichtbar ist, jeweils mit schlafender und mit wacher GPU:
Situation
Dauer
GPU danach
GPU schlafend, Standard-Renderer (Vulkan)
2,81 s
geweckt
GPU wach, Standard-Renderer
0,16 s
wach
GPU schlafend, GSK_RENDERER=gl
0,09 s
bleibt schlafend
reine Aufweckzeit der GPU (nvidia-smi -L)
2,97 s
geweckt
Faktor 20 – und der einzige Unterschied ist, ob die dedizierte GPU überhaupt angefasst wird. Am Bildbetrachter Loupe sieht man dasselbe Muster, hier an den geöffneten Gerätedateien:
Ein Treiber-Update hat übrigens kaum etwas gebracht: mit 595.84 statt 580.173.02 sank die Aufweckzeit nur von 3,56 s auf 2,97 s.
Der Fix
GTK4 auf den GL-Renderer festlegen. Der benutzt nur das Standard-Gerät, also die Intel-GPU, und lässt die NVIDIA in Ruhe. Das gilt sessionweit für alle GTK4-Apps, nicht nur für den Dateimanager.
Achtung, hier bin ich reingefallen:dbus-update-activation-environment --systemd GSK_RENDERERohne=gl liest den Wert aus der aufrufenden Shell. Ist er dort nicht gesetzt, passiert schlicht nichts – und man wundert sich, warum der Fix nicht greift. Immer mit explizitem Wert aufrufen.
3. Laufende Instanzen beenden, damit sie neu mit der Variable starten:
pkill -x nautilus
Rückgängig: die Datei löschen, abmelden und neu anmelden.
Wichtig: In GTK 4.22 heißt der Renderer gl. Der alte Name ngl wird ignoriert – GTK gibt dann nur eine Warnung aus und nimmt weiter Vulkan.
Kontrolle
Nach dem nächsten Dialog oder Bild muss hier suspended stehen:
Und in der Liste der geöffneten Dateien der App darf kein /dev/nvidia* und kein renderD129 auftauchen:
ls -l /proc/$(pgrep -x nautilus)/fd | grep -E 'nvidia|renderD'
Bei mir bleibt dort nur renderD128 übrig, also die Intel-GPU. Ein Treffer auf nvidia-application-profiles ist harmlos – das ist nur eine Textdatei, die die NVIDIA-GL-Bibliothek liest, kein Gerätezugriff.
Schnelltest ohne jede Änderung, zum Ausprobieren vorab:
GSK_RENDERER=gl firefox
Was der Fix nicht macht
Am Energiesparen ändert sich nichts: power/control bleibt auf auto, PRIME bleibt auf on-demand, die GPU schläft weiter. Der Fix nimmt ihr nur den Grund, dauernd aufzuwachen. Unterm Strich wird sie jetzt sogar seltener geweckt als vorher.
Nicht abgedeckt sind Anwendungen, die nicht GTK4 sind, aber selbst Vulkan enumerieren – Electron/Chromium-basiertes und Qt6. Wer das auch loswerden will, kann die dedizierte GPU mit prime-select intel komplett abschalten. Dann ist die ganze Problemklasse weg, aber eben auch CUDA und Offload, und Monitorausgänge, die an der NVIDIA hängen, funktionieren nicht mehr.