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

FIXME

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

Dieser Scheduler macht nichts (no-operation), geeignet vor allem für virtuelle Server wo sich der Wirt um die Verteilung der Schreibzugriffe kümmert.

FIXME

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.

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

1)
falls nicht gemounted:
mount none /sys -t sysfs