Evitar que o tar use muita CPU e disco (o laptop antigo trava se 100%)

13

Eu quero fazer backup de 1 terabyte de dados para um disco externo.

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

PROBLEMA: Meu pobre laptop congela e trava sempre que eu uso 100% de CPU ou 100% de disco (se você quiser reagir sobre isso por favor escreva aqui ) . Então eu quero ficar com cerca de 50% de CPU e 50% de disco max.

Minha pergunta: Como controlar a CPU e o disco com o comando tar ?

O rsync tem uma opção --bwlimit, mas eu quero um arquivo porque 1) há muitos arquivos pequenos 2) Eu prefiro gerenciar um único arquivo em vez de uma árvore. É por isso que uso tar .

    
por Nicolas Raoul 31.05.2012 / 09:52

4 respostas

21

Você pode usar pv para controlar a largura de banda de um canal. Como o seu caso de uso é strongmente vinculado a E / S, a sobrecarga de CPU adicionada ao passar por um pipe não deve ser perceptível, e você não precisa fazer nenhum afogamento de CPU.

tar cf - mydata | pv -L 1m >/media/MYDISK/backup.tar
    
por 01.06.2012 / 02:12
6

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

"Cpulimit is a tool which attempts to limit the CPU usage of a process (expressed in percentage, not in CPU time). [...] The control of the used cpu amount is done sending SIGSTOP and SIGCONT POSIX signals to processes. All the children processes and threads of the specified process will share the same percent of CPU."

Então, eu recomendaria ionice para limitar o uso de IO, embora seja o acesso simultâneo que seria limitado, não o throughput máximo ... Nunca-a-menos aqui está como usá-lo:

ionice -c 3 <your_command>
    
por 31.05.2012 / 12:55
1

Você não consegue que um processo seja executado menos . Você pode usar nice para dar uma prioridade menor, mas isso é em relação a outros processos. A maneira de executar o cooler do processador durante a execução de um processo é usar usleep(3) para forçar o processo a sair do estado de execução por um determinado período de tempo, mas isso envolveria patch tar ou o mecanismo LD_PRELOAD para fornecer uma função corrigida que tar usa muito (por exemplo, fopen(3) ).

Eu suspeito que suas melhores soluções sejam as que você mencionou no SuperUser: mantendo o laptop frio e / ou diminuindo o clock da CPU.

Uma solução chata, mas possivelmente viável (um kludge, na verdade) funciona em um nível "macroscópico". Em vez de fazer com que tar execute 100 ms a cada 200 ms, você poderá fazer com que ele seja executado um segundo de cada dois. Nota: este é um kludge 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 sleep ajusta o tempo de espera e o segundo ajusta o tempo de execução. Tal como está agora, tem 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, 3 segundos = 1 a cada 4 segundos = ciclo de trabalho de 25%). O comando shell sleep pode pegar 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 se esqueça de que a execução do script também aumenta o tempo.

    
por 31.05.2012 / 11:44
0

Uma forma mais geral de limitar a CPU é usar /sys . Isso parece o que você quer de qualquer maneira, já que outras coisas além de tar são capazes de executar tarefas computacionalmente caras, é só que você está vendo tar fazer isso mais.

A maneira de fazer isso é:

  1. vá para /sys/devices/system/cpu/cpuX/cpufreq para cada uma das suas CPUs (substitua cpuX por cada cpu).
  2. Em seguida, procure no arquivo scaling_available_frequencies para ver as freqüências suportadas pela sua CPU.
  3. Escolha uma frequência (digamos 1234567) e faça echo 1234567 > scaling_max_freq

Isso impedirá que a CPU ultrapasse a freqüência especificada.

    
por 01.06.2012 / 14:19

Tags