Šetříme energii s Linuxem

4. 12. 2008
Doba čtení: 8 minut

Sdílet

Linuxové distribuce často nejsou plně vyladěny pro umístění na notebook. Instalátory se většinou ani neptají, kde bude systém používán, a proto notebooky vydrží s baterií o několik desítek minut až hodin méně než s konkurenčním systémem. Přitom existuje řada postupů, jak Linux donutit, aby vydržel déle.

Ú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/bat­tery/BAT0/sta­te. 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í:

bitcoin_skoleni

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.

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.