Úvod
Běžný uživatel nemá doma prostředky pro zjištění, která součást notebooku bere kolik W a dále s tím pracoval. Musí se proto spolehnout na výrobce svého notebooku, který podobné měření provádí a je jen na něm, jak moc běh notebooku optimalizuje z pohledu spotřeby energie. Na co si však jako uživatelé můžeme dát pozor, je používání „správných“ programů a ovladačů.
Linux některé ovladače nemá dotažené do dokonalosti. Některé jsou uzavřené nebo se pro úsporu energie nepodařilo sehnat klíčové volání nebo se nejedná o prioritu vývojářů, případně to, co funguje na konkurenčním systému, nefunguje z nějakého důvodu v linuxovém jádře. Tak jako tak je potřeba dát si pozor převážně na USB, které je asi největším skrytým „žroutem“ energie na Linuxu, a poté na WiFi karty. Mezi ty více patrné příčiny vyšší spotřeby patří jas displeje, zbytečně přetaktovaný procesor nebo špatně napsaná aplikace.
Powertop
Se softwarovými příčinami vyšší spotřeby notebooku již můžeme něco dělat, ale nejdříve musíme zjistit, co nám energii spotřebovává nejvíce. K tomu můžeme použít program powertop od Intelu a pro procesory Intel. Ten zobrazuje programy, které nejvíce budily procesor během určeného intervalu. Zahrnuje také ovladače.
Pro potřebné výsledky spustíme powertop třeba na 5 minut a děláme na notebooku běžnou činnost, jako je prohlížení webu, poslouchání hudby atd.
godie linux # powertop -d -t 300
PowerTOP 1.9 (C) 2007 Intel Corporation
Collecting data for 300 seconds
Cn Avg residency
C0 (cpu running) (35,0%)
C1 0,0ms ( 0,0%)
C2 1,5ms (65,0%)
P-states (frequencies)
1,60 Ghz 4,5%
1333 Mhz 0,2%
1067 Mhz 0,5%
800 Mhz 94,8%
Wakeups-from-idle per second : 437,0 interval: 300,0s
no ACPI power usage estimate available
Top causes for wakeups:
19,3% (169,1) <interrupt> : extra timer interrupt
16,8% (147,0) <interrupt> : uhci_hcd:usb5, HDA Intel, i915@pci:0000:00:02.0
11,4% (100,0) USB device 5-1 : BT-253 (Broadcom Corp)
9,1% ( 79,2) mpd : schedule_timeout (process_timeout)
8,7% ( 75,8) <kernel IPI> : Rescheduling interrupts
6,4% ( 56,1) <interrupt> : iwlagn
6,0% ( 52,5) firefox : schedule_timeout (process_timeout)
4,1% ( 36,2) <kernel core> : neigh_table_init_no_netlink (neigh_periodic_timer)
2,8% ( 24,0) X : do_setitimer (it_real_fn)
1,8% ( 15,9) psi : schedule_timeout (process_timeout)
1,6% ( 13,7) skype : schedule_timeout (process_timeout)
1,3% ( 11,5) skype : do_nanosleep (hrtimer_wakeup)
1,2% ( 10,8) firefox : futex_wait (hrtimer_wakeup)
1,1% ( 10,0) <kernel core> : ehci_irq (ehci_watchdog)
1,1% ( 10,0) kpktgend_1 : schedule_timeout (process_timeout)
1,1% ( 10,0) kpktgend_0 : schedule_timeout (process_timeout)
0,9% ( 8,1) <interrupt> : PS/2 keyboard/mouse/touchpad
0,5% ( 4,0) <kernel core> : usb_hcd_poll_rh_status (rh_timer_func)
0,4% ( 3,8) <interrupt> : acpi
0,4% ( 3,6) gimmix : schedule_timeout (process_timeout)
0,4% ( 3,5) kded : schedule_timeout (process_timeout)
0,4% ( 3,4) stardict : schedule_timeout (process_timeout)
0,4% ( 3,3) gimmix : sk_reset_timer (tcp_write_timer)
0,4% ( 3,3) mpd : sk_reset_timer (tcp_write_timer)
0,4% ( 3,3) gimmix : sk_reset_timer (tcp_delack_timer)
0,3% ( 2,4) krusader : schedule_timeout (process_timeout)
0,2% ( 1,5) yakuake : schedule_timeout (process_timeout)
0,2% ( 1,5) X : schedule_timeout (process_timeout)
0,1% ( 1,1) <interrupt> : ata_piix
0,1% ( 1,1) postmaster : schedule_timeout (process_timeout)
0,1% ( 1,0) conky : schedule_timeout (process_timeout)
0,1% ( 0,9) python : schedule_timeout (process_timeout)
0,1% ( 0,7) iwlagn : ieee80211_sta_work (ieee80211_sta_timer)
0,1% ( 0,7) <kernel IPI> : TLB shootdowns
0,1% ( 0,5) <kernel core> : __nf_ct_refresh_acct (death_by_timeout)
0,0% ( 0,4) <kernel core> : __nf_conntrack_confirm (death_by_timeout)
0,0% ( 0,4) wpa_cli : schedule_timeout (process_timeout)
0,0% ( 0,4) wpa_supplicant : schedule_timeout (process_timeout)
0,0% ( 0,3) automount : do_setitimer (it_real_fn)
0,0% ( 0,3) <kernel core> : __enqueue_rt_entity (sched_rt_period_timer)
0,0% ( 0,2) init : schedule_timeout (process_timeout)
0,0% ( 0,2) skype : __nf_conntrack_confirm (death_by_timeout)
0,0% ( 0,1) firefox : sk_reset_timer (tcp_write_timer)
0,0% ( 0,1) firefox : __nf_conntrack_confirm (death_by_timeout)
0,0% ( 0,1) mpd : __nf_ct_refresh_acct (death_by_timeout)
0,0% ( 0,1) pdflush : queue_delayed_work (delayed_work_timer_fn)
0,0% ( 0,1) klauncher : schedule_timeout (process_timeout)
0,0% ( 0,1) <kernel IPI> : function call interrupts
0,0% ( 0,1) <kernel module> : sta_info_start (sta_info_cleanup)
0,0% ( 0,1) ssh-agent : schedule_timeout (process_timeout)
Výpis zachycuje hodnoty za posledních 5 minut při psaní tohoto článku s přehráváním hudby přes mpd a zapnutou a využívanou WiFi kartou (běžné brouzdání) na netbooku Asus Eee 1000h. Největšími „žrouty“, které můžeme ovlivnit jsou WiFi, Alsa a mpd. Jak na to, si ukážeme níže.
Malé testování
Napětí baterie u všech měření se pohybovalo kolem 8.2 V. Mezi všemi testy jsem měl různě nastavený hardware, ovladače a spuštěný různý software, proto vždy uvádím průměr hodnot naměřených těsně před měřením a průměr po měření. Hodnoty beru ze souboru /proc/acpi/battery/BAT0/state. Je jasné, že takto naměřené hodnoty nebudou nejpřesnější, ale pro přehled nám to stačí.
WiFi a bluetooth
Používání WiFi přidává na spotřebě až 1,3 W. Powersave režim sníží spotřebu přibližně na 60 %.
Spotřeba WiFi a bluetooth
Před vypnutím WiFi: 1420 mA
Po vypnutí WiFi: 1245 mA
Před zapnutím powersave režimu: 1359 mA
Při zapnutém powersave režimu: 1252 mA
Při zapnutém powersave režimu WiFi funguje, ale pingy vzrostou z 10 ms až na 40 ms a výš. WiFi karta se také občas odpojí od APčka.
Bluetooth je na tom podobně jako WiFi, ale jeho výkon zdaleka není takový. Při používání připojení na internet přes EDGE je rychlost znát každých pár centimetrů vzdálenosti mobilu a Eeečka. Jiné notebooky mohou mít bluetooth výkonnější. Můj desktop nemá problémy stahovat z telefonu 100kB/sec, i když je od něho relativně vzdálen.
Zapnuté bluetooth 1592 mA
Zapnuté bluetooth a přenášení fotografií
Vypnuté bluetooth 1577 mA
Na spotřebu prakticky nemá vliv vyhození modulů z jádra. Také se moc neprojevuje jeho zapnutí či vypnutí. Toto bude záviset hodně na daném hardwaru.
Zvuk
Spotřeba energie se zapnutou a vypnout hudbou přehrávanou pomocí MPD.
Před vypnutím: 1451 mA
Po vypnutí: 1413 mA
USB
Před zapojením USB myši: 1238 ms
Po zapojení USB myši: 1282 ms
Zatížení procesoru
Při jakékoli náročné výpočetní operaci, která trvá delší dobu, např. v Linuxu populární kompilace, jdou všechny snahy o snížení spotřeby stranou a co získáme omezením WiFi karty, během pár vteřin ztratíme na této operaci. Je třeba si uvědomit, že jedna flash animace, které si nevšimneme má dobrou šanci nám vzít pár desítek minut z baterky.
Pár rad jak na to
Na internetu se dá najít spousta rad, které nám přidají pár minut navíc. Na jednom fóru se dokonce objevil moc hezký skript, který můžeme navázat na vypojení či zapojení napájecího kabelu. Zapíná šetření prakticky každé kritické součástky, která se v notebooku nachází. Ve výsledku nám to může přidat půl hodinku, kterou jsme pracně získali.
Diskové operace
Pro nastavení powersave módu slouží program hdparm. Nás budou zajímat parametry -B, -S a -M. Parametr -B ovlivňuje parkování hlaviček. Hodnoty 128 a výš neparkují hlavičky a 127 a níž ano. Přitom platí, že čím větší číslo, tím větší výkon. Parametr -S ovlivňuje zastavování disku. U tohoto parametru opatrně, protože časté nabíhání a vypínání motoru se podepíše na celkové kondici disku a mohli bychom mu špatnou hodnotou ublížit. Hodnota 0 vypne zastavování disku, každá další jednička navíc přidá 5 vteřin k času do vypnutí. Disk se vypíná pokud není během této doby aktivní. Parametrem -M nastavujeme rychlost pohybu hlaviček. To ovlivní jak výkon, tak hlasitost zařízení. Hodnota 128 by měla mít dostatečně tichý účinek, ale také malý výkon. Čím vyšší použijeme číslo, tím větší bude výkon i hluk. Některé disky tuto hodnotu nepodporují. To je i případ mého Eeečka. Další zase podporují jen hodnoty pro „tichý“ případně „výkonný“.
hdparm -B 1 -S 4 -M 128 /dev/sda
Nastavíme zápis žurnálu na 5 minut.
mount -o remount,commit=600 /
A nakonec zredukujeme zápis dirty pages na disk.
echo 90 > /proc/sys/vm/dirty_ratio
echo 1 > /proc/sys/vm/dirty_background_ratio
echo 60000 > /proc/sys/vm/dirty_writeback_centisecs
Laptop mód
Zapneme laptop mód.
echo 5 > /proc/sys/vm/laptop_mode
WiFi karta
Pro karty od Intelu platí následující řádek:
echo 5 > /sys/bus/pci/drivers/<driver>/0000\:<cislo>\:00.0/power_level
U jiných to bude obdobné.
Zvuk
Přepneme zvukovou kartu do powersave módu.
echo 10 > /sys/module/snd_hda_intel/parameters/power_save
SATA
Přepneme SATA řadič do powersave módu. Není k dispozici u mého Eeečka s jádrem 2.6.27.
echo min_power > /sys/class/scsi_host/host0/link_power_management_policy
echo min_power > /sys/class/scsi_host/host1/link_power_management_policy
PCIE
To samé s PCIe. Není k dispozici na mém Eeečku s jádrem 2.6.27.
echo powersave > /sys/module/pcie_aspm/parameters/policy
Procesor
U procesoru máme na výběr mezi různými politikami výběru frekvence a napětí, z nichž ondemand reaguje na zatížení systému a podle toho přepíná procesor do různých stavů. Další možnosti jsou performance, powersave a userspace (řízení z userspace). Ondemand by měl nejvíce vyhovovat našim potřebám.
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
Skript
Skript fungující na mém Eee
#!/bin/bash
if [ "$1" == "ac" ]; then
hdparm -B 200 -S 240 /dev/sda
mount -o remount,commit=60 /
mount -o remount,commit=60 /home
echo 0 > /proc/sys/vm/laptop_mode
echo 6 > /sys/bus/pci/drivers/iwlagn/0000\:01\:00.0/power_level
echo 10 > /proc/sys/vm/dirty_ratio
echo 5 > /proc/sys/vm/dirty_background_ratio
echo 6000 > /proc/sys/vm/dirty_writeback_centisecs
echo 0 > /sys/module/snd_hda_intel/parameters/power_save
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
else # Save power
hdparm -B 1 -S 4 /dev/sda
mount -o remount,commit=600 /
mount -o remount,commit=600 /home
echo 5 > /proc/sys/vm/laptop_mode
echo 5 > /sys/bus/pci/drivers/iwlagn/0000\:01\:00.0/power_level
echo 90 > /proc/sys/vm/dirty_ratio
echo 1 > /proc/sys/vm/dirty_background_ratio
echo 60000 > /proc/sys/vm/dirty_writeback_centisecs
echo 10 > /sys/module/snd_hda_intel/parameters/power_save
echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
fi
Měření:
Před spuštěním skriptu : 1445 mA
Po spuštění skriptu: 1242 mA (jas na druhé poloze zleva)
Při sníže jasu na minimum: 1050 mA
Závěr
Skript, který uvádím mi pomohl snížit spotřebu o 200 až 300 mA a výdrž na baterie se zvedla přibližně o půl hodiny.
Spotřebu mohou ovlivnit i různí daemoni, co něco zkouší nebo cyklicky spouští skripty. Vypnutím získáme další vteřiny k dobru. Nicméně si musíme uvědomit, že tohle může fungovat pokud notebook bude ležet na stole a nebudeme na něj sahat. Běžnou prací ho ale zatížíme natolik, že úpravy, kterými získáme několik minut, se stejně neprojeví tak, jak bychom chtěli.