Limitare la velocità di copia o decompressione di un file

Mi son trovato nella condizione di avere un grande file compresso che dovevo decomprimere ma limitando la velocità di compressione.
Utile ad esempio se stiamo per scrivere su una condivisione nfs e non vogliamo intasare la banda.
Per la semplice copia di un file, si può raggiungere lo scopo tramite rsync e l'opzione --bwlimit ma per la decompressione no.

Come fare?

Bisogna installare il programma 'pv' e poi usarlo in questo modo

gunzip -c filegrande.img.gz | pv -r -L 5m | cat > /media/nfs/decompresso.img

Cosa avviene?

  • gunzip decomprime il file e redirige l'output sullo std out;
  • la pipe lo manda nello std input di pv;
  • pv è in grado di misurare la velocità (-r) del trasferimento dati ma anche di limitarla (-L);
  • a sua volta rimanda tutto sullo std out;
  • la seconda pipe redirige tutto nello std in del comando successiv o (cat);
  • cat non fa altro che redirigere lo std out in un file ed il gioco è fatto.

 

Nota: al posto di cat avremmo potuto usare dd, se vi piace di più:

gunzip -c filegrande.img.gz | pv -r -L 5m | dd of=/media/nfs/decompresso.img

Considerazione:  sicuramente riusciamo a non intasare la banda di una condivisione nfs ma lo stesso non si può dire dell'accesso al disco in scrittura (che era il mio scopo principale >:(   ).
Si potrebbe pensare che il server nfs appena riceve dei dati, li scriva su disco. Se riceve 10Mbyte/s di dati e la velocità di scrittura del disco è 40Mbyte/s non si dovrebbe impegnare il discho in scrittura al 100%...invece lo fa...a salti.
Questo perché linux prima di scrivere su disco, sembra fare parecchia cache su ram, fino a riempirla. Raggiunto un certo limite, ad esempio 2G, comincia a scrivere alla massima velocità su disco.