23 kwi 2010

Automatyczna zmiana częstotliwości CPU

Dawno tu nic nie pisałem, a dziś wpadłem na pomysł, że jednak tego bloga trochę reaktywuję. Zobaczymy, jak długo to potrwa :)

Przejdę do właściwego tematu tego wpisu. Używam laptopa i oszczędność w pobieraniu energii jest dla mnie w komputerze równie, a czasem nawet bardziej istotna niż wydajność. Gnome Power Manager bardzo dobrze sobie radzi w wydłużaniu czasu pracy na baterii, jednak brakuje mu jednej ważnej dla mnie funkcji - kontroli częstotliwości pracy procesora. Nie mam dużego stażu pod Linuksem, ale czytałem, że kiedyś taka funkcja była, lecz została porzucona, bo zarządca częstotliwości Ondemand powinien na bieżąco dostosowywać częstotliwość pracy zarówno na baterii, jak i zasilaniu z gniazdka. Ja jestem jednak jednym z tych ludzi, który wolą mieć na to większy wpływ i chcą by ich komputer na baterii działał dłużej, a na zasilaczu wydajniej :)

Opiszę, jak za pomocą cpufreqd zautomatyzować kontrolę częstotliwości procesora według naszego widzimisia.



Warto zacząć od instalacji omawianego narzędzia, bo nie wgrywa się ono razem z systemem:
sudo apt-get install cpufreqd

Teraz nadszedł czas na edycję reguł, jakimi ma się kierować program:
sudo gedit /etc/cpufreqd.conf

Plik zawiera pewne ustawienia ogólne, po których występują deklaracje różnych profili oraz zasady, na jakich profile mają być przełączane. Zaraz po instalacji plik wypełniony jest przykładowymi profilami i zasadami, dzięki którym konfiguruje się go bardzo łatwo bez czytania manuala, wystarczy tylko dostosować przykłady do swoich potrzeb :) Opiszę jednak, jak zbudowane są profile oraz reguły.

Tak wygląda przykładowa deklaracja profilu:

[Profile]
name=Battery
minfreq=0%
maxfreq=100%
policy=powersave
exec_post=notify-send 'Zmiana zarządcy' 'powersave'
[/Profile]

Pole name zawiera nazwę profilu, do niej będziemy się później odwoływać, przy tworzeniu reguł.
Pola minfreq i maxfreq zawierają minimalną i maksymalną częstotliwość z jaką może pracować procesor, gdy aktywny jest dany profil. Wartość można wyrazić w procentach bądź w kHz (bez podawania jednostki). Z tymi ustawieniami należy uważać, bo jeżeli ustawimy np. minimalną częstotliwość na 100%, to gdy profil będzie aktywny nie będziemy mogli nawet ręcznie zmienić częstotliwości na niższą. Listę dostępnych częstotliwości sprawdzamy poleceniem:
cat sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
W pole policy wpisujemy zarządce procesora, który ma być wtedy aktywny. Listę dostępnych zarządców można sprawdzić poleceniem:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
Pole exec_post występuje tylko w niektórych przykładowych profilach, nie jest ono wymagane i najczęściej nie jest też potrzebne. Daje ono możliwość wykonania dodatkowo zewnętrznych poleceń po aktywacji profilu, a bliźniacze exec_pre wykonuje polecenia przed aktywacją profilu. W podanym tu przykładzie wywołane jest powiadomienie gnome'a o zmianie zarządcy (trzeba mieć zainstalowany jeden z pakietów notify-osd, którego nazwy nie mogę sobie teraz przypomnieć). Ja je wykorzystuję w inny sposób, ale o tym później.

Teraz omówię budowę reguł. Przykładowa reguła wygląda tak:

[Rule]
name=Bateria
ac=off
battery_interval=0-70
cpu_interval=50-100
exec_post=echo 3 > /proc/acpi/sony/brightness
profile=Battery
[/Rule]

W pierwszej linijce podana jest nazwa zasady, kolejne linie określają warunki w jakich reguła ma zadziałać.
Pole ac określa, czy aby reguła zadziałała ma być podpięty zasilacz. Jeżeli ustawione jest na "on", to reguła zadziała tylko, gdy podpięty będzie zasilacz, a "off" - gdy będziemy pracować na baterii.
Następny warunek, to battery_interval, czyli poziom naładowania baterii wyrażony w procentach. Dzięki temu możemy ustawiać różne profile w zależności od tego w jakim stanie jest bateria.
Cpu_internal określa minimalne i maksymalne zużycie procesora, przy których zasada ma być aktywna.
Wszystkie warunki muszą być spełnione, aby zasada się uaktywniła i zmieniła profil. Zasad jest więcej, bo można np. określić, jakie procesy muszą być uruchomione, lub jaka ma być temperatura procesora. Jak ktoś chce o tym wiedzieć, to podręcznik do konfiguracji wszystko wyjaśnia:
man cpufreqd.conf
Pole exec_post działa identycznie, jak w profilach, a ostatnie pole - profile - określa który profil ma aktywować dana reguła.

Teraz wystarczy napisać odpowiednie profile, a potem reguły ich przełączania i system będzie zarządzał częstotliwością procesora tak, jak my tego chcemy :)

Ja u siebie ustawiłem, żeby przy podłączonym zasilaczu zarządcą zawsze był performance, a na baterii ondemand w czasie, gdy bateria 70% lub więcej mocy i powersave, gdy poziom naładowania jest niższy.
Dodatkowo ustawiłem w tym ostatnim profilu wywołanie funkcji, która włączają tryb oszczędności prądu na karcie dźwiękowej Intela, a w innych profilach wywołania wyłączające ten tryb. Kod moich profili i zasad wygląda tak:

[Profile]
name=AC
minfreq=0%
maxfreq=100%
policy=performance
exec_post=cat /sys/module/snd_hda_intel/parameters/power_save | grep 1 && echo 0 > /sys/module/snd_hda_intel/parameters/power_save && notify-send 'Nieaktywny' 'Tryb oszczędzania energii karty dźwiękowej'
#exec_post=echo 8 > /proc/acpi/sony/brightness
[/Profile]


[Profile]
name=Ondemand
minfreq=0%
maxfreq=100%
policy=ondemand
exec_post=cat /sys/module/snd_hda_intel/parameters/power_save | grep 1 && echo 0 > /sys/module/snd_hda_intel/parameters/power_save && notify-send 'Nieaktywny' 'Tryb oszczędzania energii karty dźwiękowej'
[/Profile]


[Profile]
name=Battery
minfreq=0%
maxfreq=100%
policy=powersave
exec_post=cat /sys/module/snd_hda_intel/parameters/power_save | grep 0 && echo 1 > /sys/module/snd_hda_intel/parameters/power_save && notify-send 'Aktywny' 'Tryb oszczędzania energii karty dźwiękowej'
[/Profile]


[Rule]
name=AC Rule
ac=on
profile=AC
[/Rule]


[Rule]
name=Battery high
ac=off
battery_interval=70-100
profile=Ondemand
[/Rule]


[Rule]
name=Battery low
ac=off
battery_interval=0-70
profile=Battery
[/Rule]

Po ustawieniu wszystkiego prawdopodobnie trzeba zrestartować usługę:
sudo service cpufreqd restart

Od teraz możemy cieszyć się większą automatyzacją naszego systemu :)

Brak komentarzy:

Prześlij komentarz

Broken Piano

Nie wiem, czy ktoś tu jeszcze zagląda (ja nie za bardzo), ale wrzucam nowy kawałek, niechaj się roznosi :)