Fedora: Lüftergeschwindigkeit einer NVIDIA-Grafikkarte

Direkte Linux-Programmierung, POSIX
Antworten
Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Fedora: Lüftergeschwindigkeit einer NVIDIA-Grafikkarte

Beitrag von fat-lobyte » Sa Jan 19, 2013 9:43 pm

Hallo!

Falls jemand von euch eine NVIDIA-Grafikkarte besitzt, und diese aber nicht mit den proprietären Treibern "nvidia" betreibt, sondern mit dem freien Treiber "nouveau", wird derjenige wahrscheinlich ein Problem feststellen: die Lüftergeschwindigkeit ist zu hoch, die Grafikkarte zu laut.

So war das auch bei mir: ich bin vollends mit der Leistung des nouveau-Treibers zufrieden, die Lüftergeschwindigkeit war aber ein killer. Deswegen habe ich mir früher den proprietären Treiber installiert. Nicht so unter Fedora 18!!

Im neuen Kernel kann man nämlich die Lüftergeschwindigkeit manuell regulieren. Bevor ihr das tut, solltet ihr einige Warnhinweise beachten:

ACHTUNG: Hiermit könnt ihr eure Grafikkarte durchschmoren!
Ich übernehme keine Haftung für jegliche Hardware, die dadurch kaputt wird!


Ihr Arbeitet hier mit ziemlich experimentellem Kernel-Code, der euch ziemlich rohen Zugriff auf eure Hardware erlaubt. Solltet ihr versehentlich (z.B. durch einen Tippfehler) eine zu langsame Lüftergeschwindigkeit wählen, kann es bei hoher Grafikkartenauslastung dazu führen dass diese überhitzt und permanenten Schaden trägt. Bevor ihr das macht, überlegt euch bitte zweimal ob dieses Risiko eingehen wollt. Wenn ja, dann passt bitte ganz genau auf, welche Werte ihr eurem System übergebt.

Es empfiehlt sich das Paket "lm_sensors" zu installieren, und die Temperatur der Grafikkarte ab- und zu mit dem Befehl "sensors" zu überprüfen.

---

Wollt ihr Trotzdem das Problem in den Griff bekommen, habe ich hier eine kleine Anleitung um Ruhe in euer Zimmer zu bringen. Die Grobe vorgehensweise ist dabei:
1. Im Kernel erlauben, dass parameter des Treibers verändert werden
2. Ein Skript schreiben, dass die Parameter automatisch verändert
3. Dem System mitteilen das Skript zu starten


1) Um überhaupt Irgendetwas verändern zu können, müsst ihr dem Kernel den Parameter "nouveau.perflvl_wr=7777" übergeben. Keine sorge, das müsst ihr nicht manuell machen.
Öffnet die Datei /etc/default/grub, und sucht die Zeile die mit "GRUB_CMDLINE_LINUX" beginnt. Dort fügt ihr NACH dem letzten Parameter, aber VOR dem schließenden Anführungszeichen ein Leerzeichen und nouveau.perflvl_wr=7777 ein. Achtet dabei, dass keine der anderen Parameter verändert werden. Beim mir sieht die Zeile nun so aus:

Code: Alles auswählen

GRUB_CMDLINE_LINUX="rd.md=0 rd.lvm=0 rd.dm=0 $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/rhcrashkernel-param || :) rd.luks=0 vconsole.keymap=de rhgb quiet nouveau.perflvl_wr=7777"
Jetzt müsst ihr die Grub-Konfigurationsdateien aktualisieren. Das geht mit folgendem Kommando (als Root):

Code: Alles auswählen

grub2-mkconfig -o /boot/grub2/grub.cfg
Nach einem Reboot solltet ihr die Lüftergeschindigkeit verändern können.

2) nouveau hat drei Modi um die Lüftergeschwindigkeit zu regeln:
http://www.mjmwired.net/kernel/Documentation/hwmon/sysfs-interface#250 hat geschrieben: pwm[1-*]_enable
Fan speed control method:
0: no fan speed control (i.e. fan at full speed)
1: manual fan speed control enabled (using pwm[1-*])
2+: automatic fan speed control enabled
Check individual chip documentation files for automatic mode
details.
RW
0: Keine besondere Kontrolle (volle Geschwindigkeit)
1: Manuelle Kontrolle
2: Automatische Kontrolle

Schön wäre es natürlich, wenn man das ganze automatisch Regeln kann, dies hat bei meiner 9600GT (Chipsatz NV94) allerdings nicht funktioniert, weswegen ich auf Manuell zurückgreifen musste.

Um die Manuelle steuerung einzuschalten, muss man nun (natürlich als Root) in das /sys/ Dateisystem den Wert "1" schreiben:

Code: Alles auswählen

echo 1 > /sys/class/drm/card0/device/pwm1_enable
Somit ist die manuelle Steuerung scharf - ab jetzt muss man aufpassen.

Die Lüftergeschwindkeit kann man regeln, indem man einen Wert zwischen 0 und 100 in die Datei /sys/class/drm/card0/device/pwm1 schreibt. Standardmäßig ist dieser auf 100 gesetzt. Ihr könnt nun vorsichtig versuchen die Geschwindigkeit zu drosseln. Für mich hat ein Wert von 30 gut funktioniert:

Code: Alles auswählen

echo 30 > /sys/class/drm/card0/device/pwm1
Probiert das nun für eure Karte aus. Dabei solltet ihr zwischendurch die Temperatur mit dem "sensors"-Befehl überprüfen:

Code: Alles auswählen

# sensors
nouveau-pci-0400
Adapter: PCI adapter
temp1:        +61.0°C  (high = +95.0°C, crit = +105.0°C)

Ich hoffe, 61°C ist noch im Akzeptablen bereich.

Damit ihr diese Befehle nicht jedes mal eingeben müsst, schreiben wir ein kleines Bash skript:

silence-nouveau.sh

Code: Alles auswählen

#!/bin/bash


shopt -s nocasematch

case $1 in
off|0|no)
    echo 100 > /sys/class/drm/card0/device/pwm1
    echo 0   > /sys/class/drm/card0/device/pwm1_enable   
    RET=$?
    ;;
on|1|yes|"")
    echo 1   > /sys/class/drm/card0/device/pwm1_enable &&
    echo 30  > /sys/class/drm/card0/device/pwm1
    RET=$?
    ;;
*)
    RET=1
esac


shopt -u nocasematch

exit $RET


Dieses Skript dreht die Geschwindigkeit runter, wenn man es ohne Argument oder mit "on", "yes" oder "1" aufruft, und es dreht die Geschwindigkeit wieder rauf, wenn man es mit "off", "0" oder "no" aufruft. Speichert es als "silence-nouveau.sh" ab, und legt es nach /usr/local/bin/.

Probiert dieses skript ein paar Mal aus, überprüft die Temperatur. Wenn alles in Ordnung ist, können wir mit dem nächsten Schritt fortfahren.

3) Jetzt müssen wir systemd sagen, dass es unser Skript beim hochfahren Starten soll. Das tun wir, indem wir eine Unit dafür erstellen. Die sieht so aus:

silence-nouveau.service

Code: Alles auswählen

 
[Unit]
Description=Silence my nouveau-controlled NVIDIA graphics card fan

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/silence-nouveau.sh
ExecStop=/usr/local/bin/silence-nouveau.sh 0

[Install]
WantedBy=basic.target
Was das tut: "oneshot" bedeutet, dass unser Skript beendet werden muss, bevor der "Dienst" (der ja gar keiner ist) als hochgefahren betrachtet werden kann.
RemainAfterExit heißt, dass unser "Dienst" noch aktiv ist, nachdem seine ausführbare Datei (also unser Skript) beendet ist.
ExecStart und ExecStop sind die Befehle, die ausgeführt werden um unseren "Dienst" zu starten/stoppen.

WantedBy gibt an, für welches Target der Dienst gestartet wird. Ich weiß nicht genau, was "basic.target" bedeutet, aber ich nehme an, dass es das Grundsystem ist. Sprich: unser Dienst wird gestartet wenn das Grundsystem hochgefahren wird - und das ist genau was wir wollen.

Mehr Informationen zu dieser Datei gibts mit "man 5 systemd.service".

Speichert diese Datei unter /etc/systemd/system/silence-nouveau.service ab.

Um den Dienst nun zu aktivieren, müsst ihr folgende befehle eingeben:

Code: Alles auswählen

systemctl daemon-reload # lese Konfigurationsdateien von systemd neu ein
systemctl start silence-nouveau.service # Fährt euer Lüfter herunter?
systemctl stop silence-nouveau.service # Fährt euer Lüfter herauf?
systemctl enable silence-nouveau.service # Den Dienst einbinden. Ab jetzt wird er jedes mal gestartet.

So, und das wars schon. Nicht vergessen auf die Temperatur zu achten!
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Fedora: Lüftergeschwindigkeit einer NVIDIA-Grafikkarte

Beitrag von Xin » Sa Jan 19, 2013 11:50 pm

Ist sowas nicht optimal für's Wiki? ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Fedora: Lüftergeschwindigkeit einer NVIDIA-Grafikkarte

Beitrag von fat-lobyte » So Jan 20, 2013 11:24 am

Jein.
Theoretisch schon, allerdings haben einzelne Artikel in dem Wiki die angewohnheit, in den Untiefen der Vergessenheit zu versinken, ohne leicht erkennbarem Link-Pfad von der Hauptseite und sogar ohne die Möglichkeit von der Suche gefunden zu werden.
Ich schreibe Artikel für Leute, und nicht für deine Backup-festplatte ;-)

Wo würde es denn hingehören?
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Fisherman
Beiträge: 84
Registriert: Mi Jun 06, 2012 4:53 am
Wohnort: 127.0.0.1

Re: Fedora: Lüftergeschwindigkeit einer NVIDIA-Grafikkarte

Beitrag von Fisherman » So Jan 27, 2013 2:38 am

Probiert das nun für eure Karte aus. Dabei solltet ihr zwischendurch die Temperatur mit dem "sensors"-Befehl überprüfen:
CODE: ALLES AUSWÄHLEN
# sensors
nouveau-pci-0400
Adapter: PCI adapter
temp1: +61.0°C (high = +95.0°C, crit = +105.0°C)

Ich hoffe, 61°C ist noch im Akzeptablen bereich.
Danke für diesen netten Beitrag zum Thema Lüfter ;) ...

Um nicht den Lüfter generell auf einen "festen" Wert herunterzuschrauben, könnte man auch Crontab benutzen um jede Minute (evtl. alle 30 sec - über sleep) die aktuelle Temperatur auszulesen und entsprechend zu justieren.
Hierdurch währe die Überhitzungswahrscheinlichkeit wieder etwas geringer - vorausgesetzt man benutzt die richtigen Parameter - genauso wie du es im Thread beschrieben hast.

SUPER!
Gruß Fisherman
There is no place like 127.0.0.1

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Fedora: Lüftergeschwindigkeit einer NVIDIA-Grafikkarte

Beitrag von fat-lobyte » So Jan 27, 2013 11:20 am

Fisherman hat geschrieben:Danke für diesen netten Beitrag zum Thema Lüfter ;) ...

SUPER!
Gruß Fisherman
Danke für die Blumen :-)

Um nicht den Lüfter generell auf einen "festen" Wert herunterzuschrauben, könnte man auch Crontab benutzen um jede Minute (evtl. alle 30 sec - über sleep) die aktuelle Temperatur auszulesen und entsprechend zu justieren.
Hierdurch währe die Überhitzungswahrscheinlichkeit wieder etwas geringer - vorausgesetzt man benutzt die richtigen Parameter - genauso wie du es im Thread beschrieben hast.
Ich würde das Skript gerne nicht allzusehr aufblasen, da der nouveau-Treiber in reger Entwicklung ist, und gerade die "Powermanagement"-Fähigkeiten ausgebaut werden. Meine Hoffnung ist, dass der Treiber das irgendwann in nächster zukunft selbst kann. Sagen wir mal ab Linux 3.9.
Haters gonna hate, potatoes gonna potate.

Antworten