Ubuntu 11.10 to nie tylko Unity ale też rozmaite zmiany pod spodem, z jądrem 3.0 na czele. Niestety … także tutaj po upgrade zderzyłem się z kilkoma problemami, w tym czterema związanymi z zarządzaniem energią:
-
laptop zaczął mi się łatwo nagrzewać – nawet nie robiąc niczego obciążającego procesor,
-
znacznie skrócił się czas pracy na baterii (do około godziny),
-
system nie sygnalizuje już wyczerpanej baterii i nie hibernuje się, po prostu nagle i bez ostrzeżenia laptop wyłącza się,
-
po hibernacji aplet prezentujący stan baterii nie może jej odnaleźć.
Są także pozytywne zmiany: od upgrade ani razu nie przydarzył mi się problem z wi-fi.
Sprawy detekcji stanu baterii dotychczas nie udało mi się rozwiązać i może być tu coś niestandardowego (min. ponieważ na moim Lenovo domyślne suspend i hibernate powodują zwis systemu, używam TuxOnIce).
Na pierwsze dwa problemy pewne recepty znalazłem, po ich zastosowaniu typowa raportowana temperatura to obecnie 50-60⁰C a nie 70-80⁰C które często widywałem od upgrade, czas pracy na baterii także zauważalnie się wydłużył.
Oszczędzanie energii peryferii
Zasadniczy problem nie dotyczy tylko Ubuntu, jest dość szczegółowo opisany i wiąże się ze zmianami w samym kernelu. W skrócie: jądro Linuksa zaczęło wyłączać tryby oszczędzania energii jeśli BIOS nie informuje o ich używaniu, co formalnie jest poprawne ale w praktyce – gdzie jakość informacji pochodzących z BIOSu bywa … różna – prowadzi do znacznego zwiększenia zużycia energii na niektórych komputerach (efekt występuje lub nie zależnie od sprzętu i BIOSu).
Trwają prace nad poprawkami ale póki co problem można rozwiązać prostą rekonfiguracją jądra:
dodaniem parametru pcie_aspm=force
.
Zaklęcie to (szczegółowy opis np. tutaj) po prostu
wymusza stosowanie oszczędzania energii niezależnie od tego co raportuje
BIOS.
Nałożyłem to następująco:
-
otworzyłem w edytorze plik
/etc/default/grub
-
znalazłem definicję zmiennej
GRUB_CMDLINE_LINUX_DEFAULT
, w moim wypadku miała ona postać
GRUB_CMDLINE_LINUX_DEFAULT="quiet nosplash resume=swap:/dev/sda7"
i dodałem tam pcie_aspm=force
:
GRUB_CMDLINE_LINUX_DEFAULT="quiet nosplash pcie_aspm=force resume=swap:/dev/sda7"
- zapisałem plik i odpaliłem
sudo update-grub
- zrebootowałem komputer
W /var/log/syslog
po każdym reboocie pojawia się wzmianka:
Nov 12 22:32:54 banach kernel: [ 0.000000] PCIe ASPM is forcedly enabled
no i … laptop chłodniejszy.
Częstotliwość pracy procesora
Druga poprawka dotyczy częstotliwości taktowania procesora – nie ma
potrzeby, by stale pracował stale w trybie maksymalnej
wydajności. Ubuntu domyślnie ustawia (sensownie) tryb Ondemand
, tj.
dostosowywanie szybkości pracy do aktualnego obciążenia (procesor
jest niżej taktowany gdy nie jest potrzebny).
Odpowiada za to
/etc/init.d/ondemand
(i symlinki doń w/etc/rc*.d
).
Niemniej, czasem warto przełączyć się w tryb Powersave
(stałe
działanie z wolnym taktowaniem) albo Conservative (tryb podobny do
Ondemand
ale płynniej zmieniający taktowanie, co ponoć jest
przyjaźniejsze dla baterii), przydaje się też ikonka prezentująca
aktualny stan rzeczy.
Stosowany niegdyś przeze mnie aplet Gnome przestał działać, jego zastępcą dla Unity jest programik indicator-cpufreq:
sudo add-apt-repository ppa:artfwo/ppa
sudo apt-get install indicator-cpufreq
Aplecik symbolicznie prezentuje szybkość procesora (stopień zakolorowania ikonki, informacje po rozwinięciu menu) i pozwala ją przestawiać.
Można uruchamiać go z palca (komenda indicator-cpufreq
), ja
dodałem sobie to narzędzie do autostartu. W Startup Applications
domyślnie było widoczne ale nieaktywne, odklikałem odpowiedni
checkbox.
Dla kompletności dodam, że na konsoli informację o aktualnym taktowaniu podaje
cpufreq-info
a zmianę można przeprowadzić przy pomocy cpufreq-set
:
cpufreq-set -g ondemand -r
(tu ustawienie trybu ondemand na wszystkich procesorach). Oba
programy pochodzą z pakietu cpufrequtils
.
Dodatkowe oszczędności
Poniższe sztuczki zwykle nie powinny być potrzebne, realizują je narzędzia wyższego poziomu. Patrz ostatnia część artykułu.
Wynotowałem sobie jeszcze parę zaklęć związanych z oszczędzaniem
energii (do testowania z palca i ewentualnego umieszczenia w
/etc/rc.local
lub innym pliku startowym).
Dyski
Oszczędzanie energii dysków kosztem wolniejszego działania i nie działania podłączania na gorąco:
for dev in /sys/class/scsi_host/host*; do
echo min_power > $dev/link_power_management_policy
done
Odwrócić efekty powyższego można robiąc:
for dev in /sys/class/scsi_host/host*; do
echo max_performance > $dev/link_power_management_policy
done
Dźwięk
Oszczędzanie energii karty dźwiękowej (tu – Intelowej, 10 to ilość sekund nieaktywności po których urządzenie usypia):
echo 10 > /sys/module/snd_hda_intel/parameters/power_save
echo Y > /sys/module/snd_hda_intel/parameters/power_save_controller
Równoważny efekt ma dopisanie
options snd-hda-intel power_save=10 power_save_controller=Y
do /etc/modprobe.d/alsa-base.conf
.
Ustawienie może powodować problemy, pierwsze – wysoki dźwięk w chwili gdy karta się wyłącza (10 sekund od zakończenia grania), drugie – kliknięcie w chwili gdy po przerwie komputer zaczyna odtwarzać jakiś dźwięk.
Odwrócenie ustawień – odpowiednio wpisanie 0 dla power_save
i
N
dla power_save_controller
.
ASPM
Przejście ASPM w tryb oszczędzania energii:
# Przejście ASPM w tryb oszczędzania energii
echo powersave > /sys/module/pcie_aspm/parameters/policy
W tej chwili nie rozumiem, czy jest to alternatywa
dla pcie_aspm=force
, czy też uzupełnienie tej opcji.
Jupiter
Do ewentualnego obejrzenia jest też Jupiter, pod Ubuntu najprościej instalowany przez:
sudo add-apt-repository ppa:webupd8team/jupiter
sudo apt-get update
sudo apt-get install jupiter
Uruchamianie apletu przez jupiter-run
, program nie ogranicza się do
apletu, instaluje też rozmaite skrypty (np. wykonywane przy przechodzeniu z sieci na baterię i odwrotnie – /etc/pm/power.d/00-jupiter-cpu
).
Program obiecuje zbiorcze zarządzanie charakterystykami wydajności komputera (użytkownik wybiera poziom pracy a program pod spodem mapuje to na serię ustawień wielu modułów i aplikacji) a także zapamiętywanie ustawień.
Wewnętrznie są tam wykonywane zarówno różne zaklęcia na
/sys
sterujące jądrem, podobne do wyżej omawianych, jak rekonfiguracje X przy pomocyxinput
.
Moje zainteresowanie Jupiterem znacząco osłabło gdy przestawienie
Performance Modes
z domyślnego Maximum Performance
na High
Performance
spowodowało … wyłączenie touchpada (i zarazem
niemożliwość odwrócenia sytuacji bez podpinania myszy – aplet jupitera
nie jest dostępny z klawiatury). Nie budzi też zaufania zamieszanie
powodowane przezeń w /etc
(min. instalator kasuje symlinki
włączające tryb ondemand
dla procesora a deinstalator ich nie
przywraca – to cecha raczej pakietowania przez WebUpd8 niż
samego programu ale tak czy siak – problem).
Uzupełnienie: laptop-mode
Rzecz ostatnia ale … ważniejsza od dwóch poprzednich, prawdopodobnie tłumacząca mój problem z brakiem hibernacji przy niskim poziomie baterii i wiele innych kłopotów.
Ubuntu 11.10 nie zainstalowało (przynajmniej przy upgrade)
laptop-mode (o ile pamiętam, w
starszych wersjach pakiet był instalowany po wykryciu
laptopa). Właśnie to narzędzie tradycyjnie odpowiadało za
przechodzenie w rozmaite tryby oszczędzania energii przy pracy na
baterii, hibernację przy jej niskim poziomie i optymalizację ustawień
jądra pod laptopy (co robi – patrz /etc/laptop-mode
i man
laptop-mode.conf
– oczywiście po instalacji).
Doinstalować je można łatwo:
$ sudo apt-get install laptop-mode-tools
ale … nie prowadzi to do sukcesu:
# laptop_mode
Unhandled kernel version: 3.0 ('uname -r' = '3.0.0-12-generic-tuxonice')
Couldn't acquire lock. Retrying....
Unhandled kernel version: 3.0 ('uname -r' = '3.0.0-12-generic-tuxonice')
Couldn't acquire lock. Retrying....
(to samo przy /etc/init.d/laptop_mode restart
).
Losy zgłoszenia można tropić tutaj.
Spróbowałem workaroundu opisanego w zgłoszeniu: przeedytowałem
skrypt /etc/sbin/laptop_mode
dopisując (około 500 wiersza) 3.0
:
case "$KLEVEL" in
"2.4" ) ;;
"2.6" ) ;;
"3.0" ) ;;
*)
log "ERR" "Unhandled kernel version: $KLEVEL ('uname $
exit 1
;;
esac
Po tej zmianie obserwuję ten sam problem, co osoby wcześniej komentujące
zgłoszenie – fatalne backtrace z hal-disable-polling
:
*** buffer overflow detected ***: hal-disable-polling terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0x2538d5]
/lib/i386-linux-gnu/libc.so.6(+0xe66d7)[0x2526d7]
/lib/i386-linux-gnu/libc.so.6(+0xe6ec7)[0x252ec7]
hal-disable-polling[0x804910d]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0x185113]
hal-disable-polling[0x8049361]
Wyłączyłem ten
moduł edytując /etc/laptop-mode/conf.d/hal-polling.conf
:
#CONTROL_HAL_POLLING="auto"
CONTROL_HAL_POLLING=0
Po tej poprawce reszta modułów wydaje się działać.