SDB:SuSE Linux 9.0 / Interaktivität ausgleichen
aus openSUSE, der freien Wissensdatenbank
Version: 9.0
Mit SuSE Linux 9.0 haben sich die Standardeinstellungen des Scheduler geändert (siehe folgende Erklärung).
Ein Linux-System besteht aus vielen Prozessen, von denen die meisten 'schlafen' und auf Arbeit warten. Sobald sich Arbeit für sie ergibt (Hardware Interrupt, Netzwerkverbindung, ...), sollten sie so schnell als möglich vom Kernel 'geweckt' werden. Wenn Sie die Maus bewegen, wollen Sie den X-Server wecken und ihn veranlassen, den Zeiger so schnell als möglich zu bewegen. Läuft die Puffergröße der Soundkarte aus, dann möchten Sie, dass xmms (oder das Programm, das Sie für Sound verwenden) so schnell als möglich aufwacht, um ihn wieder aufzufüllen und somit einen unterbrechungsfreien Sound sicherzustellen. Wenn Sie ein Zeichen in Ihr Textverarbeitungsprogramm, Ihren Texteditor oder in die Shell eingeben, wollen Sie, dass dieses sofort angezeigt wird.
Soll nur ein Prozess laufen, dann ist das kein Problem.
Gibt es mehrere ausführbare Prozesse, lässt der Kernel normalerweise einen Prozess für eine bestimmte Zeit laufen (Timeslice (Zeitscheibe)), unterbricht ihn dann und gibt die CPU an einen anderen Prozess weiter. Die Dauer dieser Zeitscheiben bestimmt die tatsächliche Laufdauer der unterschiedlichen Prozesse. Die Zeitscheiben sind relativ kurz, sodass die Prozesse scheinbar simultan laufen (Multitasking), auch wenn es nur eine CPU gibt.
Wacht in einer solchen Situation ein wartender Prozess auf, muss der Kernel die Entscheidung treffen, ob der derzeit laufende Prozess unterbrochen (preempt) werden soll oder nicht. Dies geschieht aufgrund von Prioritäten, die sich danach richten, ob der Kernel glaubt, der Prozess sei "interaktiv". Prozesse, die die meiste Zeit warten (sleep), werden als interaktiv betrachtet.
Unabhängig von der Scheduling-Frequenz, funktioniert dies gut, solange es nur einen interaktiven Prozess gibt und nicht zuviele Prozesse laufen.
Die Bestimmung von Interaktivität kann jedoch fehlschlagen, z.B. weil ein Prozess zuvor eine Menge CPU verbraucht hat. (Lassen Sie einige Prozesse im Hintergrund laufen (Kompilierung, Berechnung,...) und schieben Sie auf einem nicht-beschleunigten X-Server ein paar Fenster herum, um dies zu provozieren: Der X-Server verbraucht zuviel CPU und die Mausbewegungen werden holprig.)
In solch einem Fall muss ein Prozess, der aufgeweckt werden soll, möglicherweise warten, bis die Zeitscheiben anderer Prozesse auslaufen (Scheduling-Latenz). Je früher dies geschieht, desto geringer ist die Scheduling-Latenz und desto besser ist das Gefühl der Interaktivität.
Die Scheduling-Frequenz kann auf SUSE 9.0-Kerneln mit SCHED_MINTIMESLICE/MAXTIMESLICE eingestellt werden. Ist dieser Zeitwert kleiner eingestellt, werden die Scheduling-Latenzen geringer. Somit werden die Auswirkungen von Situationen, in denen ein interaktiver Prozess nicht sofort aufgeweckt werden kann, weniger sichtbar. Um kürzere Zeitscheiben setzen zu können, sollte man eine höhere Timer-Frequenz verwenden als den Standard von HZ=100/s.
Eine höhere Scheduling-Frequenz hat ihren Preis. Die höhere Timer Interrupt-Frequenz setzt voraus, dass der Time Interrupt Handler öfter läuft, wobei jedes Mal ein paar CPU-Zyklen verbraucht werden und ein Teil des CPU Cache genutzt wird. (Dies macht beim Einsatz von HZ=1000 statt 100 einen ungefähren Performance-Verlust von 1% aus.)
Der Einsatz kürzerer Zeitscheiben hat ebenso seinen Preis: Das Umschalten von einem Prozess auf den anderen verbraucht CPU-Zyklen und vermindert die Effektivität der CPU Caches. (Dies macht ungefähr einen weiteren Performance-Verlust von 3% beim Einsatz von 10 Mal kürzeren Zeitscheiben im Vergleich zum Standard aus.) Deshalb können eine höhere Timer Interrupt Rate und kürzere Scheduling-Zeitscheiben eingestellt werden.
Der "Desktop"-Bootparameter setzt 10 Mal kürzere Zeitscheiben (1--31ms) und eine 10 Mal höhere Timer Interrupt Rate (1000/s) im Vergleich zum Standard. Wird diese Einstellung Übersprungen, werden die Standardeinstellungen verwendet (10--310ms Zeitscheiben, 100 Time Interrupts pro Sekunde). Alternativ kann die Timer-Frequenz manuell auf ein Mehrfaches (oder einen Bruchteil von) 100 gesetzt werden, indem HZ=Bootparameter verwendet wird. Die Zeitscheiben können durch SCHED_MIN/MAXTIMESLICE in der Kernel-sysconfig-Datei gesetzt werden.
Keywords: kernel | boot.sched | skipped | hz | 100 | 1000 | desktop

