HTML

Bagoj úr blogja

Kíváncsi Bagoj befigyel a Linux belsejébe, illetve különféle Linux terjesztéseket próbál ki. Ha jó napja van, scriptet ír Neked.

Friss topikok

Mérjük a boot időt: boot chart

2008.08.22. 23:45 bagoj ur

Azt már tudjuk, hogy a rendszerre fordított kernellel fel lehet gyorsítani a boot idejét. Milyen egyéb furfangokat tudunk bevetni?

Első ötlet természetesen az, hogy ami nem kell, kapcsoljuk ki. A probléma ezzel csak az, hogy ezzel kapcsolatban képtelenség általános tanácsokat adni, hiszen mindenkinek másra van szüksége. Akik ilyen tanácsokat írnak, azzal kezdik, hogy "ne egy az egyben vedd át, hanem csak azt tiltsd le ami neked nem kell", de a "delikvens" éppen azt nem tudja, mi nem kell neki.

Én azt mondom, először legyünk tisztában azzal, hogy mi eszi rommá a processzort, illetve a diszkeket, és ennek tudatában majd döntünk arról, hogy szükséges-e nekünk az adott szolgáltatás. Emellett jó, ha fel tudjuk ismerni, hogy mikor malmozik a gép, mikor vár valamilyen folyamat lezárására üresjáratban. Az csak természetes, hogy Linuxon fogunk erre céleszközt találni...

Első lépésben tehát a boot folyamat gyorsításában (még a kernel csere előtt!) tudjuk könnyedén hasznosítani a bootchart nevű kis programocskát. Ez egy teljesítmény-analizáláshoz használatos, évek óta meglévő program, de talán pár embernek még újdonság. Ami nagy előnye, hogy grafikusan, ráadásul nem valami elvont, absztrakt formákkal, hanem jó lérthetően ábrázolja a boot folyamatot. Hátránya, hogy kicsit sok erőforrást eszik ahhoz képest, miközben adminisztrálja a dolgokat.

Mit is csinál a program pontosan? A lelke egy egyszerű script, amely két tized másodpercenként elteszi a /proc/uptime fájlból azt, hogy mióta bootolunk, illetve a /proc/stat, /proc/diskstats fájl tartalmát; illetve minden futó processzről begyűjti a statisztikai információkat (ez mindig a /proc/ <PID>/stat fájlban található). Ezeket a stat fájlokat a linux kernel folyamatosan frissíti, és ezekben minden fontos teljesítmény-adat megtalálható a processzekről. A boot folyamat végén pedig egy Java programmal a begyűjtött adatokból grafikont készít, mégpedig EPS, SVG vagy PNG kimenettel.

Mivel értelemszerűen a programot a boot folyamat legelején kell elindítani, ehhez vagy a boot scripteket, vagy ha van initrd, akkor azt kell módosítani. Az Ubuntu használ initrd-t, a program telepítésekor le is generálódik automatikusan a nekünk kellő változat (ezért használjuk a kernel csere előtt a bootchartot). Így aztán a telepítés igen egyszerű:

root@pujka:~# apt-get install bootchart

Ezek után nincs is más dolgunk, mint újraindítani a gépet, majd a boot végeztével bekukkantani a /var/log/bootchart/ könyvtárba, a legfrissebb dátumú fájlt keresve.

Mivel ez méretes képfájl, csak az elejét rakom ide, hogy mutogathassak (így is rájuk kell kattintani a nagyításhoz!):

 

 

Az egésznek a tetején van a legfontosabb rész, ahol a CPU és az I/O wait értékeket olvashatjuk le, itt látható hogy hol dolgozik a gépünk teljes erőbedobással, és hol pihenget a boot során. A vízszintes az időtengely, ez világos. A kék a CPU, a piros az IO. Magyarul ha mindkettő alacsony, akkor gépünk vár valaminek az eredményére, és egyáltalán nincs kihasználva a teljesítmény. Ha a CPU magas, akkor ott keményen dolgozik, ha az IO a magas, akkor pedig azt jelenti, hogy túl sok mindent akar egyszerre írni a lemezre/olvasni a lemezről, ezért ezek az írások egymásra várnak.

  • A magas CPU használaton nem tudunk segíteni értelemszerűen, hiszen a boot során vannak számításigényes dolgok; sőt éppen az a jó, ha a processzorhasználat magas, mivel akkor van jól kihasználva.
  • A magas IOwait nem annyira jó (főleg ha a CPU alacsony, ez általában együtt jár), ez azt jelenti hogy hiába dolgozna a processzor, meg kell várnia amíg a diszkre kiírásra, vagy a diszkről beolvasásra kerülnek az adatok. Megoldás: gyorsabb diszk, vagy a boot sorrend megváltoztatása, hogy kicsit "kiegyenlítődjenek" ezek a dolgok. Na ez utóbbival sokat foglalkoznak az egyes linux terjesztések készítői, és jelentem, egyelőre nem tudunk üdvözítő megoldásról (hiszen ki tudja, a drága felhasználó éppen milyen szolgáltatásokat szeretne használni. Optimalizálni legfeljebb a leggyakoribbakra tudnak).
  • Ha alacsony a CPU és az IO is, az a legrosszabb, hiszen várunk, várakozunk valaminek az eredményére, legtöbbször akkor van ha valamilyen egyéb hardver csak komótosan válaszolgat az inicializálásra, illetve hardver felismerés esetén.

Ha lejjebb tekintünk, akkor látjuk a processzeinket, amelyek a megfelelő időben indulnak el. A legfelső grafikon és a processz lista alapján össze tudjuk nézni, hogy melyik processz milyen erőforrásokat eszik. Példánkban:

  1. Egy másodpercig minden oké, elindul az initrd-ben az init, elindítja a busyboxot, ami meg az usplasht (ez teszi ki a gyönyörű Ubuntus boot logót). Amúgy az usplash soron látjuk, hogy a boot logó kirakása kér egy kis processzor-időt (kék csíkocska), de utána már nem nagyon kér enni.
  2. Ezek után négy másodpercig a gépem csont semmit nem csinál, a második init (ez már nem az initrd-s) által indított modprobe eredményére vár, azaz húzza befelé a kernel modulokat szépen. (Itt rögtön van is lehetőségünk gyorsítani, ha pár dolgot kernelbe fordítunk.)
  3. Igazán a hetedik másodpercben indulnak be a dolgok (végre!). De egyből ott egy nagy IOwait... nézzük csak, ott van hogy rc -> S01readahead -> readahead-list, na annál látszik a hosszú piros csík. Mit csinál ez? A /etc/rcS.d/S01readahead tartalma elég semmitmondó, de az apt-cache show readahead már ad infókat. Ezek szerint ez éppen arra szolgálna, hogy előre a memóriába töltsünk bizonyos fájlokat, ezzel meggyorsítva bizonyos programok elindulását. Kisvártatva kiderül, hogy a /etc/readahead/boot fájlban felsorolt függvénykönyvtárakat és binárisokat cache-eli a memóriába, a későbbi gyors futás érdekében. Hát ezért ez a nagy IO! Mindenesetre ebből a fájlból akár bőven szemezgethetnék is, egy nagy rakás dolog nekem nem kell belőle, de menjünk tovább.
  4. Az látszik, hogy a 15-20 másodperc közötti időszak egyértelműen az udevd "felségterülete". Ez azt hiszem, mindenkinek világos, hogy nem kikapcsolható, hiszen ez a kernel eseményeket a felhasználói területtel összekötő daemon és szkriptek gyűjteménye; ráadásul jól kihasználja a processzort, szóval probléma nincs. Ami érdekes, az az udevadm alatt lévő sleep-ek: ez a kis parancssoros program nem csinál mást, csak scriptekben mesterségesen várakoztat. Van nekünk erre szükségünk? Annyi szent, hogy a /etc/init.d/rc indítgatja... nézzük, mi van benne!

Hmm, ugyan a sleep értelmét nem találtam meg, de van itt egy érdekes opció az /etc/init.d/rc-ben:

# Specify method used to enable concurrent init.d scripts.
# Valid options are 'none' and 'shell'.
CONCURRENCY=none
Nosza, állítsuk át "Shell"-re! Utána jöhet egy reboot, majd döbbenten láttam, hogy egyből találtam 3 másodpercet. Íme a két bootchart egymás fölé téve, csak a legfelső grafikon:

 (kattints a képre a teljes mérethez)

 

A lejjebb lévő részletezésből, ami most nem vágtam ide, az látszik, hogy valóban az rc párhuzamosan indul; és az ebből adódó csúnya dolgokat (pl. hogy valami előbb indul, minthogy a hozzá szükséges dolgok előtte elinduljanak) pedig szintén sleep-ekkel hidalták át.

Végülis nekem a lényeg az, hogy a bootchart segítségével 3 másodperccel gyorsabban bootol a gépem, ezzel kevesebb energiát fogyaszt, tehát védem a környezetet és a globális felmelegedés ellen dolgozom. :-)

3 komment

Címkék: linux grafika ubuntu hogyan boot kernel egyszerű gyorsítás hardy heron

A bejegyzés trackback címe:

https://bagojur.blog.hu/api/trackback/id/tr72628618

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

evenorbi · http://linuxman.freeblog.hu 2008.08.23. 12:00:51

Nagyon hasznos program így ránézésre is, köszi. Én annyira nem aggódok a bootidőm miatt, bekapcsoláskor általában még teszek-veszek, nem a bootolási folyamatot figyelem, bár gondolom lenne mit faragnom még rajta (bizonyos dolgokat ki is vettem már).
Azonban nemrég határoztam el, hogy 2 éves GNU/Linux születésnapomra "meglepem" magam életem első kernelfordításával (Slackware 12.1), így előtte nem árt lemérni a dolgokat és faragni amin lehet.

atomgape 2008.09.09. 13:08:24

Ez f*sza! Az jutott eszembe, milyen jó lehetne látni a különféle Linux terjesztések grafikonjait egymás mellett/alatt. Rákerestem, mert ikyet is biztos csináltak már és találtam is: www.harald-hoyer.de/linux/boot-time-distro-comparison

Proci · http://prociweb.hu 2008.12.09. 21:26:48

CONCURRENCY=none -t átírtam shell-re és a titkosított particióm nem húzta fel reboot után. A cryptd nem futott le. A boot time 2mp-vel lett gyorsabb, úgyh akinek titkosított particiója van, óva intem kicsit:)