Portál AbcLinuxu, 30. dubna 2025 10:09
Po inštalácii súčasnej verzie linuxu (Kubuntu 6.10) na noťase som si všimol mierne vačšiu teplotu (a tým aj hlučnosť a teplotu) notebooku. Nejak som sa s tým zmieril, ale odkedy ho na noťase používam ako hlavný systém, celkom ma to trápi. Takže tu zhrniem svoje (skromné) poznatky a ešte do éteru nastolím jeden kvíz pre vaše hračky - notebooky.
Mám notebook s druhou generáciou centrino platformy - sonoma: Pentium M 1.73, úplne štandardná konfigurácia . Ako asi väčšina ľudí, čo toto číta, vie, je možné s tým procesorom šetriť energiu (+ovplyvňovať výkon) viacerými spôsobmi. Od dynamického taktovania procesoru, cez podvoltovanie až po využívanie stavov C1-Cn.
Väčšina plnohodnotných notebookových procesorov (Pentium, Core, Turion) podporuje túto funkcnionalitu. Podpora do jadra sa dostane pomocou zodpovedajúcich modulov (napr. speedstep-*, powernow-*), potom stačí už len použiť démona typu powernowd, cpufreqd na dynamickú úpravu frekvencie podľa vyťaženia procesora.
Toto je vec o ktorej nevie úplne každý, čo používa notebook - aj keď sa tým dajú dosiahnúť dosť veľké úspory energie (podvoltovať procesor z +/- 0.95 na 0.7 V sa nejakou tou polhodinou výdrže navyše prejaví). Do jadra sa to dá dostať pomocou patchu Linux PHC. Nefunguje to však pre všetky procesory - Pentium M sú bez problémov (obe generácie), Core fungujú s istými hackmi, AMD vraj vôbec (aspoň to píšu na webe). Patch zo zrejmých dôvodov neumožňuje zväčšenie voltáže (ibaže by človek potreboval noťasom vykurovať, to potom môže trochu hacknúť orignálny patch). Po troche experimentovania sa môže človeku podariť zníženie napätia procesora o už spomenutých 0.2 V - aj pri maximálnej fekvencii, čím dôjde k výraznému zníženiu "tepelných strát"
Toto je môj kameň úrazu. Procesor môže pracovať na rôznych úrovniach výkonu, do ktorých sa prepína (resp. je prepínaný jadrom) podľa potrieb. Čím väčšie je číslo aktuálneho stavu, tým hlbšie je procesor uspatý (je vypnutých viac blokov), tým viac šetrí energiu a tým dlhšie trvá jeho prebudenie (aj keď sú to stále, tipujem, nano až mikrosekundy). Z toho čo som vypozoroval (na svojom NB), sa mení počet C stavov v závislosti od toho, či je notebook napájaný zo zásuvky alebo na baterky. V prvom prípade má C1-C3, v druhom o jeden viac.
Známym problémom centrino platformy je neprepínanie sa do hlbších stavov v prípade, že je do USB zapojené jedno alebo viac zariadení. V tom prípade procesor beží vždy v jednom stave (v mojom prípade je to stav C2 pri oboch druhoch napájania).
Zaujímavé pozorovanie: zatiaľ som svoj procesor nikdy nevidel bežať na C1
V súbore /proc/acpi/processor/CPU0/power je možné sledovať využitie jednotlivých stavov počas behu procesora, pričom sa tieto čítače vyresetujú vždy po prechode z AC na batériu a naopak (zrejme kvôli zmene počtu stavov). Práve tu nastáva prvý problém, ktorý sa už nejakú dobu snažím vyriešiť. Po odpojení všetkých USB zariadení stále ostáva pomer C2:C3 použitých pri nečinnosti asi tak 0.35-0.4, kým vo Windows som mával, odhadom, okolo 0.1. A čo je ešte horšie, pri spustení AmaroKu (iný program na prehrávanie som pri tejto príležitosti neskúšal (yet)) sa znovu používa iba C2 (žeby to bolo zvukovkou? alsou?). Výsledkom vo všetkých prípadoch je procesor na 44-45˚C a neustále zapnutý ventilátor (a z toho vyplývajúca asi 1/2-3/4 výdrž noťasu na baterky oproti windowsom).
Už som sa s tým naučil žiť, ale rád by som od tých, čo sa dočítali až sem, zistil, ako to vyzerá u nich. Napísal som malý bogovitý ale v podstate funkčný skriptík, ktorý ten pomer priebežne počíta:
#!/bin/sh CP2=`cat /proc/acpi/processor/CPU0/power | grep 'C2:' | sed "s%.*duration.\(.*\).%\1%"` CP3=`cat /proc/acpi/processor/CPU0/power | grep 'C3:' | sed "s%.*duration.\(.*\).%\1%"` #echo $CS while true; do clear C2=`cat /proc/acpi/processor/CPU0/power | grep 'C2:' | sed "s%.*duration.\(.*\).%\1%"` C3=`cat /proc/acpi/processor/CPU0/power | grep 'C3:' | sed "s%.*duration.\(.*\).%\1%"` CD2=`echo $C2 - $CP2 | bc` CD3=`echo $C3 - $CP3 | bc` CDS=`echo $CD2 + $CD3 | bc` CDP=`echo "scale=3; $CD2/$CDS" | bc` echo $CD2 $CD3 $CDS "=>" $CDP CP2=$C2 CP3=$C3 sleep 1 done
Očividne to nefunguje, ak má človek viac ako 3 C-stavy (alebo iné označovanie procesorov), alebo ak sa používa iný ako C2 a C3. Keď tak sa to dá celkom jednoducho upraviť :) Dúfam že vás čím viac napíše do diskusie, ako to vyzerá v priemere na vašom noťase, nech je s čím porovnávať. Dobré by bolo možno aj uviesť typ procesoru, frekvenciu, chipset, distribúciu a verziu jadra.
Skúšal som nabootovať do single módu a vypisovalo to stále približne tie hodnoty okolo 0.35-0.4, až kým som nezačal odoberať moduly. Keď mi ostalo skoro holé jadro - bez zvukovky, usb a podobných vymožeností, dostal som sa skoro k 0.1. A to teda stále nie je godknowswhat, keď procesor v podstate nemá čo robiť (zobrazuje statickú konzolu) a pritom 10% času núti procesor pracovať. O to drsnejšie je potom tých ~0.35, keď bol prakticky v tom istom stave - až na to, že v tomto prípade majú moduly linuxu nehoráznu (doslova) réžiu. Alebo mám ja niečo nehorázne zhnité v systéme .
Aby bol zoznam kompletný, ešte sa zmienim o podtaktovaní grafiky. Neviem ako je to u nvidie, ale linuxácke binárne ovládače ATI (fglrx) podporujú PowerPlay (nastaviteľné cez aticonfig --set-powerstate). Nastavením najnižšieho módu sa tiež dá ušetriť kopa energie (pokiaľ viem, je to presne ten istý rozsah PowerPlay ako Catalystoch na windows).
Keďže mám väčšinu času k notebooku pripojené rôzne usb komponenty (externý disk, myš, bluetooth), posledný bod by ma netrápil do momentu, keď chcem fungovať na batérie. Dosť dobrý problém majú potom ludia, ktorých výrobca notebooku použil "fake-usb-komponenty" (ako usb webkamery integorvané priamo nad displayom, usb bluetooth v tele notebooku) a ich procesor teda beží neustále naplno. Vďaka nemožnosti vypnúť tieto hračky potom prichádzajú o dobré percentá výdrže.
ALE. Aj keď mám všetky komponenty pripojené, stále môžem povedať, že za čias windows býval notebook chladnejší - pri rovnakých hodnotách taktu procesora, voltáže, ati powerplay... Kým vo widliach sa mi ventilátor roztočil pri nečinnosti povedzme raz za 20. minút na 5 minút, v linuxe beží stále. Takisto mám pocit, že je celkovo teplejší napr. v oblasti kde sú ram/wifi karta. O disku to isté radšej nepoviem, to už by bolo fakt absurdné (ibaže by som nebol zachytil jeho vypínanie vo windows, potom by to dávalo zmysel).
Preto - moja druhá otázka do éteru je: Existuje ešte niečo, čím je možné notebook priviesť k menšej teplote? Aj so zapojenými USB komponentami teda... Nejak pochybujem, že by šli podtaktovať RAMky za jazdy - o tom som teda ešte nepočul. Ešte som rozmýšlal o tzv. throttlingu, ale celkom pochybujem, že to windows využívajú. Existuje potom vôbec nejaký démon, ktorý by vedel na základe využitia procesoru meniť úroveň trottlingu? (niečo ako cpufreqd - cputhrotld). Bolo by skvelé, keby sa ozval niekto, čo tomu fakt rozumie
The end, respect všetkým čo došli na koniec
PS: tie reči o skvelých časoch windows si nevšímajte, s5 by som už nešiel, za to pohodlie v linuxe mi tých pár stupňov tepla navyše stále stojí, hlavne teraz v zime
Tiskni
Sdílej:
798000:764,700,1064000:764,1330000:844,1730000:1052A chodi to ok (pri max. frekvencii je to dokonca o 0.3V menej ako default. Nasiel som si aj programcek pre Win, kde si nastavujem rovnake hodnoty: http://www.pbus-167.com/ Teplota pri teste (cat /dev/urandom >/dev/null) vybiehala pri defaultnom voltovani na 70C. Pri podvoltovanom procaku je max. 57C. To znamena zaroven level 3 vetraku oproti iba levelu 1 a teda aj znatelne tichsi chod. Dokonca je procak schopny aj sam vychladnut z 51C (co je teplota pri ktorej sa vypina vetrak a teda teoreticky procak nema preco by chladol dalej) na 49C. Nejake testy na vydrz baterky som este nerobil
(standard_in) 1: illegal character: : (standard_in) 1: parse error (standard_in) 1: parse error (standard_in) 1: parse error (standard_in) 1: parse error (standard_in) 1: parse error (standard_in) 1: parse errorupravený skriptík:
#!/bin/sh CP1=`cat /proc/acpi/processor/C0BE/power | grep 'C1:' | sed "s%.*duration.\(.*\).%\1%"` CP2=`cat /proc/acpi/processor/C0BE/power | grep 'C2:' | sed "s%.*duration.\(.*\).%\1%"` #echo $CS while true; do clear C1=`cat /proc/acpi/processor/C0BE/power | grep 'C1:' | sed "s%.*duration.\(.*\).%\1%"` C2=`cat /proc/acpi/processor/C0BE/power | grep 'C2:' | sed "s%.*duration.\(.*\).%\1%"` CD1=`echo $C1 - $CP1 | bc` CD2=`echo $C2 - $CP2 | bc` CDS=`echo $CD1 + $CD2 | bc` CDP=`echo "scale=3; $CD1/$CDS" | bc` echo $CD1 $CD2 $CDS "=>" $CDP CP1=$C1 CP2=$C2 sleep 1 donecat /proc/acpi/processor/C0BE/power
active state: C2 max_cstate: C8 bus master activity: 00000000 states: C1: type[C1] promotion[C2] demotion[--] latency[000] usage[13964420] *C2: type[C2] promotion[--] demotion[C1] latency[100] usage[59999100]
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.