Jak na progresivní otáčky větráčků?

Pavouk106

  • *****
  • 2 400
    • Zobrazit profil
    • Můj blog
    • E-mail
Jak na progresivní otáčky větráčků?
« kdy: 20. 07. 2018, 17:54:57 »
Zdravíčko ve spolek,

dneska jsem se rozhodl zkompilovat v Gentoo nějaké nové balíky a během kompilace GCC mi teplota CPU vyšplhala na 80 stupňů. Chlazení mám dostatečné, ale kvůli hluku je vyladěné pomocí fancontrol. No, venku je dnes 30, tak při mém nastavení maximálních otáček větráků to jaksi nestačilo a při 80 mi začal ječet speaker (nastaveno v BIOSu, abych kdyžtak včas věděl, že větráky stojí/je problém).

Poněkolikáté jsem se tedy zamyslel nad tím, jestli mi fancontrol vlastně vyhovuje. Boční větráky v HTPC (natahují vzduch do bedny) začnou být hlučné nad řekněme 1500 otáčkami, maximum ale mají přes 3000 (7cm slim typ, proto takové otáčky). Fancontrol řídí otáčky lineárně podle jedné teploty. Problém je jak v tom "lineárně", tak "podle jedné teploty". Vysvětlím:

1. Lineárně: Když nastavím maximální povolenou rychlost na 100%, tak už při poloviční teplotě (třeba 55 na CPU, což je jakmile dostane trošku kotel, i když jen momentálně) jsou slyšitelné. Když je nastavím třeba jen na 60%, tak při plné dlouhodobé zátěži CPU nestačí chladit. Kompromis vlastně není.
2. Podle jedné teploty: Mohl bych větráky řídit teplotou základní desky, která má oproti CPU setrvačnost (takže větráky nehučí během jednorázové zátěže), ale malý rozptyl teploty (řekněme 37 - 45), který limituje jejich využití (protože na 42 to vyskočí, ale už se to z nich špatně chladí dolů = pořád hučí větráky). Stejně tak bych mohl nechat CPU větrák běžet podle teploty desky déle (větrák totiž vytahuje vzduch ze skříně nahoru = pomáhá chladit i desku, pokud je CPU bez zátěže), ale fancontrol neumí řídit podle dvou teplot (v režimu "vyšší platí").

A tak jsem došel k tomu, jak vlastně jinak regulovat větráky v Linuxu? Znáte někdo něco? Šlo by také řídit je prograsivně - čím vyšší teplota, tím více přidávat otáčky (ne lineárně) - tak by byly větráky třeba do 60 stupňů potichu, pak by začaly víc a víc řvát, až by při 80 jely klidně naplno.

Pokud ne, může to skončit i tím, že se pustím do skriptu fancontrol a poprvé za cca 10 let používání Linuxu předělám již hotový opensource produkt k obrazu svému. Ale do těch 600 řádek bash skriptu se mi moc nechce... Je to moc robustní (což je správně), špatně se mi to čte. Nejsem žádný programátor ani kodér, plácám si jen své věci...


Kit

Re:Jak na progresivní otáčky větráčků?
« Odpověď #1 kdy: 20. 07. 2018, 20:55:47 »
Na tohle bych asi použil ATtiny85, do kterého můžeš použít jako vstup nejen teplotu, ale i její derivaci. Otáčky pak při zvýšené zátězi vzrostou téměř ihned a také rychle opadnou.

Pokud však deska přímo poskytuje teplotu procesoru a umožní měnit otáčky ventilátoru, tak bude mnohem jednodušší napsat malý prográmek přímo pod Linuxem.

Kit

Re:Jak na progresivní otáčky větráčků?
« Odpověď #2 kdy: 20. 07. 2018, 21:58:01 »
V Gentoo můžeš začít těmito příkazy:
Kód: [Vybrat]
emerge --ask sys-apps/lm_sensors
sensors-detect

Re:Jak na progresivní otáčky větráčků?
« Odpověď #3 kdy: 21. 07. 2018, 08:12:36 »
...
Poněkolikáté jsem se tedy zamyslel nad tím, jestli mi fancontrol vlastně vyhovuje.
...
Fancontrol řídí otáčky lineárně podle jedné teploty.
...

Nesouhlasím. Cituji man fancontrol :
"Currently the speed increases quadratically with rising temperature. This way you won't hear your fans most of the time at best."

Plus máte k dispozici parametry MINTEMP a MAXTEMP. Viz opět manuálová stránka.

Podle mých zkušeností je fancontrol rozhodně víc laditelný, než autonomní servosmyčka zapečená v SuperIO švábovi, a ta jeho kvadratická závislost má taky hlavu a patu, na rozdíl od lineárních algoritmů v hardwaru. Pokud máte švába schopného autonomního řízení, a v Linuxu k němu ovladač, který to podporuje, můžete to zkusit. Ovládá se to přes nějaké pseudo-soubory v /sys/class/hwmon, tuším ani nepotřebujete lm_sensors (stačí ovladač pro HW monitor švába v kernelu).

Souhlasím s tím, že Fancontrol a tuším ani autonomní HW servosmyčka neumí brát jako zpětnou vazbu maximum ze dvou hodnot.

Pokud Vám ventilátory pod zátěží řvou a komp se spíš nestíhá uchladit, řešte tepelný odpor součástek, které se přehřívají = na procesor větší chladič (větší teplosměnnou plochu), větší průvan ve skříni. Vykašlete se na malé ventilátorky a jděte do větších průměrů. Větší vrtule dává při stejných otáčkách citelně větší kubíky za minutu. Je to základní fyzika. A ano jsou k tomu potřeba nůžky na plech nebo dlouhé peníze.

Trupik

Re:Jak na progresivní otáčky větráčků?
« Odpověď #4 kdy: 21. 07. 2018, 10:15:20 »
Napísať si vlastný fancontrol by nemalo byť príliš ťažké. Všetko je v /sys/class/hwmon/, vstupy aj výstupy, stačí v nekonečnej slučke čítať vstupné teploty, prešrotiť ich nejakým prepočtom na čísla 0-255, zapísať výstupy do PWM ventilátora (-ov) a potom si dať sleep na pár sekúnd. A môžeš tam mať algoritmus lineárny, kvadratický, exponenciálny, logaritmický, alebo hoci aj pevne danú tabuľku pre každú teplotu iné PWM. IMHO to bude ľahšie, než ohýbať "univerzálny" shellový skript fancontrol.


Pavouk106

  • *****
  • 2 400
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Jak na progresivní otáčky větráčků?
« Odpověď #5 kdy: 24. 07. 2018, 09:05:25 »
V Gentoo můžeš začít těmito příkazy:
Kód: [Vybrat]
emerge --ask sys-apps/lm_sensors
sensors-detect
Nechci znít nějak nabubřele, ale kde myslíš, že jsem vzal "fancontrol"? Samozřejmě, že teploty beru přes lm_sensors...

František Ryšánek: Podobně jako u Kita výše. MINTEMP a MAXTEMP mám samozřejmě nastaveno, jak jinak bych asi věděl, jak se to celé chová při různých nastaveních? Jak jsem zmínil ve svém příspěvku - jde o HTPC s výkonnými součástkami strčené do polouzavřené skříně (myslím teď dřevotřískový kus nábytku) s předem danými vnitřními rozměry a možnostmi. Samozřejmě, že i pomaloběžný 12cm větrák dá víc, než 7cm slim na plné otáčky... Já jsem s chlazením během normálního používání spokojen (teploty do 50 na CPU a do 40 na MB), ale jakmile zapřáhnu kompilaci na delší dobu v kuse (větší balík), teplota může vylézt nahoru.

Já hledám řešení, které mi pokryje přijatelně obě varianty. Potřebuju (například!), aby při CPU na <50 stupních běžely boční větráky ve skříni na cca 30%, při 70 stupních cca 60% a při 75+ na 100%. Potřebuju výrazný progresivní nárůst otáček v omezeném rozsahu, to mi fancontrol v jeho základu nedokáže poskytnout. Stejně tak by bylo vhodné, že jakmile by CPU bylo pod 50 stupni, tak by se řízení větráků přehodilo na teplotu MB a řídilo podle ní.

Ve finále to asi nejlépe odhadl Trupik. Prostě se vykašlu na fancontrol a napíšu si vlastní skript, který si podle hodnot v /sys bude řídit otáčky (opět pomocí /sys) úplně sám. Navíc vlastním skriptem budu moct pomáhat při vytahování tepla ze skříně i CPU větrákem.

Šlo mi o to, jestli náhodou neexistuje už nějaké jiné hotové řešení. Asi ne.

Momochodem - Kite, nápad s ATTiny dobrý. Možná by se to dalo využít i jinak :-)
« Poslední změna: 24. 07. 2018, 09:07:27 od Pavouk106 »

Re:Jak na progresivní otáčky větráčků?
« Odpověď #6 kdy: 24. 07. 2018, 09:24:53 »
Pokud ti to pomuze, tak ja na to kdysi pouzival zhruba neco takoveho (pro GPU, ale princip zustava):

Kód: [Vybrat]
#!/usr/bin/fish

echo "1" > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1_enable

read T </sys/class/drm/card0/device/hwmon/hwmon0/temp1_input

echo "Actual GPU temperature is $T"

switch (echo $T)
case '1????'
        echo 0 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '2????'
        echo 0 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '3????'
        echo 0 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '4????'
        echo 0 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '57???'
        echo 32 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '58???'
        echo 64 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '59???'
        echo 64 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '5????'
        echo 16 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '60???'
        echo 96 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '61???'
        echo 96 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '62???'
        echo 96 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '63???'
        echo 96 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '64???'
        echo 96 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '6????'
        echo 128 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '7????'
        echo 190 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '8????'
        echo 255 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
case '*'
        echo 255 > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
end;

+ systemd Unita + systemd timer

Spichnute na kolene (a ten kod je ocividne krehky, kdyz se podivas trebas na to, jak moc zalezi na poradi tech case), ale pak jsem si pohral s fancontrolem a nechal ten...