Como acelerar a E / S por processo até um limite máximo?

32

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

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

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

Sepero
fonte

Respostas:

33

Essa certamente não é uma tarefa trivial que não pode ser realizada no espaço do usuário. Felizmente, é possível fazer no Linux, usando o cgroupmechanizm e seu controlador blkio .

A configuração do cgroup é de alguma forma específica da distribuição, pois já pode ser montada ou até usada em algum lugar. Aqui está uma idéia geral, no entanto (supondo que você tenha uma configuração adequada 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ê blkioconfigurou o controlador, 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 limit1Mque limita a velocidade de gravação no dispositivo com números maiores / menores X: Y a 1MB / s. Como você pode ver, esse limite é por dispositivo. Tudo o que você precisa fazer agora é colocar algum processo dentro desse grupo e deve ser limitado:

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

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

Krzysztof Adamski
fonte
3
Por favor note que você primeiro precisa definir o dispositivo ampla política totais, a fim de criar sub-grupos por isto echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_devicee você obter X e Y por exemplols -l /dev/sda
dothebart
O cgroup v1 não suporta o seguinte writeback do cache. Isso significa que testar um simples comando dd gravando em um arquivo padrão em um sistema de arquivos (em vez de em um dispositivo) provavelmente não mostrará nenhuma limitação. Não usar nenhum write-back funcionará: dd ... oflag=directfuncionará conforme o esperado. O cgroup v2 pode lidar com isso se o sistema de arquivos suportar. Detalhes: Usando cgroups para limitar E / S
AB
22

ionicedo util-linuxfaz algo semelhante ao que você deseja.

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

Na página do manual:

ionice - define ou obtém classe e prioridade de agendamento de E / S do processo

DESCRIÇÃO
Este programa define ou obtém a classe de agendamento de E / S e a prioridade para um
programa. Se nenhum argumento ou apenas -p for dado, o ionice consultará o
classe de agendamento de E / S atual e prioridade para esse processo.

Quando o comando é dado, o ionice executará este comando com o dado
argumentos. Se nenhuma classe for especificada, o comando será executado
com a classe de agendamento "melhor esforço". O nível de prioridade padrão é 4.
cas
fonte
5
É preciso ter em mente que ele funciona apenas com um CFQplanejador de E / S. Muitos sistemas modernos têm deadlineum ativado por padrão.
Highstaker
8

O systemd fornece um invólucro para invocações de processos manipuladas por cgroup. Na página do manual systemd-run (1):

O comando a seguir chama a ferramenta updatedb (8), mas reduz o peso de IO do bloco para 10. Consulte systemd.resource-control (5) para obter mais informações sobre a propriedade BlockIOWeight =.
systemd-run -p BlockIOWeight=10 updatedb

Considere usar a --scopeopção para systemd-runexecutar o programa em primeiro plano.

fche
fonte
7

A resposta de fche é uma dica muito boa, obrigado por isso, embora ele realmente não resolva o problema, pois a questão era 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 obsoleta:

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

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

Ligações:

Benibr
fonte