Je cherche un moyen de limiter un disque de process io à une limite de vitesse définie. Idéalement, le programme fonctionnerait de la même façon:
$ limitio --pid 32423 --write-limit 1M
Limitation du process 32423 à 1 mégaoctet par seconde vitesse d'écriture du disque dur.
Ce n'est certainement pas une tâche banale qui ne peut pas être faite dans l'espace user. Heureusement, il est possible de faire sur Linux, en utilisant cgroup
mechanizm et son controller blkio .
La configuration de cgroup est en quelque sorte spécifique à la dissortingbution car elle peut déjà être montée ou même utilisée quelque part. Voici une idée générale, cependant (en supposant que vous avez la bonne configuration du kernel):
mount -t tmpfs cgroup_root /sys/fs/cgroup mkdir -p /sys/fs/cgroup/blkio mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
Maintenant que vous avez blkio
controller blkio
, vous pouvez l'utiliser:
mkdir -p /sys/fs/cgroup/blkio/limit1M/ echo "X:Y 1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device
Maintenant vous avez une limite de groupe de limit1M
qui limite la vitesse d'écriture sur le périphérique avec les numéros principaux / mineurs X: Y à 1 Mo / s. Comme vous pouvez le voir, cette limite est par périphérique. Tout ce que vous avez à faire maintenant est de mettre un certain process à l'intérieur de ce groupe et il devrait être limité:
echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks
Je ne sais pas si / comment cela peut être fait sur d'autres systèmes d'exploitation.
ionice
de l' util-linux
fait quelque chose de similaire à ce que vous voulez.
Il ne fixe pas de limites d'E / S absolues, il définit la priorité et la «gentillesse» des E / S – similaires à ce qui est nice
pour un processeur.
De la page de manuel:
ionice - définir ou get la class et la priorité d'ordonnancement d'E / S de process LA DESCRIPTION Ce programme définit ou obtient la class d'ordonnancement d'E / S et la priorité pour un programme. Si aucun argument ou juste -p n'est donné, ionice interrogera le la class d'ordonnancement d'E / S actuelle et la priorité pour ce process. Lorsque la command est donnée, ionice exécutera cette command avec le arguments. Si aucune class n'est spécifiée, la command sera exécutée avec la class de planification "best-effort". Le niveau de priorité par défaut est 4.
systemd fournit un encapsuleur pour les invocations manipulées par des groupes de process. Depuis la page de manuel systemd-run (1):
La command suivante appelle l'outil updatedb (8) mais abaisse le poids du bloc d'E / S à 10. Voir systemd.resource-control (5) pour plus d'informations sur la propriété BlockIOWeight =.
systemd-run -p BlockIOWeight=10 updatedb
Envisagez d'utiliser l'option --scope
pour exécuter systemd-run
exécutez le programme au premier plan.
La réponse de fche est un très bon indice, merci pour cela, bien que cela ne résolve pas vraiment le problème car la question était de limiter un process à une bande passante spécifique.
Je proposerais quelque chose comme ceci:
systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb
ou la version obsolète:
systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb
Cela ne correspond pas à la question, car il ne peut pas être utilisé pour un process déjà en cours d'exécution, mais peut-être qu'il est utile dans d'autres cas.
Des liens: