Ubuntu: Desktop tuning mit elevator=deadline
Linux/OpenSource, ubuntuusers.de November 20th, 2010Ubuntu ist für mich das Arbeitstier schlechthin – mit keinem anderen Betriebssystem würde ich derzeit längere Zeit arbeiten wollen. Auch wenn ein kleiner Blick gen OpenIndiana schweift – an OpenSolaris habe ich immer bewundert, wie gut sich das System unter Last noch anfühlt. Genau das vermisse ich bei Ubuntu: Wenn ein Maven-Build läuft, Netbeans meint es müsse mal wieder tüchtig scannen oder ich dabei noch ein paar Kleinigkeiten machen will, wird es schnell mal duster. Im wahrsten Sinne des Wortes: Applikationen, die durch IO blockiert sind, bekommen dunklere Fenster auf dem Desktop.
Und das ist nicht gerade selten der Fall, bestes Beispiel ist Firefox wenn ich auf eine Seite gehe, auf der 20 verschiedene Flash Applets eingebunden sind (z.B. Google Adsense Review Center, also keine Game Seiten). 10 Sekunden Bedenkpause mindestens. Von virtualisierten Maschinen die parallel laufen mal ganz zu schweigen – diese haben eine eigene Festplatte spendiert bekommen.
Nun hat es mich also interessiert, wie kann es sein, dass bei gleicher Hardware ein Solaris so viel flotter von der Hand geht? Sicherlich hat der Scheduler was damit zu tun, und vielleicht sind die Treiber auch optimiert – aber das kann nicht alles sein. Richtig: Denn es gibt nicht nur Scheduler für die CPU Zeit, sondern auch für die IO Zugriffe. Alle Lese- und Schreiboperationen werden von dem Betriebssystem nach einem bestimmten Prinzip abgearbeitet. Der einfachste Scheduler tut einfach nichts („noop“) und reicht die Anfragen direkt an die Hardware weiter. Das macht z.B. bei SSD Speichern und virtuellen Maschinen Sinn: Bei SSD Festplatten zahlt man keinen direkten Strafzoll in Form von langsamen Kopfbewegungen bei der Festplatte für weit entfernt liegende Datenblöcke, und virtuelle Maschinen greifen sowieso nicht direkt auf die Hardware zu.
Bei normalen Festplatten lohnt es sich stets eine kurze Zeitspanne zu warten, um ggf. weitere Blöcke aus der Nähe einer Anfrage zu Bearbeiten, ehe man einen – vergleichsweise teuren – „seek“ mit dem Schreib-Lese-Kopf macht. Schnell stellt sich die Frage, wie lange man da warten soll, und auch welcher Prozess welche Priorität bei Anfragen bekommen sollte.
Seit Linux 2.6.6 wurde der CFQ Scheduler, „completely fair queuing“, in den Kernel aufgenommen und seit dem immer weiter optimiert. Seit Linux 2.6.18 ist CFQ der Standard Scheduler für IO.
Die Grundidee von CFQ ist, dass jeder Prozess seine eigene Warteschlange bekommt. Dann wird jeder Warteschlange entsprechend der IO Priorität des Prozesses ein Zeitfenster eingeräumt, um die Anfragen abzuarbeiten. Die IO Priorität hängt dabei u.a. von der Priorität des Prozesses und dem bisherigen Ressourcenverbrauch des Prozesses ab. Dieser Scheduler optimiert damit den IO Durchsatz sehr gut, auch bei Systemen mit vielen aktiven Prozessen. Jedoch geht der hohe Durchsatz manchmal auf Kosten der Latenz und ist damit eher für Serverumgebungen als für den Desktopeinsatz geeignet: Wenn Firefox Daten anfragt, weil ich es ihm befohlen habe, ist es mir wichtiger dass diese vor einem danach gestartetem Logeintrag geliefert werden.
Und genau hier kommt der „Deadline“ Scheduler zum Einsatz: Jeder IO Anfrage wird hier ein Zeitstempel zugewiesen wann dieser IO-Request spätestens zu bearbeiten ist. Danach werden die Anfragen in einer Warteschlange sortiert – eine zweite Warteschlange ist sortiert nach den angefragten Datensektoren. Solange keine Anfrage ihre Lebenszeit überschreitet, werden aus der nach Sektoren sortierten Warteschlange alle Anfragen abgearbeitet und damit ein hoher Durchsatz erzielt.
Zusätzlich werden bei jedem Lesevorgang auch benachbarte Sektoren „auf Verdacht“ geladen – für normale Festplatte eine fast kostenneutrale Operation, da der Kopf sowieso sehr nahe bei den angefragten Sektoren ist. Bei SSD Platten ist es sogar noch günstiger, wenn der Sektor im selben Datenblock ist, da SSD Speicher immer ganze Blöcke lesen müssen, im seltenen Fall einer Blockgrenze entstehen etwas höhere Kosten da der naechste Block gelesen werden muss.
Ist die Lebenszeit einer Anfrage abgelaufen, so wird diese sofort bearbeitet und passende weitere Anfragen aus der nach Sektoren sortierten Warteschlange mit abgearbeitet. Damit wird die Latenz gesenkt, was möglicherweise auf Kosten des Durchsatzes geht, jedoch verhindert, dass Prozesse „verhungern“.
Standardmäßig werden Leseoperationen mit einer Deadline von 500ms versehen, Schreiboperationen bekommen 5 Sekunden als Lebenszeit.
Ich habe nun den bei Ubuntu Linux ebenfalls als Standard eingestellten CFQ (completely fair queue) Scheduler testweise gegen den „Deadline“ Scheduler ausgetauscht. Das geht sehr einfach auf verschiedene Weise:
- Beim Booten in Grub die Option „elevator=deadline“ setzen, so wird für alle Blockgeraete der Deadline Scheduler verwendet
- Nach dem Booten fuer das Blockdevice „sda“ den Deadline-Scheduler setzen:
echo „deadline“ | sudo tee /sys/block/sda/queue/scheduler - Dauerhaft: Entweder in /etc/rc.local entsprechende Eintraege machen, oder die Grub Optionen umkonfigurieren
Meine Erfahrungen: Die Festplatte klappert etwas lauter und hörbar „anders“ als mit CFQ, der Bootvorgang dauert gefühlt einen Hauch länger, aber das „dunkles Fenster“ Syndrom hört auf. Alle Anwendungen reagieren etwas flotter, von einem möglichen Durchsatzeinbruch merke ich höchstens beim Booten etwas.
Ich werde bis zum „noop“ Scheduler mit einer SSD also beim Deadline bleiben. Vielleicht gibt es dazu demnächst ein Update im Blog – wenn ich mich doch um entscheide.
November 20th, 2010 at 12:53
Vielleicht auch eine interessante „Optimierung“: http://www.webupd8.org/2010/11/alternative-to-200-lines-kernel-patch.html 🙂
November 20th, 2010 at 12:55
Bei dem Link von Dir geht es eben um CPU Scheduling, damit habe ich eigentlich keine Probleme, sondern lediglich IO bedingte Aussetzer. Fuer Menschen mit Anwendungen die zu wenig Rechenzeit bekommen ist das sicherlich ein Tipp.
November 20th, 2010 at 13:15
Sehr sehr nett, konnte ich auch gleich auf effektivität testen ;). Bei mir hat der Nepomuk Dateindexer bei größeren Indozierungsläufen immer volle Last generiert und dadurch das System unbenutzbar gemacht.
November 20th, 2010 at 13:54
Mit dem Patch dürftest du ähnliche Ergebnisse erzielen. Ich hab mal ein Video gemacht
http://blog.elektronik-projekt.de/2010/11/ein-traum-wird-wahr-fast/
Ich compilieren wine mit make -j64, rippe eine DVD, schaue mir das Video an und nehme die gesamte Szene mit einer Webcam auf. Alles auf einem Rechner, alles gleichzeitig, ohne dass das System irgendwie nennenswert zusammenbricht. Es bleibt immer bedienbar.
November 20th, 2010 at 16:34
Hmm,ich kann auf meinem System jedenfalls kein unterschied feststellen. Hatte gehofft das z.B. entpacken großer Dateien das System etwas flutschiger läuft.
Gibt es irgendwelche zuverlässigen Testmethoden das ganze auch mit Zahlen zu verifizieren?
November 21st, 2010 at 00:10
@everflux: Photon und burli haben schon recht. Bei group scheduling ist zwar das CPU-scheduling gemeint, aber du wirst dich wundern, wie oft am Ende dann doch das CPU-scheduling der Flaschenhals war.
Genau die von dir beschriebenen Situationen haben bei mir auch oefter mal zu grauen Fenstern gefuehrt. Mit aktiviertem group schduling kann ich jetzt auf einmal in Opera bei 60 offenen Tabs 1080p-Videos auf Youtube fluessig im Vollbild gucken.
Zum Vergleich: Vorher liefen bei einem offenen Tab nicht mal Videos niedriger Qualitaet fluessig.
Insgesamt ist das group-scheduling wohl das beste, was Linux in letzter Zeit passiert ist. Und mit der von Lennard Poettering aufgezeigten Alternative, es zu aktivieren (siehe webupd8.org-Artikel fuer Fedora- u. Ubuntuanleitung), muss man nicht mal nen neuen Kernel kompilieren.
November 21st, 2010 at 01:09
Oh crap. Bitte das vorherige komplett streichen. Es gab bei mir ein flash-update. Daher der performance-gewinn bei flash-videos. Ich habe mich mittlerweile belesen und fuer den Desktop bringt cgroup original garnichts.
November 21st, 2010 at 12:24
Zahlen nutzen nichts, wenn man sie im Alltag nicht bemerkt.
November 21st, 2010 at 12:54
Ein wundervoller und verständlicher Beitrag. Ich habe dieses dunkle-Fenster-Syndrom auch häufiger. Ich werde deine Lösung mal ausprobieren 🙂
November 21st, 2010 at 20:26
Du schreibst, dass die Festplatte „lauter und hörbar anders“ klappert. Kann es evtl. sein, dass dieser Scheduler durch häufigere Lesekopfbewegungen die Lebensdauer einer Festplatte senkt. Ich habe nämlich einen etwas älteren Laptop und kenne das Problem mit den dunklen Fenstern. Nur sind mir die immer noch lieber als eine kürzere Lebensdauer der Festplatte.
Oder habe ich die Funktion dieses Schedulers falsch verstanden bzw. ist meine Sorge unbegründet?
Wäre schön, wenn mich da jemand aufklären könnte.
November 21st, 2010 at 23:11
die Datei ’scheduler‘ kennt mein System nicht:
user@compi:~$ echo “deadline” | sudo tee /sys/block/sda/queue/scheduler
“deadline”
tee: /sys/block/sda/queue/scheduler: Invalid argument
user@compi:~$ /sys/block/sda/queue/scheduler
bash: /sys/block/sda/queue/scheduduler: No such file or directory
November 21st, 2010 at 23:16
Ist es ein aktuelles Ubuntu, oder welche Version hast du da?
November 21st, 2010 at 23:19
Die Zugriffsmuster werden einfach anders aussehen – wie im Artikel beschrieben versucht Deadline auch die Kopfbewegungen zu minimieren. Im Gegensatz zu dem permanenten Gerappel unter Windows gehe ich nicht davon aus, dass sich welcher Scheduler auch immer negativ auf die Lebenserwartung der Festplatte auswirkt. Da ist häufiges Ein-/Ausschalten, oder Parken der Platte (Stromsparmodus) eher ein Risiko.
Aber mir ist es ehrlich gesagt auch egal, ob meine Festplatte 10, 7 oder nur 5 Jahre hält, wenn ich dafür in der Zeit vernünftig arbeiten kann.
November 22nd, 2010 at 12:48
/sys/block/sda/queue/scheduler
gibts bei mir nicht .. dafür gibts
/sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/deque/scheduler
Ubuntu 10.10 – Linux 2.6.37-020637rc1-generic
November 22nd, 2010 at 12:54
Das sieht mir auch nicht nach einem Ubuntu Kernel aus, wie er bei 10.10 mitgeliefert wird. Da wirst Du dann schauen muessen, wie/ob das bei dem Kernel geht – evtl. auf die grub Methode (elevator=deadline) ausweichen, statt es nach dem Booten per Script zu machen.
November 22nd, 2010 at 13:20
Oh es ist ein Ubuntu Kernel.. von der Mainline.
Der jetzige Kernel von Ubuntu hat nen ugly Bug mit Xorg da braucht ich immer über 50% cpu, was echt störend ist weil der Lüfter sehr laut wird.
Daher benütze ich jetzt den mainline Kernel von Ubuntu (von http://kernel.ubuntu.com/~kernel-ppa/mainline/)
)
November 22nd, 2010 at 18:47
deadline ist echt toll, ich hab schon vor ca einem Jahr darauf umgestellt, nachdem mein System bei sehr starkem IO-Load praktisch unbenutzbar war. Mit deadline mann man hunderte von MB gleichzeitig durch die platten schieben und trotzdem flüssig weiterarbeiten. toll 😉
November 22nd, 2010 at 20:45
@ everflux: ja, aktuelles ubuntu 10.10
Linux compi 2.6.35-22-generic #35-Ubuntu SMP Sat Oct 16 20:45:36 UTC 2010 x86_64 GNU/Linux
November 23rd, 2010 at 00:04
Was genau muss ich bei GRUB einstellen, um den Deadline Scheduler zu nutzen? Habe keine Ahnung und wäre für einen Tipp sehr dankbar.
November 23rd, 2010 at 12:58
Da du dir dabei auch schnell einiges kaputt machen kannst, wuerde ich empfehlen das System so zu lassen, wenn Du ein weniger erfahrener Anwender bist. Mein Eintrag richtet sich eher an Anwender, die mit dem System schon vertrauter sind, und auch in der Lage sind nach einem Fehler das System wieder zu retten.
November 23rd, 2010 at 20:12
Deine Sorgfaltspflicht ist ja schon richtig rührend ;-), würde aber dennoch gern erfahren, wie ich GRUB entsprechend konfigurieren muss. Fehler sind mir nicht so tragisch. Setze mein System beinahe jede Woche neu auf. Entweder, weil ich zu viel rum experimentiert habe oder weil ich mal schnell eben eine andere Distro ausprobieren möchte. Habe z.B. aufgrund dieses Blog-Eintrages mal eben OpenIndiana auf meinem Rechner installiert, zwei Stunden ausprobiert und anschließend Ubuntu wieder neu aufgesetzt. Aufgrund der Ausgereiftheit von Ubuntu und einem kleinen selbst geschriebenem after-install-script finde ich mein System nach einer Stunde Aufwand wieder im gewünschten Zustand vor. Also ich fände es echt nett und cool, wenn du mir oder unter Umständen jemand anders nen Tipp geben könnte, wie ich GRUB konfigurieren muss.
November 24th, 2010 at 18:26
schade, ich hätte auch gern gewußt wo man das bei grub einträgt. Und mein System kann ich schon retten :o) daran soll’s nicht liegen. Wird das in die grub.cfg eingetragen als Bootparameter des kernels?
Gruß
Tom
November 24th, 2010 at 23:26
Du kannst fuer den Start erstmal ausprobieren, wie es sich verhaelt wenn du elevator=deadline als Kernel Parameter verwendest. Dazu beim Booten shift halten und die Grub Konfiguration entsprechend editieren.
Wenn Du es dauerhaft haben moechtest, entsprechend (je nach grub / grub2) in die Grub Konfiguration eintragen.
November 25th, 2010 at 21:42
Mainline ist ja der ungepatchte Kernel, wird zwar als ubuntu Package angeboten, enthaelt aber eben keine Ubuntu spezifischen Anpassungen. (Bedeutet nicht, dass er besser oder schlechter ist – eben anders.)
Dezember 9th, 2010 at 00:57
Ich würde an deiner Stelle weiterhin den CFQ nehmen und I/O-Lastige Programme mit
nice -n 19 ionice -c 3 $PROGRAMM
starten.
So wie ich es hier auch geschrieben habe: http://zockertown.de/s9y/index.php?url=archives/1480-ssd,-das-neue-Speichermedium.html#c2540
Januar 19th, 2012 at 07:58
@Icke: Das mit der „Invalid Argument“-Fehlermeldung hab‘ ich raus: Manche Internet-Browser ersetzen beim Drag-and-Drop die Anführungsstriche durch fast identisch aussehende Zeichen. Aber ein komplettes Weglassen der Anführungsstriche funktioniert.