2009. április 16., csütörtök

Hangoljunk bagolyúr segítségével

Ha a Linux terjesztésünk készítői és mi is egyöntetűen akarjuk, jóllakott pingvinünk képes jó aszkéta módjára minél kevesebb elektront enni. Ennek hatása hosszabb akkumulátoros üzemidő, és/vagy kevesebb fogyasztás lehet. Az alábbiakban pár egyszerű példát mutatok be, amelynek segítségével tuningolhatjuk a Linuxot alacsonyabb fogyasztásra. Ennek hatására kevesebbet kell termelnie az erőműveknek, kisebb lesz a légszennyezettség, az ózonlyuk begyógyul és a sarkkörökre visszanőnek a jéghegyek (már amelyik elolvadt eddigre).

A lényeg tehát, hogy a számítógépünk hardverei már nagy valószínűséggel felkészültek, hogy kicsit zöldek legyenek. Jó esetben nekünk ezt csak be kell kapcsolni.

Merevlemezek

1. Diszkek lekapcsolása

root@tarantula:~# hdparm -i /dev/sda

/dev/sda:

Model=FUJITSU MHV2040AH , FwRev=00000096, SerialNo= NT04T6A2MHJ0
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0
BuffType=DualPortCache, BuffSize=8192kB, MaxMultSect=16, MultSect=?16?
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78140160
IORDY=yes, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5
AdvancedPM=yes: mode=0x80 (128) WriteCache=enabled
Drive conforms to: ATA/ATAPI-6 T13 1410D revision 3a: ATA/ATAPI-2,3,4,5,6

* signifies the current active mode

Az UDMA-val kezdődő sor alatt láthatjuk, hogy hogyan áll merevlemezünk az energiagazdálkodással. Ha AdvancedPM=yes, akkor beállíthatjuk, hogy bizonyos tétlenség után kapcsoljon le a merevlemezünk. Jó tudni, hogy kb. 10-30 másodperc, mire feltápászkodik, tehát nem érdemes mondjuk 1 percet megadni... A bekapcsolás a "-B", az idő megadása a "-S" paraméterrel történik, utána nem percben vagy másodpercben kell megadni az értéket, hanem egy igen elborult algoritmus szerint, akit érdekel, keresse ki a man-ban. Mivel nekem a teljes üzemidő másfél óra akksin, de túl korán sem állítanám le, ezért húsz percet adtam meg:

hdparm -B 1 -S 240 /dev/sda

A fél óra 241, egy óra 242. Ha véglegesen is be szeretnénk állítani, akkor a /etc/hdparm.conf-ban a "spindown_time" értéket keressük meg, kommentezzük ki és állítsuk be a megfelelő értéket.

2. Gyakori I/O csökkentése

Másik megoldás az, ha megmentjük a merevlemezünket a túl gyakori írástól. A POSIX szabvány alapján (amelyhez a Linux is igazodik) a fájloknak kell legyen egy ún. atime, azaz access time, elérési idő tulajdonsága, ami értelemszerűen az utolsó elérési időt jelzi. Ebből már lehet kapisgálni, hogy minden fájlnál, amelyet vagy írásra, olvasásra megnyitunk, ezt a kis paramétert mindig le kell generálni és kiírni a diszkre. Még viccesebb, hogy ha egy ls paranccsal listázzuk egy könyvtár tartalmát, akkor is megváltozik annak az atime-ja! Most ha hozzávesszük, hogy nem csak a felhasználók, hanem bármely program ugyanezeket okozza, akkor rájövünk hogy ez jelentős tétel is lehet.

Van egy olyan felcsatolási paraméter az ext3 fájlrendszeren, amely jó kompromisszumot ad: csak időről időre frissíti az atime-ot. Az Ubuntun szerencsére ez az alapértelmezett, de azért ellenőrizzük le:

root@tarantula:~# mount
/dev/sda3 on / type ext3 (rw,relatime,errors=remount-ro)

...Ha nincs ott a relatime, akkor a /etc/fstab-ba beleírhatjuk. Ha úgy érezzük, egyáltalán nincs szükség az atime-ra, akkor cseréljük ki a relatime-ot noatime-ra. Figyeljünk, hogy milyen fájlrendszert írunk át, én ext3-at használok, azon tuti.

Beállítható ezen a furmányos Linuxon az is, hogy hány századmásodpercenként írjon a diszkre. (Ugye odáig világos, hogy nem azonnal kerül minden a lemezre, hanem egy pici késleltetéssel, addig egy átmeneti cache-ben csücsül). Alapértelmezetten ez 5 másodperc, lekérdezhetjük így:

cat /proc/sys/vm/dirty_writeback_centisecs 499

Ha laptopon vagyunk, és jó az akksi, és nem számítunk túl sűrűn kernel panic-ra, akkor miért ne vennénk nagyobbra? Semmit nem veszthetünk vele. Írjuk hát be a /etc/sysctl.conf-ba:

sys.vm.dirty_writeback_centisecs 1000

Ezzel nagy bátran duplájára emeltük az időt, azaz felére az írások számát.

3. I/O csökkentése a syslog hangolásával

A syslog lényege az, hogy minden naplózott esemény a diszkre kerüljön, mivel onnan kevesebb valószínűséggel veszik el. Emiatt minden esemény diszkre írásakor meghívja a sync I/O-funkciót, amely a cache-ben lévő, kiírandó adatokat egyből kiírja (normál esetben éppen annyi időnként írja ki, mint amit az előbbi pontban állítottunk be). Van egyébként erre egy kézzel bármikor futtatható parancssori utasítás is, el nem hinnétek, hogy sync a neve... Ha éppen nem egy szuperbiztonságos szervert üzemeltetünk és nem épp egy kernel betérdelést debugolunk, akkor szerintem felesleges ennyire vergődni a logokon. Nyissuk meg a /etc/syslog.conf fájlt, és a target-ek (ez a jobb oldali oszlop) elé tegyünk végig szóközt. Elég soknál már ott is van! Lássuk, hogy néz ez ki előtte:

auth,authpriv.* /var/log/auth.log

...és utána:

auth,authpriv.* -/var/log/auth.log

4. Laptop-mód bekapcsolása

Ez a Linux kernel olyan fícsöre, hogy igyekszik optimalizálni az I/O műveleteket úgy, hogy a diszkek minél többet pihenjenek. A /etc/defaults/acpi-support fájlban láthatjuk is, hogy van egy ENABLE_LAPTOP_MODE paraméter, ami alapból false. Olvashatunk egy figyelmeztetést, hogy néhány gépen ez bizony fagyást okozhat - én nem kockáztattam, nem kapcsoltam be.

Spórolás hangkártyával

Ha az ac97 hangkódekkel rendelkező felhasználók népes táborába tartozunk, akkor beállíthatjuk azt is, hogy amikor nem szól a hangkártya, akkor egyúttal takarítson meg némi energiát önmaga lekapcsolásával. Győződjünk meg arról, hogy ilyen kártyánk van-e, és tudja-e a spórolást, valamint mindez be van-e állítva:

root@tarantula:~# cat /sys/module/snd_ac97_codec/parameters/power_save
0

Ha nem azt írja, hogy ilyen fájl nem létezik, akkor már jók vagyunk.
Ha itt 1-et látunk, akkor minden rendben; ellenkező esetben írhatjuk a
/etc/rc.local fájlba, az "exit" sor elé:# echo 1 > /sys/module/snd_ac97_codec/parameters/power_save

Megtakarítás a laptop-kijelzővel

Gondolom, nem kell hosszan ecsetelnem, hogy a kijelző háttérvilágítása a laptopon gyakran az áramfelvétel felét kiteszi; nem ritka a 4-5W fogyasztás, miközben a laptop 10-11W-ot fogyaszt. Gondoljunk a kijelző háttérvilágításának csökkentésére, valamint akkumulátoros üzemben a gyors kikapcsolásra. Ez utóbbit például ezzel tehetjük meg:

bagoj@tarantula:~$ xset dpms 0 0 60

(Figyeljünk, ezt sima felhasználóként csináltam! Mivel ez az apróbetűs rész amit senki se olvas el, ide írom, hogy ezentúl a root-ként végzendő dolgokat simán #-tel, a felhasználóként végzendőket $ jellel jelölöm, ahogyan általában szokás.)

Ez 60 másodperc inaktivitás után lekapcsolja a kijelzőt, a normál képernyővédő bekapcsolást pedig nem befolyásolja (maximum annyiban, hogy a vicces cicák képei nem látszanak, he-he). A visszakapcsolás meg azonnali. Vészhelyzetben a 15 másodpercet sem tartom hülyeségnek...

Az első dologra pedig az Ubuntu alapból tud megoldást, hiszen beállítható minden a Rendszer/Beállítások/Energiagazdálkodás alatt; másoknak pedig az xbacklight programocska segíthet - már amennyiben a laptopon nincs a háttérvilágítást állító billentyű.

Fukar processzorok

Ha netán több magos rendszerünk van, akksis üzemidőben letilthatjük a teljesítményre optimalizált működést. Ezzel is nyerhetünk valamit:

# echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
# echo 1 > /sys/devices/system/cpu/sched_smt_power_savings

Uniprocesszoros gépeken is alkalmazható a CPU órajel-gazdálkodásának beállítása; további fortélyként. Ennek lekérdezésére létezik a Gnome alatt egy panel-applet, "CPU órajel-változás figyelő" néven, beállítani azonban ott semmit sem lehet. Bezzeg itt:

# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors conservative ondemand userspace powersave performance

Ezek a lehetőségeink. Az "ondemand" olyan 50%-on tartja a processzor órajelét, és szükség esetén felemeli maximumra, csak amíg szükséges. Ubuntun ez az alapértelmezett. A "powersave" igyekszik a minimumon tartani, a "performance" pedig maximális teljesítményt ad le. Fogalmam sincs, a maradék kettő mit csinál. :-) A "userspace"-szel gondolom, lehetőséget adunk hogy felhasználói programokkal egy-egy konkrét értékre lőjük be az órajelet, de a conservative...?
Lekérdezni és beállítani így lehet:

# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
ondemand
# echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Fösvény kommunikáció

Ha éppen nem szükséges használni a vezetékmentes hálózatunkat, vagy a Bluetooth kapcsolatot, és nincs a laptopon megfelelő gomb ezek leállítására / elindítására, akkor letilthatjuk ezeket a parancssorból. Történetesen ugyanis egyes wifi driverek több energiát használnak, ha nem vagyunk kapcsolódva, mint ha fent lennénk a wifi hálón (!). Ha nagyon kell az energia, akkor futtassuk ezt le:

for i in `find /sys -name "rf_kill"`; do echo 1 > $i ; done
hciconfig hci0 down
rmmod hci_usb

(Feltéve, ha a Bluetooth eszközünk neve hci0. Ellenőrizni a hciconfig paranccsal lehet.)

Visszakapcsolás:

for i in `find /sys -name "rf_kill"`; do echo 0 > $i ; done
modprobe hci_usb
hciconfig hci0 up

És természetesen a felsorolt beállításokra egy szkriptet is fabrikálhatunk, amely megtesz nekünk mindent, ha nagy szükség van az utolsó millivoltra is:

#!/bin/bash
if [ `id -u` != "0" ]; then
echo "Csak root-kent futtathato!"
exit 1
fi
/sbin/hdparm -B 1 -S 240 /dev/sda
/bin/mount -o remount,relatime /
/bin/echo 1000 > /proc/sys/vm/dirty_writeback_centisecs
/bin/echo 1 > /sys/module/snd_ac97_codec/parameters/power_save
/bin/echo 1 > /dev/dsp
/bin/echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
/bin/echo 1 > /sys/devices/system/cpu/sched_smt_power_savings
/bin/echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
/usr/bin/xset dpms 0 0 60
for i in `find /sys -name "rf_kill"`; do echo 1 > $i ; done
/usr/sbin/hciconfig hci0 down
/sbin/rmmod hci_usb
A visszakapcsoláshoz pedig:

#!/bin/bash
if [ `id -u` != "0" ]; then
echo "Csak root-kent futtathato!"
exit 1
fi
/sbin/hdparm -B 0 /dev/sda
/bin/echo 500 > /proc/sys/vm/dirty_writeback_centisecs
/bin/echo 0 > /sys/module/snd_ac97_codec/parameters/power_save
/bin/echo 0 > /sys/devices/system/cpu/sched_mc_power_savings
/bin/echo 0 > /sys/devices/system/cpu/sched_smt_power_savings
/bin/echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
for i in `find /sys -name "rf_kill"`; do echo 0 > $i ; done
/sbin/modprobe hci_usb
/usr/sbin/hciconfig hci0 up

Nevezzük el őket, készítsünk neki parancsikont az asztalunkra oszt máris jóidő. Felelősséget, szokás szerint, nem tudok vállalni a dologért. :-)

(Megjegyzés: már 1-2 napja megírtam ezt a postot, azóta szeretném kipróbálni, hogy ténylegesen van-e különbség a kisülés idejében, ha beállítom ezt a sok mindent. Azóta sem sikerült csalhatatlan bizonyítékot találnom. Szóval lehet, hogy ez olyasmi, mint a tuning autók hátsó ledes lámpái, amik a foton kibocsátással is "hozzájárulnak" az autó gyorsulásához.

Forrás

Nincsenek megjegyzések: