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.