Limitando a atividade de E / S de um processo específico - Linux

2

Eu corro um comando convert *.tif bla.pdf às vezes com 60 imagens. Agora isso torna meu computador inutilizável até que ele termine.

Eu tentei usar nice e ionice , mas isso não ajudou muito.

Existe uma maneira de limitar recursos (leitura / gravação em disco e talvez cpu) ao comando convert?

    
por To Do 26.11.2012 / 16:53

2 respostas

1

Na verdade, o problema é que todos os arquivos tiff estavam sendo carregados na RAM ao mesmo tempo. O problema não estava relacionado ao uso da CPU nem às operações de leitura / gravação no disco (bem, sortof). Ele estava preenchendo RAM (4Gb) e depois usando Swap.

Então, sugerido por alguém , dividi o procedimento em duas etapas.

  1. find . -iname '*.tif' | xargs -I% convert % %.pdf converte cada imagem separadamente
  2. pdftk *.pdf cat output merged.pdf && rm *.tif.pdf mescla os arquivos pdf e exclui os PDFs individuais.

No geral, foi mais rápido e o computador não foi bloqueado.

    
por 27.11.2012 / 08:05
0

Tente instalar e usar "cpulimit". Eu acho que o efeito prejudicial que tais processos (converter / imagemagick lotes) têm é mais provável devido à carga da CPU do que a E / S, pelo menos essa é a minha impressão. Não tenho certeza sobre RAM; Na verdade, não tenho certeza de que o convert carregará tudo na RAM de uma só vez. Por exemplo, mesmo se você converter um PDF com imagemagick, ele primeiro usará gs e extrairá página por página, e então converterá as páginas PGN em / tmp para qualquer especificação e formato que você forneceu no imagimagick / convert (mas no outro lado isso é o "contrário", extraindo imagens do PDF em vez de gerar o PDF, então eu não sei).

Eu tenho a impressão que o cpulimit é mais eficaz em processos de longa data ou processos em lote "endógenos" de um dado processo (como o que a imagemagick faz), mas que não funciona tão bem algo que é repetidamente chamado em um loop bash, por exemplo (a menos que seja em um script e cpulimit seja um problema para restringir o uso da CPU desse script). Para reduzir a carga da CPU de processos repetidamente em execução, acho que a melhor maneira é adicionar algum delay (sleep) arbitrário dentro do loop (pode ser de alguma forma adaptativo, como modular o tempo de sono por algum número de algo como "top" ou talvez de preferência algum outro, menos intensivo em CPU (algo em / proc / stat?), indicação de uso da CPU).

    
por 15.07.2014 / 00:35