Sie sind nicht angemeldet.

1

01.04.2011, 18:38

Dem Bootvorgang und Anwendungsstart ein Turbo verleihen

Hallo Leute,

auf dem letzen Augsburger Linux-Infotag war ich auf einen Vortrag über e4rat. Ich war begeistert und wollte es gleich auf mein Gentoo anwenden. ;) Ergebnis: Boot-Zeit um die Hälfte verkürzt (1-Minute -> 30 Sec.). Die manipulierten Anwendungen starten spührbar schneller.

Die Grafiken auf der Homepage sprechen für sich. Also dachte ich, ich mache mal ein Howto, wie man den schnellsten Pinguin noch schneller machen kann.

Im Prinzip geht es um zwei Dinge:
  1. Anordung der Dateien auf der Festplatte in der Reihenfolge, wie sie gelesen werden. Dies funktioniert nur mit ext4, da die Online-Defragmentierungsfunktionalität dieses Dateisystems genutzt wird. Hier geschieht also kein düsterer Hack, sondern es werden Kernel Funktionalitäten verwendet.
  2. Preloader, der die Daten in den RAM holt, bevor sie benötigt werden. Dieser funktioniert auch mit anderen Dateisystemen.


Installation:

Quellcode

1
emerge e4rat

Aktuell ist das Paket noch testing. Also vorher demaskieren.
Portage sagt Dir was noch zu tun ist. Also ggf. notwendige Kernel-Optionen und für ein Paar Pakete USE=static-libs setzen.

Bootvorgang optimieren (manuell)
Die Optimierung passiert in 3 Schritten
1. Dateien und Reihenfolge feststellen
2. Dateien auf der Festplatte sortieren (nur für ext4)
3. Preloader aktivieren (optional)

1. Dateien und Reihenfolge feststellen
Editiere die Grub Konfigurationsdatei. Kopiere den Standard Eintrag und füge bei der Kopie ein "init=/sbin/e4rat-collect" hinzu.
Die Genkernel-User entsprechend "real_init=/sbin/e4rat-collect"
Ich empfehle eine Kopie, da die Prozedur ab und zu wiederholt werden sollte. Durch System-Updates reduziert sich die Optimierung, da neue Versionen ja wo anders auf der HDD geschrieben werden.

Mein Eintrag sieht so aus:

Quellcode

1
2
3
4
title Gentoo Linux 2.6.36 (e4rat-collect)
root (hd0,0)
kernel /boot/kernel-genkernel-x86_64-2.6.36-gentoo-r8 real_root=/dev/mapper/vg-root4 dolvm  quiet real_init=/sbin/e4rat-collect
initrd /boot/initramfs-genkernel-x86_64-2.6.36-gentoo-r8


Wenn der Eintrag fertig ist, ein Reboot machen und davon booten. Jetzt wird der Bootvorgang von diesem Collector beobachtet und in die /var/lib/e4rat/startup.log mitgeschrieben.
Die Aufnahme beendet sich automatisch nach zwei Minuten. Also, wenn das System komplett hochgefahren ist, einfach noch etwas warten. Schaue anschließend ruhig in die Datei, ob es so hinkommt.

2. Dateien auf der Festplatte sortieren
Da ausgeführte Binaries nicht defragmentiert werden können, müssen alle Prozesse (soweit es geht) beendet werden.
Also als root ein

Quellcode

1
init S
eingeben. Jetzt wirst Du gefragt, ob Du mit STRG+D booten willst. An dieser Stelle einfach das Root Passwort eingeben und schon bist Du in einer minimalistischen Umgebung.
Schaue mit

Quellcode

1
ps faxu
nach, ob noch Prozesse aktiv sind, und kille sie alle (mit der Ausnahme der aktiven Bash ;))
Mounte lokale Dateisysteme, wie zB. /home, falls diese auf einer extra Partition sind.
Jetzt kommt Magic:

Quellcode

1
e4rat-realloc /var/lib/e4rat/startup.log


In der Ausgabe siehst Du die Ergebnisse der Defragmentierung. Führe den Befehl mehrfach aus, bis ein Optimum erreicht ist.

3. Preloader aktivieren
Hinweis: Auf älteren Systemen wurde beobachtet, dass das System ohne den Preloader schneller hochfährt als mit. Die Umsortierung alleine bringt auch schon einiges. Es lohnt sich also mit und ohne auszuprobieren und zu vergleichen.

Editiere wieder die grub Konfiguration. Füge zu dem Standard-Eintrag ein "init=/sbin/e4rat-preload" btw. "real_init=/sbin/e4rat-preload" hinzu.

Quellcode

1
2
3
4
title Gentoo Linux 2.6.36 (e4rat-turbo!)
root (hd0,0)
kernel /boot/kernel-genkernel-x86_64-2.6.36-gentoo-r8 real_root=/dev/mapper/vg-root4 dolvm  quiet clocksource=acpi_pm real_init=/sbin/e4rat-preload
initrd /boot/initramfs-genkernel-x86_64-2.6.36-gentoo-r8


Fertig!, jetzt rebooten und die Stoppuhr bereit halten ;)

Anwendungen optimieren
1. Im Laufenden Betrieb als Root

Quellcode

1
e4rat-collect
starten.

2. Anwendung starten

Quellcode

1
oowriter
und beenden.

3. e4rat-collect mit STRG-C beenden. Er erstellt Dir eine e4rat-collect.log im aktuellen Verzeichnis.

4. Als nächstes die Files auf der Festplatte sortieren, also

Quellcode

1
e4rat-realloc e4rat-collect.log
Achtung, offene Binaries werden nicht sortiert. Die Anwendung muss also geschlossen sein.


Und schon wird diese Anwendung auch nach Reboot schneller starten. ;)

Viel Spaß und einen großen Dank an den Entwickler Andreas Rid.



Bootvorgang optimieren (alternativ) - Automatische Optimierung des Boot-Vorganges

Da manuell die Schritte durchzuführen nicht wirklich spaß macht, habe ich mir was einfallen lassen. Ein Skript was am Anfang des Boot-Vorganges entscheidet was zu tun ist. Folgende Logik:
Immer, wenn der automatische fsck auf der root-Partition ausgeführt wird, wird die Optimierung in Gang gesetzt. Wir wollen ja auf einer sauberen Partition arbeiten ;)
Neustart 1 nach dem fsck führt e4rat-collect aus.
Neustart 2 führt e4rat-realloc aus. Hierfür wird die / Partition kurzfristig rw gemoutntet.
Weitere Neustarts: genieße den beschleunigten Boot-Vorgang mit e4rat-preload ;)
Das Skript optimiert nur die root-Partition.

So habe ich es eingerichtet:

Skript, der die Arbeit übernimmt (liegt bei mir unter /usr/local/bin/e4rat-auto.sh):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LOGFILE=/var/lib/e4rat/startup.log

if [ $$ != 1 ]; then
    echo "Run this script as init process."
    exit
fi

if [ $UID != 0 ]; then
    echo "Run this script as root."
    exit
fi

echo "Welcome to e4rat-auto. Sit back, relax and enjoy!"

function do_collect {
    echo "Call e4rat-collect"
    exec e4rat-collect -o $LOGFILE
}

function do_preload {
    echo "Call e4rat-preload"
    exec e4rat-preload $LOGFILE
}

function do_realloc {
    echo "Call e4rat-realloc"
    mount -o remount,rw /
    e4rat-realloc "$LOGFILE" 
    e4rat-realloc "$LOGFILE" 
    e4rat-realloc "$LOGFILE" 
    e4rat-realloc "$LOGFILE" 
    e4rat-realloc "$LOGFILE" 
    mount -o remount,ro /
}

ROOTMOUNT="$(cat /proc/cmdline | sed 's:\(.*root=\)\([-=/a-zA-Z0-9._]*\)\(.*\):\2:g')"
if [ -n "$ROOTMOUNT" ]; then 
   echo "e4rat-mgr: root is $ROOTMOUNT"
else
   echo "ERROR: Root device not detected"
   exit
fi

if [ ! -e $LOGFILE ]; then
    echo "$LOGFILE does not exists"
    do_collect
fi

CURRENTCOUNT="$(/sbin/tune2fs -l "$ROOTMOUNT" | grep "Mount count" | sed 's:\(.* \)\([0-9]*\):\2:g' )"
if [ -n "$CURRENTCOUNT" ]; then
    echo "Current mount count: $CURRENTCOUNT"
else
    echo "ERROR: Mount count could not be read"
   exit
fi

if [ `stat -c %X $LOGFILE` == `stat -c %Z $LOGFILE` -o  "$CURRENTCOUNT" == 2 ]; then
    do_realloc
    do_preload
elif [ $CURRENTCOUNT == 1 ]; then
    do_collect
else
    do_preload
fi

nicht vergessen das Skript ausführbar zu machen:

Quellcode

1
chmod a+x /usr/local/bin/er4at-auto.sh


Dieses Skript muss dann als init in die Grub.conf eingetragen werden. Also als "init=/usr/local/sbin/e4rat-auto.sh" btw. "real_init=/usr/local/sbin/e4rat-auto.sh".

Eine Sache fehlt noch: Der e4rat-collect müsste gestoppt werden, wenn das System vollständig hoch gefahren ist. Das mache ich mit:

Quellcode

1
2
3
4
5
~  cat /usr/sbin/e4rat-collect-stop.sh 
#!/bin/sh

sleep 5
sudo killall e4rat-collect


Natürlich "chmod a+x" und in den Autostart des Desktops legen. Damit wird der collecter beendet sobald das System hochgefahren ist.
Damit es funktioniert, wird noch ein "visudo" Eintrag benötigt.

Quellcode

1
%users ALL=(ALL) NOPASSWD: /usr/bin/killall e4rat-collect


Das wars eigentlich. Viel Spaß damit, falls es jemand nutzen möchte.
Auch wenn Open-Source kostenlos ist, ist sie nicht umsonst. Dein Preis ist Dein Engagement und Mitarbeit an OS-Projekten.
Wenn Du keinen Preis bezahlen willst, bist Du die Ware. Und das ist nicht Open Source, geschweigedenn frei.

Dieser Beitrag wurde bereits 15 mal editiert, zuletzt von »bell« (19.08.2014, 14:01) aus folgendem Grund: Fehlerhandling eingebaut


2

01.04.2011, 19:19

Hallo bell,

das hört sich ja wirklich sehr interessant an und es wert mal zu testen.

Werde es mir mal ansehen und berichten ob es funktioniert hat.

Gruß

3

02.04.2011, 12:20

hmm habs auch gleich mal getestet ... und das ohne fehler meldung .. nice nice...

aber eins ist mir aufgefallen auf meinem alten pc amd athlon single core 2ghz merke ich fast keinen unterschied .. max. 3sec nur
auf meinem aktuellen rechner ist er schon beachtlicher quadcore mit je 2ghz ... da ist der unterschied von vorher zu nachher grösser würd mal sagen so um die 20 sec

mfg
socke
''''''''''''''''''''''''''''''''''''''''''''''''
Gentoo-Linux
der G-Punkt eines Pc´s

''''''''''''''''''''''''''''''''''''''''''''''''

4

08.04.2011, 17:54

TOP!!!


Vielen Dank!

//edith: Ein ebuild wäre was Feines. Hat zwar so auch problemlos geklappt, aber in Portage wäre schöner :)
Sys:
AMD FX (tm)-6300 Six-Core Processor
GeForce GTX 650 1024MB
16384 MB DDR3 1600Mhz
ASUS M5A97 R2.0
Samsung SSD 830 (sys)

OS: Gentoo ~amd64
WM: i3
Kernel: vanilla-sources
VGA: nouveau
INIT: OpenRC :)

██ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ trust █████ ██████ ███ your █████ ████ government. Parts of this comment have been found in violation of H.R. 3261, S.O.P.A and Senate Bill 968, P.I.P.A. and have been censored for your benefit.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »walkman« (08.04.2011, 21:58)


5

17.04.2011, 16:47

Kurze Frage bezüglich der Installation. Bei mir kommt bei cmake . immer die Meldung:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CMake Error at /usr/share/cmake/Modules/FindBoost.cmake:1131 (message):
  Unable to find the requested Boost libraries.

  Boost version: 1.42.0

  Boost include path: /usr/include/boost-1_42

  The following Boost libraries could not be found:

      	boost_system
      	boost_filesystem
      	boost_regex

  No Boost libraries were found.  You may need to set BOOST_LIBRARYDIR to the
  directory containing Boost libraries or BOOST_ROOT to the location of
  Boost.
Call Stack (most recent call first):
  CMakeLists.txt:20 (find_package)


-- Found ext2fs: /usr/lib64/libext2fs.so
-- Found blkid: /usr/lib64/libblkid.so
-- Found audit: /usr/lib64/libaudit.a
-- Found auparse: /usr/lib64/libauparse.a
-- CPACK: Can not find dpkg in your path, default to i386.
-- Configuring incomplete, errors occurred!

Das Paket dev-libs/boost habe ich installiert und mit eselect boost auch gesetzt.
Fehlt hier ein Use-Flag oder fehlt noch etwas im Kernel?

Ich habe dev-libs/boost mit den User-Flags eselect und python

6

17.04.2011, 22:57

Habe gerade etwas gefunden (nicht ausprobiert)

e4rat-0.2 ~x86

7

18.04.2011, 09:49

Danke Hilti, das Ebuild habe ich noch nicht gesehen. Ich habe die Doku jetzt etwas angepasst.

@bhzunami, Sehr ungewöhnlich. Ist Boost im Eselect auch wirklich gesetzt? Siehst Du ein Sternchen bei

Quellcode

1
eselect boost list
?
Lösche die Datei /etc/eselect/boost/active und setze

Quellcode

1
eselect boost set 1
erneut.
Auch wenn Open-Source kostenlos ist, ist sie nicht umsonst. Dein Preis ist Dein Engagement und Mitarbeit an OS-Projekten.
Wenn Du keinen Preis bezahlen willst, bist Du die Ware. Und das ist nicht Open Source, geschweigedenn frei.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »bell« (18.04.2011, 10:40)


8

18.04.2011, 18:15

@bhzunami

Welche Version hast Du versucht zu bauen? Die Version 0.2.1 geht nicht. Mag wohl die boost Version nicht in Gentoo.

Die 0.2er Version geht, die 0.2.1er geht nicht.

Gruß

9

18.04.2011, 20:05

Spricht etwas dagegen, dass ich ein ~amd64 (für mich) im ebuild hinzufüge?

10

18.04.2011, 20:15

Vielen Dank Planeshift und Bell, die Version 2.0 funktioniert.

11

18.04.2011, 20:18

Spricht etwas dagegen, dass ich ein ~amd64 (für mich) im ebuild hinzufüge?


Nein, tut es nicht. Es sollte auch auf einem 64Bit System funktionieren. Das wird oft bei Ebuilds nicht gemacht, wenn der Ebuild Schreiber es nicht testen kann.
Also einfach eintragen und bauen. Wenn es geht ist gut, wenn nicht, könnte es doch am AMD64 liegen.

Viele Grüße

Andreas

12

18.04.2011, 20:40

Spricht etwas dagegen, dass ich ein ~amd64 (für mich) im ebuild hinzufüge?

Ich denke es wäre sauberer wenn du das Ebuild so belässt und es zum testen zunächst entsprechend demaskierst. (denn beim nächsten --sync würde es eh wieder überschrieben werden)
Vermutlich sollte etwas wie

Quellcode

1
sys-apps/e4rat ~ *
im keywords File schon passen, für genaueres siehe zb auch im "man portage"

13

18.04.2011, 21:08

Irgendwie will das bei mir nicht so richtig.
Installation verlief mit der 2.0 Version problemlos.
Danach habe ich den Eintrag in die Grub-Konfiguration dazugefügt und einen Neustart durchgeführt.
Leider schreibt er bei mir keine startup.log in /var/lib/e4rat Wenn ich mich als root auf tty1 einloge spuckt er mir

Quellcode

1
[e4rat-collect]     0 file(s) collected

aus.
Ich habe die /boot auf einer separaten Partition, die ist ext3, sowie meine /home Partition (auch ext3). Müssen die auch ext4 sein? /(root) ist ext4.
Die Datei /etc/e4rat.conf ist bei mir alles auskommentiert (ist ja auch alles Default).

Grubeintrag:

Quellcode

1
2
3
title Gentoo Linux 64-Bit 2.6.37-gentoo-r4 (TURBO)
root (hd0,4)
kernel /boot/kernel-2.6.37-gentoo-r4 root=/dev/sda7 init=/sbin/e4rat-collect


EDIT:
Also ich habe noch ein bisschen nachgeforscht.
Nach dem starten sehe ich den Prozess im Top.
Dann ist mir aufgefallen, dass er ganz am Anfang beim Starten eine Fehlermeldung ausgibt

Quellcode

1
2
3
[e4rat-collect] Execute '/sbin/init/'
[e4rat-collect] Cannot create pid file /dev/.e4rat-collect.pid on read only file system
[e4rat-collect] Stop after 120s

Jetzt muss mir nur noch einer erkären, wie ich das schaffe, dass es kein read-only File-System ist.

Schönen Abend.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »bhzunami« (18.04.2011, 21:25)


14

18.04.2011, 22:14

Wie baust Du Deinen Kernel? Genkernel?

Bei genkernel kann es gut sein das es nicht funktioniert, da ja erst alles über die Initramfs geladen wird.

Ist aber nur eine Vermutung.

Gruß

15

18.04.2011, 22:39

@Planeshift
@josef.95

Danke!

Ich denke es wäre sauberer wenn du das Ebuild so belässt und es zum testen zunächst entsprechend demaskierst. (denn beim nächsten --sync würde es eh wieder überschrieben werden)
Vermutlich sollte etwas wie

Quellcode

1
sys-apps/e4rat ~ *
im keywords File schon passen, für genaueres siehe zb auch im "man portage"[/quote]

Ja, das wird so aussehen, ich habe schon mal

Quellcode

1
 /etc/portage/package.keywords:  =sys-libs/lib-compat-1.4.2 ~*
so gehabt.

16

18.04.2011, 23:19

/etc/portage/package.keywords: =sys-libs/lib-compat-1.4.2 ~*

versuch es mit:

Zitat

=sys-apps/e4rat **


Viele Grüße

17

18.04.2011, 23:47



versuch es mit:

Quellcode

1
=sys-apps/e4rat **



Passt, danke!

EDIT

Bzw. passt in dem Fall

Quellcode

1
sys-apps/e4rat **

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »hilti_hit« (19.04.2011, 00:48)


18

19.04.2011, 00:50

[e4rat-collect] Execute '/sbin/init/' [e4rat-collect] Cannot create pid file /dev/.e4rat-collect.pid on read only file system [e4rat-collect] Stop after 120s
Diese Fehlermeldung ist normal. Die PID-Datei geht unter Gentoo nicht. Die einzige Auswirkung davon st, dass Du "e4rat-collekt -k" zum Beenden nicht nutzen kannst. Da muss man schon die 2 Minuten abwarten.

Bezüglich
[e4rat-collect] 0 file(s) collected
Ändert es was, wenn Du "noatime" Parameter der "/" Partition in die fstab hinzufügst?

Was die Dateisysteme angeht, die /boot interessiert den e4rat-collect nicht, da Kernel und Initramfs geladen sind, bevor der collect startet. Die /home ist zum Zeitpunkt des e4rat-preload noch nicht gemounted, wird also ignoriert. Ich habe die selbe Situation. Meine Beobachtung ist jedoch, von der /home wird wenig beim Hochfahren benötigt, das meiste ist in der "/".
Auch wenn Open-Source kostenlos ist, ist sie nicht umsonst. Dein Preis ist Dein Engagement und Mitarbeit an OS-Projekten.
Wenn Du keinen Preis bezahlen willst, bist Du die Ware. Und das ist nicht Open Source, geschweigedenn frei.

19

19.04.2011, 17:58

Ist schon dabei
/etc/fstab

Quellcode

1
/dev/sda7           	/           	ext4        	noatime     	0 1

20

19.04.2011, 18:50

So startup.log wird nun angelegt!
Lösung: ein remerge von audit - Weiss nicht ob das an dem Kernel update gelegen ist. Mal schauen ob der Rest jetzt noch funktioniert.

EDIT:
Funktionierte alles tip top. Sind zwar keine 50% aber immerhin ca. 30%.
Danke

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »bhzunami« (19.04.2011, 18:57)