Comment limiter les E / S de process à une limite maximale?

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: