Zielone procesorki…

… czyli rzecz o skalowaniu częstotliwości taktowania procesora.

Wprowadzenie

Jakoś zawsze miałem pecha do nowych technologii – świat wprowadzał coraz to wymyślniejsze sposoby wykorzystania ludzkiej wiedzy, a ja albo w ogonie postępu byłem, albo coś mi tam nie chciało na Linuksie zadziałać. Podobnie miała się rzecz ze skalowaniem częstotliwości procesora. Nie zwracałem do tej pory na to większej uwagi, bo laptop który był na mych usługach od paru lat, po prostu nie miał takiej funkcjonalności (tak, z moim szczęściem kupiłem właśnie takiego), na pudle stacjonarnym przewijały mi się różnie Durony, Athlony, które na owe czasy też nie chciały dać się oszczędniej taktować, itp. Zatem zaszufladkowałem temat z etykietką ‘Nie wiem, nie znam się, zarobiony jestem’. A potem kupiłem (ostatnio) laptopa, na którym zainstalowałem sobie Ubuntu i takie rzeczy jak skalowanie procesora zadziałały z marszu. “Ba, bo to laptop, one są stworzone do takich rzeczy” i byłbym przeszedł do porządku dziennego, gdyby nie fakt, że choćby drożeje energia elektryczna, czy też czuję się odpowiedzialny za dziurę ozonową – no ruszyło mnie sumienie. Czy mój pecet biurkowy musi grzać ile wlezie?

Plac zabaw

Mój Debian jest tak leciwy, że pamięta jeszcze czasy schwytania Saddama. Oczywiście, cały czas karmię go aktualizacjami z ‘unstable’, ale nawet nie liczę, że w cudowny sposób te wszystkie dogodności Linuksa same, magicznie, zaczną mi działać. Rozejrzałem się zatem wkoło i oto, czego potrzebujemy, aby dało się opanować rozpierające procesor moce :
– kernel 2.6.X – in nowszy, tym lepiej – ja testowałem wszystko na 2.6.22 (ponoć od 2.6.20 nie powinno już być problemów ze skalowaniem)
– paczki cpufrequtils, sysfsutils (instalowane tak jak lubisz – apt-get, aptitude, synaptic, itp.)
– komputer z procesorem

Bat na niepokornego

Mamy zatem odpowiednie paczki, kernel taki jak trzeba i jesteśmy pełni dobrej woli ocalenia świata od zalewającego go ciepła z wnętrza naszego komputera.

Teraz będzie z górki – bo musimy ustalić, jaki mamy procesor. Onaniści Miłośnicy sprzętowi na pewno znają na pamięć nawet numer seryjny tego podzespołu, ale jak ktoś nie wie, to :

cat /proc/cpuinfo | grep name

Po co nam to wiedzieć? Aby załadować odpowiedni sterownik obsługujący skalowanie naszego procesora. A do wyboru mamy moduły:

Pentium 4, Celeron D, Pentium D, Celeron M : p4_clockmod
Pentium M, Core Duo, Core 2 Duo : speedstep_centrino
AMD K6 : powernow_k6
AMD K7 (Athlon, Duron, Sempron 32) : powernow_k7
AMD K8 (Athlon 64, Turion 64, Sempron 64, Opteron 64) : powernow_k8
Żaden z powyższych : acpi_cpufreq (bez gwarancji, że zadziała)

W katalogu /lib/modules/`uname -r`/kernel/arch/i386/kernel/cpu/cpufreq/ można wypatrzeć jeszcze inne moduły – jeżeli dla naszego procesora nie zadziała żaden z powyższych sterowników, można kombinować z tymi, które znajdziemy właśnie w tamtym katalogu (modinfo nazwa_modułu podpowie, do jakich modeli możemy ich użyć).

Wybrany moduł ładujemy:

modprobe nazwa_modułu

Polityka, kajdany dla niesfornych

Mając załadowaną obsługę skalowania, potrzebujemy jeszcze jednego modułu (lub kilku), określającego tzw. politykę zarządzania zasobami (policy governor). I znowu przegrzebujemy stosowne katalogi i znajdujemy, że możemy użyć następujących zasad:

ondemand : moja ulubiona reguła, która ustawia prędkość procesora dynamicznie, w zleżności od obciążenia. Moduł cpufreq_ondemand
performance : ustawia taktowanie na najwyższe z możliwych, statycznie. Moduł cpufreq_performance
powersave : a ten z kolei, ustawia statycznie taktowanie na najniższe z możliwych. Moduł cpufreq_powersave
conservative : podobnie jak ‘ondemand’, reguluje taktowaniem dynamicznie, lecz sprawdza się lepiej na laptopach. Moduł cpufreq_conservative

Jeżeli już zdecydujemy się na jedną z powyższych zasad karcenia niepokornego procesorka:

modprobe moduł_polityczny

Ach śpij…

Mamy sterownik, mamy wybraną politykę zarządzania taktowaniem, co teraz. Musimy przekazać ‘gdzieś’, jak ma być procesor skalowany. W tym celu edytujemy plik /etc/init.d/cpufrequtils i odnajdujemy linijkę z :


GOVERNOR=”ondemand”
MAX_SPEED=”2128000″
MIN_SPEED=”1596000″

Bystrzaki dostrzegą, że w miejsce “ondemand” mogą (a nawet powinni) wpisać wybraną przez siebie politykę zarządzania ruchem.
MAX_SPEED i MIN_SPEED? Teoretycznie, może zostać bez wartości (puste “”), ale dla pewności wpisałem wartość maksymalną i najniższą jaką można ustawić na moim CoreDuo2. A jaką można na waszych? Wystarczy uruchomić polecenie cpufreq-info -l:

1596000 2128000

Ten wynik to odpowiednio wartość dla MIN_SPEED i MAX_SPEED.

Ok, powypisywaliśmy w tym pliku co trzeba, restartujemy cpufrequtils (/etc/init.d/cpufrequtils restart). I…

Czy to działa?

… sprawdzamy, czy coś zdziałaliśmy przez cpufreq-info -p:

1596000 2128000 ondemand

Jeżeli wynik pokrywa się z polityką jaką ustaliliśmy wcześniej i MIN_SPEED i MAX_SPEED, to można świętować. Prawie. Pozostaje jeszcze dopisać do /etc/modules moduły które załadowaliśmy do pamięci.

echo "nazwa_modułu_sterownika" >> /etc/modules
echo "nazwa_modułu_polityki" >> /etc/modules

Cieszymy się?

Teoretycznie, to powinno wystarczyć, aby wszystko zachowywało się tak, jak byśmy tego chcieli. Jednak, dla starszych wersji cpufrequtils, może zajść potrzeba ustawienia ‘na sztywno’ polityki zarządzania, w taki dziwny sposób (do sprawdzenia w biegu):

echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

I dopisać do /etc/sysfs.conf:

devices/system/cpu/cpu0/cpufreq/scaling_governor = ondemand

Być może na całe powyższe istnieje ładniejszy (z GUI?) sposób, ale w terminalu jest wygodniej a i mój system tylko na takie szturchanie w wątpia reaguje.

Poza tym, lubiący wskaźniki, wykresiki, mogą zainstalować sobie paczkę gnome-applets (dla Gnome) lub xfce4-cpufreq-plugin dla XFCE (swoją drogą, pluginy dla panelu to najbrzydszy element XFCE). Dodajemy do panelu odpowiedni applet i już widzimy, czy i jak się skaluje. Niestety, nie podam analogicznej wtyki dla KDE, bo nie znam. Dodatkowym bajerem jest np. paczka cpufreqd, która umożliwia profilowania polityki oszczędzania taktów – np. działamy na baterii, to włącza się conservative, na zasilaniu – ondemand, itp.

I w ten oto sposób staliśmy się w pełni świadomymi mieszkańcami naszej planety, którzy dbają o limitowanie wydzielanej i pobieranej energii. I rachunki niższe płacą. A co.
 

13 komentarzy

  1. Dzięki wielkie za tego tutorialka. Czegoś takiego kiedyś szukałem. Teraz jest podane na tacy, więc zaraz wypróbuje. 🙂

  2. Dzięki, na pewno się przyda! Zauważyłem, że ostatnio się to staje “modne” to już kolejny artykuł na o tej tematyce (oszczędzenie energii), na jaki trafiłem w tym miesiącu.

  3. Z tego co wiem to samo skalowanie czestotliwosci daje niewielkie oszczednosci (o ile w ogole jakies). Dopiero w polaczeniu ze zmiana napiecia daje wymierne korzysci. Tak na marginesie to co to ma wspolnego z dziura ozonowa? 😉

  4. @Ximian
    A czy zmiana częstotliwości nie jest realizowana za pomocą zmiany napięcia? Cyt.
    “The cpufrequtils package consists of a library which offers an unified access method for userspace tools and programs to the CPU frequency and voltage scaling (cpufreq) subsystem in the Linux kernel…”

    A dziura ozonowa jest synonimem cyklistów naszych czasów – jak nie wiadomo, za co ktoś ponosi odpowiedzialność, to winna jest dziura ozonowa 🙂 A dziura, jak powstaje, każdy w miarę wie, stąd troska moja troska o środowisko i zbędne waty/ciepłotę (wiadomo, w skali jednego, ba, setki osób, to kropla, ale kropelka do kropelki… ).

  5. W przypadku procesorow korzystajacych z p4_clockmod (np. moj Celeron M w laptopie), skalowanie czestotliwosci nie daje zadnych oszczednosci energii – dlatego np. w ubuntu dla tych CPU skalowanie nie jest wlaczone.

    Swoja droga, w takim przypadku, wlaczanie skalowania nie dosc ze spowolni system, to jeszcze obciazy bardziej baterie (czeste przelaczanie pomiedzy roznymi czestotliwosciami).

    Racje ma ximian, mowiac, ze sens to ma dopiero przy procesorach obslugujacych obnizenie napiecia rdzenia (w P4 i Celeron Mobile NIE JEST OBNIZANE NAPIECIE, a regulowany jest jedynie zegar – dzieki czemu mozna ew. ochlodzic procesor, ale nic wiecej)

  6. @madman
    To prawda, wiele zależy od posiadanego sprzętu – ale jeżeli np. laptop ma Celerona M, wiatraczek z czujką temperatury, to mniejsza częstotliwość procka->mniejsza temperatur->mniej prądu na wiatraczek – finalnie jakaś teoretyczna oszczędność jest.

    U siebie na CoreDuo2 zauważasz fluktuacje vcore w zależności od obciążenia systemu/częstotliwości taktowania.

  7. Bardzo dobry tutorial, do tej pory zawsze kiedy potrzebowałem wpisywałem w google “cpu freq debian” i robiłem wg tego co się znalazło, jakiś czas temu przeczytałem to, oznaczyłem gwiazdką w GoogleReader i dzisiaj się przydało – działa elegancko.
    Dwie kwestie:
    1. Bzdurą jest że w przypadku Celerona M nie ma sensu skalować procesora, po pół godziny pracy na 1,7 GHz u mnie włącza się chłodzenie które już się nie wyłączy, skalowanie pozwala włączać wiatraczek raz na godzinę na 15 sekund (chyba że czymś obciążam na maxa procka przez dłuższy czas to wg potrzeb). Zalet chyba nie muszę tłumaczyć.
    2. Dla użytkowników KDE – jest kilka sposobów sprawdzania jak tam nam się aktualnie skaluje, IMO najfajniejszym i używanym przeze mnie jest dodanie do dowolnego apletu Superkaramby:

    sensor=program interval=5000 program=”cat /proc/cpuinfo | grep ‘cpu MHz’ | sed -e ‘s/.*: //’ | awk -F \. ‘{print $1}'”

  8. Posiadam Acer Extensa 5220 z Celeronem 530 1.73GHz pracujacego pod Ubuntu 7.10. Pracuje on aktualnie 2 minuty z wiatraczkiem i dwie bez. Chetnie bym zaoszczedzil troche energi by polepszyc ten slabiutki bilans. Przeczytalem juz kilka podobnych opracowan ale nie moge sobie poradzic:
    sudo modprobe p4_clockmod
    FATAL: Error inserting p4_clockmod (/lib/modules/2.6.22-14-generic/kernel/arch/i386/kernel/cpu/cpufreq/p4-clockmod.ko): No such device (identycznie z acpi_cpufreq)
    i wszystko sie konczy zanim sie zaczelo.
    Nie mam tez katalogu /sys/devices/system/cpu/cpu0/cpufreq

    Jedni pisza o dedykowanej kompilacji jadra ale czy ktos z Was to robil bo tu sie o tym nie wspomina?

    Pozdrawaim,
    na.maxa

  9. Jeżeli spada temperatura procesora to automatycznie musi spadać zużycie prądu przez ten procesor. Przeciez ciepło procesora skąś się bierze, chyba że próbujecie tu tworzyć nowe perpetum mobile 🙂

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Post comment

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.