ubuntuusers.de

Hinweis: Dies ist ein statischer Snapshot unseres Wikis vom 25. März 2013 und kann daher nicht bearbeitet werden. Der aktuelle Artikel ist unter wiki.ubuntuusers.de zu finden.
WikiSSDScheduler

Scheduler

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

Hinweis:

Dieser Artikel ist Teil der Artikelserie SSD, welche das Thema Solid State Drives behandelt.

Dieser Artikel geht in allen Beschreibungen davon aus, dass die SSD als /dev/sda im System eingebunden ist. Die Befehle müssen bei davon abweichenden Systemen daher gegebenenfalls angepasst werden.

Wiki/Icons/SSD.png Es gibt verschiedene Bootoptionen, die man beim PC-Start dem Kernel übergeben kann (siehe Booten). Für den Einsatz von SSD kann man ebenfalls einige dieser Optionen nutzen. So kann man zum Beispiel den I/O-Scheduler, der ein Bestandteil von Betriebssystemen ist und die zeitliche Abfolge („Scheduling“) von Lese- und Schreibaufträgen an Festplatten und andere Speichergeräte regelt, beeinflussen.

I/O-Scheduler

Linux setzt den sogenannten Completely Fair Scheduler (CFS) ein. Dieser wird verwendet, um die Priorität von Programmabläufen auf Kernelebene von Betriebssystemen zu verwalten und ist seit Kernel 2.6.23 im Einsatz. Allerdings ist der CFS auf maximale Performance bei konventionellen, magnetischen Laufwerken ausgerichtet.

So kann es bei SSD in manchen Fällen beim Schreiben von großen Dateien dazu kommen, dass andere Applikationen, die ebenfalls versuchen, Dinge auf die SSD zu schreiben, so lange „hängen“ bis die große Datei fertig geschrieben wurde. Dies lässt sich sehr einfach durch einen Test des Kernels herausfinden.

Zusammenspiel Kernel und Scheduler

Bei aktuellen SSD braucht man sich über das Setzen des besten I/O-Schedulers keine Gedanken mehr zu machen. Erkennt der Kernel die SSD als solche, verzichtet dieser auf einige Eigenarten, die bei herkömmlichen Festplatten sinnvoll waren.

Ob der Kernel die SSD als solche erkennt, kann man sehr einfach in einem Terminal [1] überprüfen. Dazu gibt man nur den folgenden Befehl ein:

cat /sys/block/sda/queue/rotational 

Erscheint als Ausgabe eine Null (0), so erkennt der Kernel die SSD als SSD. Ist der Test hingegen negativ (Ausgabe ungleich 0) können die nachfolgenden Änderungen helfen.

Art des Schedulers

Um zu erfahren, welche Scheduler-Optionen das eigene Betriebssystem nutzt, kann man den folgenden Befehl im Terminal [1] nutzen:

cat /sys/block/sda/queue/scheduler 

Die Ausgabe zeigt folgende Ausgabe an:

noop deadline [cfq]

Die in den eckigen Klammern stehende Option ist die zurzeit vom Betriebssystem genutzte Option. Die Optionen noop bzw deadline eignen sich für SSD besser. Allerdings muss man dabei auf die übrige Hardware des Rechners Rücksicht nehmen.

Exkurs - Definitionen der Scheduler

Die einzelnen I/O-Scheduler sind wie folgt definiert:

  • CFQ: Der Standard-Algorithmus der meisten Linux-Distributionen ist auf konventionelle Festplatten (HDD) zugeschnitten. CFQ versucht, die zur Verfügung stehende I/O-Bandbreite gleichmäßig zwischen allen Prozessen aufzuteilen.

  • NOOP: Der noop-Algorithmus versucht, so wenig Prozessorleistung wie möglich zu verbrauchen, fungiert nach dem FIFO-Prinzip und erwartet, dass der jeweilige Hardware-Conroller die einzelnen Requests bearbeitet.

  • Deadline: Dieser Scheduling-Algorithmus nutzt eine Warteschlange, die I/O-Requests nach Priorität sortiert, um so jedem Request in einer garantierten Zeit abarbeiten zu können.

Weitere Informationen zum I/O-Scheduler kann man im Abschnitt Links finden.

I/O-Scheduler temporär setzen

Man kann diese Optionen vorerst nur temporär (bis zum nächsten Neustart) ausprobieren und parallel Geschwindigkeitstests (siehe Festplatten-Geschwindigkeitstest) durchführen.

Da der „normale“ sudo-Befehl in diesem Fall nicht funktioniert, wechselt man mit folgendem Befehl im Terminal [1] in eine Rootshell [2] :

sudo -i 

und gibt dann einen der beiden Befehle ein:

echo noop > /sys/block/sda/queue/scheduler		## setzt die Option noop 
echo deadline > /sys/block/sda/queue/scheduler		## setzt die Option deadline 

Die Rootshell beendet man mit dem Befehl

exit 

Nach jedem Wechsel des Schedulers sollte man nun ein paar Geschwindigkeitstests durchführen (nicht nur einen, um das Ergebnis nicht zu verfälschen). Was man im Regelfall sofort erkennen kann, ist, dass die Optionen noop und deadline schneller als der Standard cfq sind. Ob dann noop oder deadline zum Einsatz kommen, hängt von persönlichen Vorlieben und der eingesetzten Hardware ab.

Scheduler dauerhaft setzen

Hinweis:

Wird im Rechner nur eine SSD eingesetzt, empfiehlt sich die Verwendung der Bootoptionen. Nutzt man hingegen einen Mix aus konventionellen Festplatten (HDD) und einer SSD sollte man entweder sysfsutils oder das Virtuelle Dateisystem nutzen.

Man kann den I/O-Scheduler auf die Optionen noop oder deadline setzen, wenn man nur eine Festplatte in Betrieb hat, dies eine SSD ist und externe Laufwerke gelegentlich nutzt (gilt auch für USB-Sticks).

GRUB

Nutzt man GRUB, fügt man in /boot/grub/menu.lst die Bootoption elevator=noop oder elevator=deadline ein, so dass es beispielsweise wie folgt aussieht:

kernel /vmlinuz26 root=/dev/sda3 ro elevator=noop

bzw.

kernel /vmlinuz26 root=/dev/sda3 ro elevator=deadline

GRUB 2

Nutzt man hingegen GRUB 2 fügt man in /etc/default/grub (Zeile: GRUB_CMDLINE_LINUX_DEFAULT) die Bootoption elevator=noop oder elevator=deadline hinzu, so dass es wie folgt aussieht:

GRUB_CMDLINE_LINUX="elevator=noop"

bzw.

GRUB_CMDLINE_LINUX="elevator=deadline"

Danach sollte man nicht vergessen, ein Update von GRUB durchzuführen, um die Änderungen zu übernehmen:

sudo update-grub 

Sysfsutils

Hat man dagegen mehrere Festplatten (oder einen Mix aus HDD und SSD), sollte man das Paket sysfsutils installieren und die folgende Zeile in /etc/sysfs.conf eintragen:

block/sda/queue/scheduler = noop

Nach einem Neustart sind die Änderungen dauerhaft aktiv.

rc.local

Möchte man keine Bootoptionen setzen, kann man alternativ in einem Editor mit Rootrechten auch einen Eintrag in /etc/rc.local, welche im Normalfall leer ist, setzen. Vor der Zeile

exit 0

trägt man olgendes ein:

  • Für die Option noop:

    echo noop > /sys/block/sda/queue/scheduler
  • Für die Option deadline:

    echo deadline > /sys/block/sda/queue/scheduler

Des Weiteren kann man mit dem sogenannten fifo_batch experimentieren. Anwender berichten teilweise von einem weiteren Performancezuwachs. Dazu tägt man diese Zeile ebenfalls in /etc/rc.local:

echo 1 > /sys/block/sda/queue/iosched/fifo_batch

Die I/O-Requests werden dabei in „Batches“ gruppiert. Diesem Batch (sequentielle Bearbeitung von Aufgaben – siehe Stapelverarbeitung) wird der Wert 1 zugewiesen. Dies bewirkt eine sehr niedrige Latenz und erzeugt ein „first-come first-served“ Verhalten (siehe First In – First Out) des Schedulers.

ubuntuusers.local › WikiSSDScheduler