scheduling und Prozessgruppen
Linux bietet ausgereifte Möglichkeiten Ressourcen mit Prioritäten zuzuweisen. Dafür sind die „scheduler“ (I/O und CPU) verantwortlich die durch die vielen Tools Informationen bekommen wie Ressourcen am effektiv zugewiesen werden sollten.
Den aktuell verwendeten Scheduler zeigt dieser Befehl:
grep . /sys/block/sd*/queue/scheduler
cgroups
I/O-Scheduler
I/O-Scheduler weisen die begrenzten Ressourcen der angeschlossenen Speichersysteme zu.
Um einen bestimmten Scheduler beim Boot zum Standard zu machen muss dem kernel das folgende Argument übergeben werden (am Beispiel deadline): elevator=deadline
.
Natürlich geht das auch zur Laufzeit (seit Linux Kernel 2.6.10): Jedem Blockgerät kann über das sysfs 1)ein anderer scheduler zugewiesen werden.
Auswahlmöglichkeiten und aktuell eingestellte Werte: cat /sys/block/<device>/queue/iosched
, also z.B. für das Gerät sda:
cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
Die Ausgabe zeigt dass noop, anticipatory, deadline, und cfq einstellbar sind, wobei die eckigen Klammern die aktuelle Einstellung anzeigen (hier: cfq).
Dauerhaft lässt sich der Scheduler (Standard: cfq, hier auf deadline) mit grub ändern (Ablauf bei Debian):
in der /etc/default/grub
die Zeile:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
zu
GRUB_CMDLINE_LINUX_DEFAULT="quiet elevator=deadline"
Anschließend aktualisiert der Befehl update-grub
die Konfigurationsdatei von grub2 (/boot/grub/grub.cfg
).
Für Virtualisierungsserver können die Standardwerte zu großzügig sein.
Die passenden Einstellungen könnten auch in der /etc/sysctl.conf
vorgenommen werden, dies funktioniert bei Debian jedoch nicht:
block/sda/queue/iosched/read_expire = 250 # default: 500 block/sda/queue/iosched/write_expire = 1500 # default: 5000 block/sdb/queue/iosched/read_expire = 250 # default: 500 block/sdb/queue/iosched/write_expire = 1500 # default: 5000
Stattdessen ist bei Systemen mit dem alten Sys-V-Init-system die Datei /etc/rc.local
(bei anderen Distributionen auch: /etc/rc.d/rc.local
) anzupassen (Beispiel mit sda und sdb):
for DISK in sda sdb do # Select deadline scheduler first echo deadline > /sys/block/${DISK}/queue/scheduler # Now set deadline scheduler parameters echo 250 > /sys/block/${DISK}/queue/iosched/read_expire # default: 500 echo 2500 > /sys/block/${DISK}/queue/iosched/write_expire # default: 5000 done
Das funktioniert auch bei neueren Systemen mit systemd, den Status des Skriptes kann so abgefragt werden:
systemctl status rc-local.service
NOOP I/O scheduler
Dieser Scheduler macht nichts (no-operation), geeignet vor allem für virtuelle Server wo sich der Wirt um die Verteilung der Schreibzugriffe kümmert.
Anticipatory I/O scheduler
Completely Fair Queuing (CFQ) I/O scheduler
CFQ ist oft als Standard-Scheduler voreingestellt, er ermöglicht einen hohen Durchsatz aber weniger Interaktivität, was ihn für Desktops und Datenbankserver weniger geeignet macht.
Deadline I/O scheduler
Eine Änderung auf den Deadline scheduler ist schnell erledigt:
echo deadline > /sys/block/sda/queue/scheduler
Mit diesem Shellscript können alle zulässigen Geräte auf den deadline-Scheduler umgestellt werden:
#!/bin/bash scheduler="deadline" if [ "`id -u`" -ne 0 ]; then echo you are not root! exit 1 fi for dev in /sys/block/* do # show available scheduler for device # cat $dev/queue/scheduler grep $scheduler "$dev/queue/scheduler" > /dev/null if [ $? -eq 0 ] then echo "setting scheduler $scheduler to $dev." echo $scheduler > $dev/queue/scheduler # cat $dev/queue/scheduler else echo "scheduler $scheduler not allowed for $dev. Allowed schedulers are: `cat "$dev/queue/scheduler"`" fi done
Links
mount none /sys -t sysfs