Jens Axboe a SuSE kernelhackere egy olyan patchet készített, amelynek a notebook tulajdonosok örülhetnek igazán. A patch a Laptop Mode névre hallgat, és a hordozható számítógépek akkumulátoron töltött üzemidejét hivatott növelni azáltal, hogy csökkenti (azaz pontosabban optimalizálja) a merevlemez műveleteket (köztudott dolog, hogy a merevlemez az egyik legnagyobb energiafaló dolog a számítógépben).
Hogyan működik?
A Linux kernel VM-jének (virtual memory management - virtuális memória kezelés) néhány tulajdonsága lehetelenné teszi a merevlemezt pihenését (spin down) hosszabb időre, mint néhány másodperc. Ez nagyon rossz dolog a energiafelhasználás szempontjából.
Az egyik ilyen tulajdonság a ``dirty buffer''-ek élettartama (age time). A Linux kernelnél a ``dirty buffer" élettartama alapértelemzás szerint 30 másodperc. Ez azt jelenti, hogy ha a felhasználó ``dirty'' adatot hoz létre (``dirty'' adatnak hívjuk azt az adatot, amely a memóriában vár arra, hogy kiírja a kernel), akkor 30 másodperc múlva kerül ez az adat kiírásra. A másik gondot okozó dolog a naplózó filerendszerek "journal commit" ideje. Ez az idő például 5 másodperc az ext3 filerendszernél a stock kernel esetén. Szerencsére ezek az értékek finomhangolhatóak a proc/sysctl-en keresztül vagy a mount opciókon keresztül, azaz részlegesen orvosolhatóak a felhasználói térben (user space).
A kernel frissítő daemon (kupdated) szintén működésbe lép bizonyos időközönként (alapértelmezetten 5 másodpercenként) és szintén kiírja a ``dirty'' adatokat. Ez az időtartam is állítható a sysctl-en keresztül.
Szóval mit is csinál a Laptop Mode patch akkor? Teljesen kihasználja azt, ha a merevlemez egyszer felpörög (spin up), és kiírja a régi adatokat a merevlemezre. Ahelyett, hogy csak az ``lejárt'' (expired) adatokat írná ki, kitisztít mindent. Miután mondjuk egy olvasási művelet után a diszk felpörög (spin up), az összes pufferben levő adatot kiírja a merevlemezre. Ez azt jelenti, hogy ha egyszer a lemez újra pihen (spin down) akkor addigra minden frissítve van (ki van írva) és nem kell neki egy esetleges frissítés miatt feleslegesen úrja felpörögni. Ez természetesen hosszabb ``dirty data'' és hosszabb ``journal expire'' időkkel is jár (azaz tovább lesznek az adatok pufferelve).
Az, hogy hosszabb lejárati időket (expire time) határozunk meg azzal jár, hogy cserébe hosszabbak lesznek a merevlemez pihenési idejei (spin down time) is. Ennek persze van hátulütője is. Az egyik az, hogy 10 percnyi munkánkat veszíthetjük el rossz esetben akkor, ha a lejárati időt 10 percre emeljük az alapértelmezett 30 másodpercről. A legnagyobb rizikó itt kétségtelenül az, ha lemerül az akkumulátor.
Beállítások:A központi vezérlő a /proc/sys/vm/laptop_mode attribútum. Ha ebbe ``1''-et írunk, akkor utasítjuk a VM-et és a blokk réteget, hogy Laptop Mode-ba váltson. Ha az attribútumban ``0''-van, értelemszerűen hagyományos módon működik a kernel. Ha a kernel Laptop Mode-ban üzemel akkor szeretnénk beállítani a lejárati időt is. Ezt a laptop-mode.sh szkript hivatott elvégezni.
Előfordulhat olyan eset, hogy nem tudjuk mitől van a lemez felpörgött (spin up) állapotban. Ennek nyomonkövetéséhez is ad némi segítséget a patch. A proc/sys/vm/block_dump-on keresztül nyomon követhetjük, hogy éppen melyik processz okozta az IO-t. Ha ebbe az attribútumba ``1''-et írunk, akkor ki fogja az adatokat dumpolni a kernel üzenet pufferbe. VIGYÁZAT: előbb a syslog-ot, le kell állítani. Óvatosan ezzel a funkcióval!
Az eredmény:
Ha a laptop-mode.sh szkriptben beállított 10 perces lejárati időt használod, akkor csak minden 10 percben pörög fel a merevlemez a ``dirty data'' kiírása miatt. Azt igazából nehéz megmondani, hogy ezzel mennyi akkumulátor energiát lehet megspórolni, hiszen az erősen függ az egyéb felhasználától is. Jens szerint a 10% megtakarítás nem irreális. Természetesen mindenkinek magának kell mérlegelnie, hogy az esetleges lemerülésből adódó 10 perces adatvesztést mennyire tudja elviselni.
Mindenesetre a 2.4.23-pre6 kernel mostantól tartalmazza a laptop-mode patchet.
Jens levele itt.