Como Acelerar por E / S do Processo para um limite máximo?

30

Estou procurando uma maneira de limitar um disco de processos io a um limite de velocidade definido. Idealmente, o programa funcionaria de forma semelhante a isso:

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

Limitação do processo 32423 a 1 megabyte por segundo de velocidade de gravação no disco rígido.

    
por Sepero 14.09.2012 / 05:35

4 respostas

31

Isso certamente não é uma tarefa trivial que não pode ser feita no espaço do usuário. Felizmente, é possível fazer no Linux, usando cgroup mechanizm e seu controlador de blkio .

A configuração do cgroup é de alguma forma específica para a distribuição, uma vez que já pode ser montada ou usada em algum lugar. Aqui está uma idéia geral, no entanto (supondo que você tenha a configuração correta do 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

Agora que você tem o blkio controller set, você pode usá-lo:

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

Agora você tem um cgroup limit1M que limita a velocidade de gravação no dispositivo com números maiores / menores X: Y para 1MB / s. Como você pode ver, esse limite é por dispositivo. Tudo o que você precisa fazer agora é colocar algum processo dentro desse grupo e isso deve ser limitado:

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

Eu não sei se / como isso pode ser feito em outros sistemas operacionais.

    
por 14.09.2012 / 08:38
22

ionice do util-linux faz algo semelhante ao que você deseja.

Ele não define limites absolutos de E / S, define prioridade de IO e 'niceness' - semelhante ao que nice faz para a prioridade de CPU de um processo.

Da página do manual:

ionice - set or get process I/O scheduling class and priority

DESCRIPTION
This  program  sets or gets the I/O scheduling class and priority for a
program.  If no arguments or just -p is given, ionice  will  query  the
current I/O scheduling class and priority for that process.

When  command  is  given,  ionice  will run this command with the given
arguments.  If no class is specified, then  command  will  be  executed
with the "best-effort" scheduling class.  The default priority level is 4.
    
por 14.09.2012 / 07:42
8

O systemd fornece um wrapper para invocações de processos manipuladas pelo cgroup. Na página man do systemd-run (1):

The following command invokes the updatedb(8) tool, but lowers the block IO weight for it to 10. See systemd.resource-control(5) for more information on the BlockIOWeight= property.
systemd-run -p BlockIOWeight=10 updatedb

Considere usar a opção --scope para fazer com que systemd-run execute o programa em primeiro plano.

    
por 10.12.2015 / 16:27
4

A resposta do fche é uma dica muito boa, obrigado por isso, embora não realmente resolva o problema fez com que a questão fosse limitar um processo a uma largura de banda específica.

Eu sugeriria algo assim:

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

ou a versão reprovada:

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

Ainda assim, isso não se encaixa na pergunta, pois não pode ser usado para um processo já em execução, mas talvez seja útil em outros casos.

Links:

por 22.09.2017 / 12:59