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 🙂

Ja vs. asembler pod Linuksem – 1:0

Dostałem do wykonania projekt z architektury komputerów, polegający na napisaniu pewnego programu w asemblerze i w związku z tym, że windows nie jest moim ulubionym systemem i staram się w tym semestrze go unikać, postanowiłem pisać pod Linuksem  i na ten system właśnie (NASM).

Oto treść zadania:

Napisz program, który pobiera ciąg znaków z wejścia i wypisuje na wyjściu znaki z tego ciągu – jeden znak w linii. Program powinien zakończyć pracę po naciśnięciu przez użytkownika klawisza BACKSPACE + modyfikacje.

Modyfikacje:

  • Każdy znak w nowej linii będzie poprzedzony ilością spacji równą numerowi wiersza.
  • Inny klawisz, oprócz backspace
  • Poniżej statystyka – wypisywanie i zliczanie liter dużych, małych, cyfr i znaków specjalnych

Z materiałami do nauki nie było łatwo, bo większość kursów jest o programowaniu w dosie, a kursy linuksowe najczęściej opisują niewiele więcej niż ‚Hello world’. Zadanie samo w sobie było raczej dla piszących pod dosa, bo musiałem na przykład zaprogramować bezbuforowe wejście klawiatury, które pod dosem jest banalnie łatwe do zrobienia (gotowa funkcja), a pod Linuksem sprawia trochę problemów (sam go nie napisałem, wkleiłem po prostu ~80 linijek tekstu znalezionego w sieci i przy oddawaniu projektu mówiłem, że jest to odpowiednik trzech linijek, które pisali inni z mojej grupy).

Aby ułatwić zadanie ludziom, którzy mają, lub będą mieli kiedyś podobny program do napisania na jakieś zajęcia, umieszczam źródła programu wraz z makefile’em do pobrania, oraz źródło do przeglądania online. Mam nadzieję, że komuś, kiedyś się przyda 😉

Google Chrome 4 beta

O Chrome pewnie każdy (z wyjątkiem wyznawców niebieskiego ‚e’)  słyszał, a jeżeli nie, to w skrócie powiem, że jest to superszybka przeglądarka od Google’a. Od jakiegoś czasu można testować kolejne buildy wersji beta pod pingwinkiem. Polecam, ja nawet zacząłem się przymierzać do całkowitego porzucenia Ognistego Lisa. Google przygotował repo z gotowymi paczkami, nic tylko dodawać, instalować, testować 🙂

Zaraz napiszę, jak dodać sobie nową linijkę do repo, ale uprzedzam: piszę tylko o dystrybucjach debianopochodnych (głównie Ubuntu, bo jego używam) i repo, które podam, zawiera pakiety w wersjach testowych (aczkolwiek całkiem stabilnych) i wszystko robicie na własne ryzyko, bla bla bla… 😛


Linijka do apta, która da nam upragnioną paczkę to:

deb http://dl.google.com/linux/deb/ testing non-free #Google Testing

aby szybko dodać ją do swoich źródeł wklejamy w konsoli:

sudo sh -c 'echo "deb http://dl.google.com/linux/deb/ testing non-free #Google Testing" >> /etc/apt/sources.list'

Klucz apt dodajemy komendą:

sudo sh -c 'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -'

Zostało już tylko odświeżyć listę pakietów i zainstalować przeglądarkę:

sudo apt-get update && sudo apt-get install google-chrome-unstable

Gotowe. Najnowsza beta Chrome’a czeka na jazdę próbną 🙂
Dodam tylko, że przeglądarka obsługuje rozszerzenia (funkcja cały czas jest rozwijana) i pojawiła się strona, która jest odpowiednikiem bazy rozszerzeń Firefoksa – chromeextensions.org. Nie ma jeszcze ich dużo, ale za to można w miarę szybko przejrzeć wszystkie 😛 Mam nadzieję, że w dniu premiery wersji stabilnej wybór będzie trochę większy 🙂

PS: Jeżeli ktoś jednak woli dystrybucje bez apta, debów itp., to może zajrzeć na google.com/linuxrepositories/testrepo.html, gdzie podane są repozytoria dla innych dystrybucji.