Wie drossele ich pro Prozess-E / A auf ein Maximum?

32

Ich suche nach einer Möglichkeit, eine Prozessfestplatte auf eine festgelegte Geschwindigkeitsbegrenzung zu beschränken. Im Idealfall würde das Programm folgendermaßen funktionieren:

$ limitio --pid 32423 --write-limit 1M

Begrenzung von Prozess 32423 auf 1 Megabyte pro Sekunde Schreibgeschwindigkeit der Festplatte.

Sepero
quelle

Antworten:

33

Das ist sicherlich keine triviale Aufgabe, die nicht im Userspace erledigt werden kann. Glücklicherweise ist dies unter Linux mit cgroupmechanizm und seinem blkio-Controller möglich .

Das Einrichten von cgroup ist irgendwie verteilungsspezifisch, da es möglicherweise bereits bereitgestellt oder sogar irgendwo verwendet wird. Hier ist jedoch eine allgemeine Idee (vorausgesetzt, Sie haben die richtige Kernel-Konfiguration):

mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio

Nachdem Sie den blkioController eingestellt haben, können Sie ihn verwenden:

mkdir -p /sys/fs/cgroup/blkio/limit1M/
echo "X:Y  1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device 

Jetzt haben Sie eine C-Gruppe limit1M, die die Schreibgeschwindigkeit auf Geräten mit Haupt- / Nebennummern X: Y auf 1 MB / s begrenzt. Wie Sie sehen, gilt dieses Limit pro Gerät. Alles, was Sie jetzt tun müssen, ist, einen Prozess innerhalb dieser Gruppe zu platzieren, und dieser sollte begrenzt sein:

echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks

Ich weiß nicht, ob / wie dies auf anderen Betriebssystemen möglich ist.

Krzysztof Adamski
quelle
3
Bitte beachten Sie, dass Sie zuerst die echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_devicels -l /dev/sda
geräteweite Gesamtrichtlinie festlegen
cgroup v1 unterstützt das Zurückschreiben des Caches nicht. Das bedeutet, dass das Testen eines einfachen dd-Befehls, der in eine Standarddatei in einem Dateisystem (und nicht in ein Gerät) schreibt, wahrscheinlich keine Einschränkung darstellt. Wenn Sie kein Writeback verwenden dd ... oflag=direct, funktioniert dies wie erwartet. cgroup v2 kann damit umgehen, wenn das Dateisystem dies unterstützt. Details: Verwenden von Gruppen zur Begrenzung der E / A
AB
22

ionicevon der util-linuxmacht sowas was du willst.

Es werden keine absoluten E / A-Grenzwerte festgelegt, sondern die E / A-Priorität und die Ansprechbarkeit - ähnlich nicewie bei einem Prozess mit CPU-Priorität.

Von der Manpage:

ionice - Festlegen oder Abrufen der Klasse und Priorität der Prozess-E / A-Zeitplanung

BESCHREIBUNG
Dieses Programm legt die E / A-Planungsklasse und -Priorität für a fest oder ruft sie ab
Programm. Wenn keine Argumente oder nur -p angegeben werden, fragt ionice die ab
Aktuelle E / A-Planungsklasse und Priorität für diesen Prozess.

Wenn ein Befehl gegeben wird, führt ionice diesen Befehl mit dem gegebenen aus
Argumente. Wenn keine Klasse angegeben ist, wird der Befehl ausgeführt
mit der Scheduling-Klasse "best-effort". Die Standardprioritätsstufe ist 4.
cas
quelle
5
Man sollte bedenken, dass es nur mit einem CFQI / O-Scheduler funktioniert . In vielen modernen Systemen ist deadlinestandardmäßig eines aktiviert.
Highstaker
8

systemd bietet einen Wrapper für cgroup-manipulierte Aufrufe von Prozessen. Aus der systemd-run (1) -Manpage:

Der folgende Befehl ruft das Tool updatedb (8) auf, senkt jedoch die Block-E / A-Gewichtung auf 10. Weitere Informationen zur Eigenschaft BlockIOWeight = finden Sie unter systemd.resource-control (5).
systemd-run -p BlockIOWeight=10 updatedb

Verwenden Sie die --scopeOption, um systemd-rundas Programm im Vordergrund auszuführen.

fche
quelle
7

Die Antwort von fche ist ein sehr guter Hinweis, danke dafür, obwohl es das Problem nicht wirklich löst, da die Frage lautete, einen Prozess auf eine bestimmte Bandbreite zu beschränken.

Ich würde so etwas vorschlagen:

systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb

oder die veraltete Version:

systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb

Dies passt immer noch nicht zu der Frage, weil es nicht für einen bereits laufenden Prozess verwendet werden kann, aber vielleicht ist es in einigen anderen Fällen hilfreich.

Links:

Benibr
quelle