Impedindo que o tar use muita CPU e disco (o laptop antigo falha se 100%)

15

Quero fazer backup de 1 terabyte de dados em um disco externo.

Eu estou usando este comando: tar cf /media/MYDISK/backup.tar mydata

PROBLEMA: Meu pobre laptop congela e trava sempre que uso 100% de CPU ou 100% de disco (se você quiser reagir sobre isso, escreva aqui ) . Então, eu quero ficar com cerca de 50% da CPU e 50% do disco no máximo.

Minha pergunta: Como acelerar a CPU e o disco com o tarcomando?

O Rsync tem uma opção --bwlimit, mas eu quero um arquivo porque 1) existem muitos arquivos pequenos 2) Prefiro gerenciar um único arquivo do que uma árvore. É por isso que eu uso tar.

Nicolas Raoul
fonte
1
Que idéia inteligente de criar um tarball tão grande: DDD E o comando 'nice'?
Jirib 31/05
1
@JiriXichtkniha: nicenão vai impedir que 100% da CPU
Nicolas Raoul

Respostas:

22

Você pode usar pvpara acelerar a largura de banda de um tubo. Como o seu caso de uso é fortemente vinculado a E / S, a sobrecarga adicional da CPU de passar por um canal não deve ser perceptível e você não precisa fazer nenhuma otimização da CPU.

tar cf - mydata | pv -L 1m >/media/MYDISK/backup.tar
Gilles 'SO- parar de ser mau'
fonte
1
Ainda melhor do que eu estava esperando! Estou limitando o IO a 5mb / segundo e a CPU permanece em 13% (parece razoável com a criptografia em andamento).
Nicolas Raoul
1
Muito agradável!. Talvez também recomende o sinalizador -q para eliminar a barra de progresso.
Szabgab
um grande comando !!! Se você não o possui no seu Debian / Ubuntu, basta executar apt-get install pv. Eu recomendo adicionar `-b` depois -L 1m: dessa forma, um contador de bytes incrementais será impresso, atualizado a cada segundo. Desta forma, você sabe quantos bytes foram escritos até agora
lucaferrario
Além disso, observe que, se você compactar a saída (usando em tar czfvez de tar cf), o limite se refere à saída compactada (portanto, -L 1ma gravação no disco não excederá 1 MB / s .... mas a leitura do disco provavelmente estará entre 1 MB / s e 5 MB / s, dependendo do seu tipo de conteúdo)
lucaferrario
Ótimo truque! Ao compactar com xz, eu canalizo primeiro através de pv e depois através de xz.
Jean-Bernard Jansen
8

Você pode tentar a ferramenta cpulimit, que limita a porcentagem da CPU. Não é uma ferramenta padrão, portanto você precisará instalá-la. Aqui está um trecho rápido do README:

"Cpulimit é uma ferramenta que tenta limitar o uso da CPU de um processo (expresso em porcentagem, não no tempo da CPU). [...] O controle da quantidade de CPU usada é feito enviando sinais SIGSTOP e SIGCONT POSIX aos processos. Todos os processos filhos e os threads do processo especificado compartilharão a mesma porcentagem de CPU ".

Então, eu recomendaria o ionice para limitar o uso de E / S, embora seja o acesso simultâneo que seria limitado, e não o rendimento máximo ... Mesmo assim, aqui está como usá-lo:

ionice -c 3 <your_command>
Huygens
fonte
Ótimo! Parece que cpulimit é o que eu estava procurando.
Nicolas Raoul
2

Você realmente não pode obter um processo para executar menos . Você pode usar nicepara dar uma prioridade mais baixa, mas isso é em relação a outros processos. A maneira de executar o cooler da CPU durante a execução de um processo é usleep(3)forçar o processo para sair do estado de execução por um certo período de tempo, mas isso envolveria a aplicação de patchestar ou o uso do LD_PRELOADmecanismo para fornecer uma função corrigidatar usa muito (por exemplo, fopen(3))

Eu suspeito que suas melhores soluções alternativas são as de hardware que você mencionou no SuperUser: manter o laptop fresco e / ou diminuir o clock da CPU.

Uma solução alternativa irritante, mas possivelmente viável (um kludge, na verdade) funciona em um nível 'macroscópico'. Em vez de tarexecutar 100ms a cada 200ms, você pode executar um segundo a cada dois. Nota: este é um argumento horrível e horrível. Mas ei, pode até funcionar!

tar cjf some-file.tar.bz2 /some-directory &
while true; do
    sleep 1  # Let it run for a second
    kill -STOP $! 2>/dev/null || break
    sleep 1  # Pause it for a second
    kill -CONT $! 2>/dev/null || break
done

O primeiro sleepajusta o tempo de suspensão, o segundo ajusta o tempo de execução. Tal como está agora, possui um ciclo de trabalho de 50%. Para manter a temperatura baixa, você provavelmente precisará reduzir o ciclo de trabalho para talvez 25% ou menos (1 segundo de execução, 3 segundos de sono = 1 de cada 4 segundos = 25% de ciclo de trabalho). O comando shell sleeppode levar tempos fracionários, a propósito. Então você poderia até dizer sleep 0.1. Mantenha-o acima de 0,001 apenas para ter certeza e não esqueça que a execução do script também aumenta o tempo.

Alexios
fonte
+1 Boa ideia! Eu acho que é semelhante à ferramenta cpulimit que Huygens sugere.
Nicolas Raoul
Exceto que a ferramenta de Huuygens é muito melhor e mais prática, e é por isso que essa resposta obteve meu próprio +1. :)
Alexios
0

Uma maneira mais geral de limitar a CPU é usar /sys. Parece o que você deseja, de qualquer maneira, já que outras coisas que não tarsão capazes de executar tarefas computacionalmente caras, é exatamente o que você está vendo tarfazer mais.

A maneira de fazer isso é:

  1. /sys/devices/system/cpu/cpuX/cpufreqpara cada uma de suas CPUs (substitua cpuXpor cada CPU).
  2. Em seguida, procure no arquivo scaling_available_frequenciespara ver quais frequências sua CPU suporta.
  3. Escolha uma frequência (digamos 1234567) e faça echo 1234567 > scaling_max_freq

Isso impedirá que a CPU fique acima da frequência especificada.

Patrick
fonte
Obrigado, mas já estou na frequência mais baixa possível. Eu deveria ter mencionado isso. Comecei a fazer underclocking assim que esses problemas começaram a aparecer.
Nicolas Raoul