Datenrate mit cgroups begrenzen

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
spueli
Beiträge: 7
Registriert: 26.03.2015 17:11:40

Datenrate mit cgroups begrenzen

Beitrag von spueli » 11.04.2015 18:02:14

Hallo,
ich bin mir nicht ganz sicher, ob ich hier im richtigen Subforum gelandet bin, daher bitte einfach verschieben falls nicht.

Auf meinem Debian-System möchte ich die Lesegeschwindigkeit einer Anwendung (rsync) bzw. eines Benutzers (der nur für rsync gebraucht wird) von der Festplatte auf 8 MiB/s begrenzen. Dazu habe ich diesen Thread gefunden, der vorschlägt cgroups zu verwenden. Die gegebene Anleitung scheitert bei mir an folgendem Schritt:

Code: Alles auswählen

echo "8:0  8388608" > /sys/fs/cgroup/blkio/limit8M/blkio.throttle.write_bps_device
bash: /sys/fs/cgroup/blkio/limit8M/blkio.throttle.write_bps_device: Permission denied
Natürlich war ich als root eingeloggt, daran sollte es nicht scheitern. read_bps_device habe ich auch probiert.

Schon in der Antwort auf Stackexchange wird eingeschränkt ("assuming you have proper kernel configuration") und auf der verlinkten Dokumentationsseite von cgroups steht als erstes:
- Enable Block IO controller
CONFIG_BLK_CGROUP=y

- Enable throttling in block layer
CONFIG_BLK_DEV_THROTTLING=y
Leider weiß ich nicht, was damit gemeint ist, daher habe ich diese beiden Schritte erstmal übersprungen und vermute, dass das der Grund für den Fehler ist.

Irgendwie muss ich wohl den Kernel konfigurieren... Heißt das, dass er komplett neu compiliert werden muss? Und ist das nicht ein bisschen aufwendig? Kennt jemand einen besseren Weg?

Danke schonmal für jede Hilfe!

dufty2
Beiträge: 1714
Registriert: 22.12.2013 16:41:16

Re: Datenrate mit cgroups begrenzen

Beitrag von dufty2 » 11.04.2015 19:19:35

Also bei mir unter jessie ( debian 8 ) funktioniert die Anleitung
Die 2 Mounts sind so schon vorhanden:
$ mount
<snip>
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

Die config des (debian-)kernels kannst Du unter /boot einsehen:
$ grep CONFIG_BLK_CGROUP /boot/config-3.16.0-4-amd64
CONFIG_BLK_CGROUP=y
$ grep CONFIG_BLK_DEV_THROTTLING /boot/config-3.16.0-4-amd64
CONFIG_BLK_DEV_THROTTLING=y
$

und
# mkdir -p /sys/fs/cgroup/blkio/limit1M/
# echo "8:0 1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device
# echo 1514 > /sys/fs/cgroup/blkio/limit1M/tasks
funktionieren auch.

spueli
Beiträge: 7
Registriert: 26.03.2015 17:11:40

Re: Datenrate mit cgroups begrenzen

Beitrag von spueli » 11.04.2015 19:50:33

Na das bringt mich doch schonmal einen Schritt weiter. CONFIG_BLK_CGROUP ist bei mir gesetzt, CONFIG_BLK_DEV_THROTTLING jedoch nicht:

Code: Alles auswählen

$ grep CONFIG_BLK_DEV_THROTTLING /boot/config-3.2.0-4-486
# CONFIG_BLK_DEV_THROTTLING is not set
Wie kann ich das ändern? In der config-Datei steht ganz oben drin
/boot/config-3.2.0-4-486 hat geschrieben:# Automatically generated file; DO NOT EDIT.
# Linux/x86 3.2.65 Kernel Configuration
Kann man den Prozess, indem die Datei generiert wurde nochmal manuell mit anderen Parametern starten, oder muss ich auf Jessie upgraden?

dufty2
Beiträge: 1714
Registriert: 22.12.2013 16:41:16

Re: Datenrate mit cgroups begrenzen

Beitrag von dufty2 » 11.04.2015 20:42:08

Bevor Du jetzt anfängst, jetzt selbst zu kompilieren oder gar ein upgrade machst, kannst Du zuvor mal den 3.16er-kernel aus den wheezy-backports probieren, dort scheint es aktiviert zu sein:

$ grep CONFIG_BLK_DEV_THROTTLING config-3.16.0-0.bpo.4-686-pae
CONFIG_BLK_DEV_THROTTLING=y
$

spueli
Beiträge: 7
Registriert: 26.03.2015 17:11:40

Re: Datenrate mit cgroups begrenzen

Beitrag von spueli » 12.04.2015 18:23:57

Vielen Dank für den Tipp. Ich habe

Code: Alles auswählen

deb http://http.debian.net/debian wheezy-backports main
in meine sources.list aufgenommen, apt-get update gemacht und sicherheitshalber neugestartet. Mit http://backports.debian.org/Packages/ habe ich das Package "kernel-image-3.16.0-0.bpo.4-586-di" gefunden. Ist es das, was ich brauche?

Jedenfalls bekomme ich einen Fehler wenn ich versuche es zu installieren:

Code: Alles auswählen

$ apt-get -t wheezy-backports install "kernel-image-3.16.0-0.bpo.4-586-di"
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package kernel-image-3.16.0-0.bpo.4-586-di
E: Couldn't find any package by regex 'kernel-image-3.16.0-0.bpo.4-586-di'
Was mache ich falsch?

dufty2
Beiträge: 1714
Registriert: 22.12.2013 16:41:16

Re: Datenrate mit cgroups begrenzen

Beitrag von dufty2 » 12.04.2015 19:12:21

Das "...-di" ist für den Debian-Installer, probiers mal mit dem hier:
https://packages.debian.org/wheezy-back ... .bpo.4-586

spueli
Beiträge: 7
Registriert: 26.03.2015 17:11:40

Re: Datenrate mit cgroups begrenzen

Beitrag von spueli » 13.04.2015 00:42:27

Ja, dieses Package kann ich installieren. Du bist echt ne super Hilfe. Mit dem neuen Kernel funktioniert nun auch das echo.

Allerdings funktioniert die Drosselung noch nicht, wie sie soll. So geht sie zwar (habe versehentlich den Unterordner "limit8m" vergessen):

Code: Alles auswählen

$ echo "8:0 8000000" > /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
Jedoch sind dann ja alle Prozesse von allen Benutzern betroffen.

Folgendes bewirkt scheinbar gar nichts:

Code: Alles auswählen

$ echo "8:0 8000000" > /sys/fs/cgroup/blkio/limit8m/blkio.throttle.read_bps_device
Dabei habe ich den Benutzer, der testweise dd ausführt, der Gruppe limit8m hinzugefügt:

Code: Alles auswählen

$ usermod -a -G limit8m [username]
Habe ich was vergessen? Das mit der tasks-Datei verstehe ich auch nicht so recht. Anscheinend soll man da ja die PIDs von zu drosselnden Prozessen reinschreiben (wenn man nicht pauschal alle Prozesse der cgroup drosseln will). Die PIDs stehen doch aber erst fest, nachdem der Prozess gestartet wurde...?

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Datenrate mit cgroups begrenzen

Beitrag von rendegast » 13.04.2015 12:26:15

Kurze Frage,
/sys/fs/cgroup/blkio/limit8M/ (.../limit8m/ ?)
/sys/fs/cgroup/blkio/limit1M/
"limitXM" ( "limitXm"? ) ist speziell dafür vorgesehen resp. ein Codewort,
oder nach eigenem Belieben so gewählt?
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

spueli
Beiträge: 7
Registriert: 26.03.2015 17:11:40

Re: Datenrate mit cgroups begrenzen

Beitrag von spueli » 13.04.2015 13:58:52

So wie ich das verstanden habe, kann man den Namen frei wählen. Analog zur Anleitung auf Stackexchange habe ich erstmal "limit8M" genommen. Dann stellte ich jedoch fest, dass mit addgroup erstellte Benutzergruppen offenbar keine Großbuchstaben enthalten dürfen. Daher bin ich zu "limit8m" übergewechselt. Hätte ich vielleicht dazuschreiben sollen, um Verwirrung zu vermeiden.

Vielleicht bin ich aber auch auf dem falschen Pfad mit der Annahme, dass es eine namentliche Verknüpfung zwischen der Usergroup und cgroup geben muss. Die Frage ist also, wie teile ich einem Benutzer mit, dass er zur cgroup "limit8m" gehört und durch sie beschränkt wird?

Benutzeravatar
habakug
Moderator
Beiträge: 4314
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: Datenrate mit cgroups begrenzen

Beitrag von habakug » 13.04.2015 20:20:18

Hallo!

Man kann sich da auch einlesen, das ist nicht so schwer.
Hier [1] und hier [2].

Gruss, habakug

[1] https://access.redhat.com/documentation ... ig_Service
[2] http://docs.oracle.com/cd/E37670_01/E37 ... roups.html
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

dufty2
Beiträge: 1714
Registriert: 22.12.2013 16:41:16

Re: Datenrate mit cgroups begrenzen

Beitrag von dufty2 » 14.04.2015 00:03:21

habakug hat geschrieben:Hallo!
Man kann sich da auch einlesen, das ist nicht so schwer.
[2] http://docs.oracle.com/cd/E37670_01/E37 ... roups.html
Hah! Das sagt er so leicht, der Meister habakug, in seinem jugendlichen Leichtsinn:
Oracle hat geschrieben: Secure Connection Failed

An error occurred during a connection to docs.oracle.com. Peer attempted old style (potentially vulnerable) handshake. (Error code: ssl_error_unsafe_negotiation)
Abgesehen davon, ganz so einfach ist das nicht mit diesen cgroups.
Wie Du sicher schon feststellt hast geht es nicht um User-Gruppen sondern um die Gruppierung von Processen.

Kann gut sein, wenn man keine (Unter-)Gruppen anlegt, dass sich die Restriction auf die root cgroup auswirkt und so global gilt.

Wie man einen Prozess in statu nascendi (also ohne auf seine PID zu warten) sofort einer cgroup hinzufügt, entzieht sich meiner Kenntnis, evtl. /etc/cgconfig.conf resp. der cgmanager + systemd

Antworten