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.
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:
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.
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.
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.
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.
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.
echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
ls -l /dev/sda
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 / Aionice
von derutil-linux
macht sowas was du willst.Es werden keine absoluten E / A-Grenzwerte festgelegt, sondern die E / A-Priorität und die Ansprechbarkeit - ähnlich
nice
wie bei einem Prozess mit CPU-Priorität.Von der Manpage:
quelle
CFQ
I / O-Scheduler funktioniert . In vielen modernen Systemen istdeadline
standardmäßig eines aktiviert.systemd bietet einen Wrapper für cgroup-manipulierte Aufrufe von Prozessen. Aus der systemd-run (1) -Manpage:
Verwenden Sie die
--scope
Option, umsystemd-run
das Programm im Vordergrund auszuführen.quelle
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:
oder die veraltete Version:
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:
quelle