¿Cómo acelerar por E / S de proceso hasta un límite máximo?

32

Estoy buscando una manera de limitar un disco de procesos io a un límite de velocidad establecido. Idealmente, el programa funcionaría de manera similar a esto:

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

Limitación del proceso 32423 a 1 megabyte por segundo de velocidad de escritura en el disco duro.

Sepero
fuente

Respuestas:

33

Ciertamente, esa no es una tarea trivial que no se puede hacer en el espacio de usuario. Afortunadamente, es posible hacerlo en Linux, utilizando mechanizmcgroup y su controlador blkio .

La configuración de cgroup es de alguna manera específica de distribución, ya que puede estar montada o incluso utilizada en algún lugar. Sin embargo, esta es una idea general (suponiendo que tenga la configuración de kernel adecuada):

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

Ahora que tiene blkioconfigurado el controlador, puede usarlo:

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

Ahora tiene un cgroup limit1Mque limita la velocidad de escritura en el dispositivo con números mayores / menores X: Y a 1 MB / s. Como puede ver, este límite es por dispositivo. Todo lo que tiene que hacer ahora es poner algún proceso dentro de ese grupo y debería ser limitado:

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

No sé si / cómo se puede hacer esto en otros sistemas operativos.

Krzysztof Adamski
fuente
3
Tenga en cuenta que primero debe configurar la política total del dispositivo para crear subgrupos, es decir, echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_devicey obtener X e Y, es decirls -l /dev/sda
dothebart
cgroup v1 no es compatible con la siguiente reescritura de caché. Eso significa que probar un simple comando dd que escribe en un archivo estándar en un sistema de archivos (en lugar de hacerlo en un dispositivo) probablemente no muestre ninguna limitación. No utilizar ninguna reescritura funcionará: dd ... oflag=directfuncionará como se esperaba. cgroup v2 puede manejar esto si el sistema de archivos lo admite. Detalles: Uso de cgroups para limitar E / S
AB
22

ionicedesde el util-linuxhace algo similar a lo que quieres.

No establece límites de E / S absolutos, establece la prioridad de E / S y la "simpatía", similar a lo que nicehace la prioridad de CPU de un proceso.

Desde la página del manual:

ionice: establece u obtiene la clase y prioridad de programación de E / S de proceso

DESCRIPCIÓN
Este programa establece u obtiene la clase de programación de E / S y la prioridad para un
programa. Si no se proporcionan argumentos o solo -p, ionice consultará el
clase de programación de E / S actual y prioridad para ese proceso.

Cuando se da el comando, ionice ejecutará este comando con el dado
argumentos Si no se especifica ninguna clase, se ejecutará el comando
con la clase de programación "mejor esfuerzo". El nivel de prioridad predeterminado es 4.
cas
fuente
55
Hay que tener en cuenta que solo funciona con un CFQprogramador de E / S. Muchos sistemas modernos tienen deadlineuno habilitado por defecto.
Highstaker
8

systemd proporciona un contenedor para invocaciones de procesos manipuladas por cgroup. Desde la página del comando man systemd-run (1):

El siguiente comando invoca la herramienta updatedb (8), pero reduce el peso de E / S del bloque a 10. Consulte systemd.resource-control (5) para obtener más información sobre la propiedad BlockIOWeight =.
systemd-run -p BlockIOWeight=10 updatedb

Considere usar la --scopeopción para systemd-runejecutar el programa en primer plano.

fche
fuente
7

La respuesta de fche es una muy buena pista, gracias por eso, aunque en realidad no resuelve el problema porque la pregunta era limitar un proceso a un ancho de banda específico.

Sugeriría algo como esto:

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

o la versión obsoleta:

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

Aún así, esto no se ajusta a la pregunta porque no se puede usar para un proceso que ya se está ejecutando, pero tal vez sea útil en otros casos.

Campo de golf:

Benibr
fuente