Impedire a Tar di usare troppa CPU e disco (il vecchio laptop si arresta in modo anomalo se 100%)


15

Voglio eseguire il backup di 1 terabyte di dati su un disco esterno.

Sto usando questo comando: tar cf /media/MYDISK/backup.tar mydata

PROBLEMA: il mio povero laptop si blocca e si arresta in modo anomalo ogni volta che utilizzo il 100% di CPU o il 100% di disco (se si desidera reagire, scrivere qui ) . Quindi voglio rimanere a circa il 50% della CPU e il 50% del disco max.

La mia domanda: come limitare la CPU e il disco con il tarcomando?

Rsync ha un'opzione --bwlimit, ma voglio un archivio perché 1) ci sono molti piccoli file 2) Preferisco gestire un singolo file piuttosto che un albero. Ecco perché lo uso tar.


1
Che idea intelligente per creare un tarball così grande: DDD Che ne dici di un comando "carino"?
jirib,

1
@JiriXichtkniha: nicenon impedirà il 100% dell'utilizzo della CPU
Nicolas Raoul,

Risposte:


22

È possibile utilizzare pvper limitare la larghezza di banda di una pipe. Poiché il tuo caso d'uso è fortemente legato all'IO, l'overhead della CPU aggiunto di passare attraverso una pipe non dovrebbe essere evidente e non è necessario eseguire alcuna limitazione della CPU.

tar cf - mydata | pv -L 1m >/media/MYDISK/backup.tar

1
Ancora meglio di quello che mi aspettavo! Sto limitando IO a 5 MB / secondo e la CPU rimane al 13% (sembra ragionevole con la crittografia in corso).
Nicolas Raoul,

1
Molto bella!. Forse consigliamo anche il flag -q per eliminare la barra di avanzamento.
szabgab,

che grande comando !!! Se non lo hai nel tuo Debian / Ubuntu, esegui semplicemente apt-get install pv. Consiglio di aggiungere `-b` after -L 1m: in questo modo verrà stampato un contatore di byte incrementale, aggiornato ogni secondo. In questo modo sai quanti byte sono stati scritti fino ad ora
lucaferrario

Inoltre, si noti che se si comprime l'output (usando tar czfinvece di tar cf) il limite si riferisce all'output compresso (quindi con -L 1mla scrittura del disco non supererà 1 MB / s .... ma la lettura del disco sarà probabilmente compresa tra 1 MB / s e 5 MB / s, a seconda del tipo di contenuto)
lucaferrario,

Ottimo trucco! Durante la compressione con xz, eseguo prima il pipe attraverso pv e poi attraverso xz.
Jean-Bernard Jansen,

8

Puoi provare lo strumento cpulimit che limita la percentuale di CPU. Non è uno strumento standard, quindi dovrai installarlo. Ecco un breve estratto del file README:

"Cpulimit è uno strumento che tenta di limitare l'utilizzo della CPU di un processo (espresso in percentuale, non in tempo di CPU). [...] Il controllo della quantità di CPU utilizzata viene effettuato inviando i segnali SIGSTOP e SIGCONT POSIX ai processi. Tutto i processi figlio e i thread del processo specificato condivideranno la stessa percentuale di CPU. "

Quindi consiglierei ionice per limitare l'uso di IO, anche se è l'accesso simultaneo che sarebbe limitato, non il throughput massimo ... Nondimeno qui è come usarlo:

ionice -c 3 <your_command>

Grande! Sembra che cpulimit sia quello che stavo cercando.
Nicolas Raoul,

2

Non puoi davvero fare in modo che un processo funzioni meno . Puoi usare niceper dargli una priorità più bassa, ma questo è in relazione ad altri processi. Il modo per eseguire il dispositivo di raffreddamento della CPU durante l'esecuzione di un processo è utilizzare usleep(3)per forzare il processo fuori dallo stato di esecuzione per un certo periodo di tempo, ma ciò implicherebbe l'applicazione di patch taro l'utilizzo del LD_PRELOADmeccanismo per fornire una funzione di patch che tarutilizza molto (ad es. fopen(3)).

Sospetto che le tue soluzioni alternative migliori siano quelle hardware che hai citato su SuperUser: mantenere il laptop fresco e / o abbassare il clock della CPU.

Una soluzione fastidiosa ma possibilmente praticabile (un kludge, in realtà) funziona a un livello "macroscopico". Invece di far tarcorrere 100 ms ogni 200 ms, è possibile farlo funzionare un secondo ogni due. Nota: questo è un kludge orribile, orribile. Ma ehi, potrebbe anche funzionare!

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

Il primo sleepregola il tempo di spegnimento, il secondo regola l'autonomia. Allo stato attuale, ha un ciclo di lavoro del 50%. Per mantenere bassa la temperatura, è molto probabile che sia necessario ridurre il ciclo di lavoro a forse il 25% o inferiore (1 secondo di funzionamento, 3 secondi di sospensione = 1 ogni 4 secondi = 25% di ciclo di lavoro). A sleepproposito, il comando shell può richiedere tempi frazionari. Quindi potresti anche dire sleep 0.1. Tienilo oltre 0,001 solo per essere sicuri, e non dimenticare che anche l'esecuzione dello script aumenta.


+1 Bella idea! Immagino sia simile allo strumento cpulimit che Huygens suggerisce.
Nicolas Raoul,

Tranne lo strumento di Huuygens è molto migliore e più pratico, motivo per cui quella risposta ha ottenuto il mio +1. :)
Alexios,

0

Un modo più generico di limitare la CPU è l'utilizzo /sys. Questo sembra comunque ciò che desideri poiché cose diverse da quelle che tarsono in grado di eseguire compiti computazionalmente costosi, è solo che stai vedendo tarfarlo di più.

Il modo per farlo è:

  1. vai su /sys/devices/system/cpu/cpuX/cpufreqper ciascuna delle tue CPU (sostituisci cpuXcon ogni CPU).
  2. Quindi cerca nel file scaling_available_frequenciesper vedere quali frequenze sono supportate dalla tua CPU.
  3. Scegli una frequenza (diciamo 1234567) e fallo echo 1234567 > scaling_max_freq

Ciò impedirà alla CPU di andare mai oltre la frequenza specificata.


Grazie, ma sono già alla frequenza più bassa possibile. Avrei dovuto dirlo. Ho iniziato a eseguire il underclocking non appena questi problemi hanno iniziato ad apparire.
Nicolas Raoul,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.