IONICE: come limitare i processi troppo avidi di I/O disco

Vi è mai capitato di vedere il vostro server o desktop, diventare improvvisamente poco reattivo (o anche del tutto congelato) e scoprire che un processo stava accedendo senza particolare riguardo al disco, causando di fatto un rallentamento allarmante della macchina? Beh a me sì, molte volte.

Si riconosce questa situazione dal livello percentuale di CPU in Wait State (WA nel top).

Su macchine desktop ci si ritrova nei guai con tutte quelle operazioni che lanciate da shell coinvolgono file (o directory) di grosse dimensioni, quali copia, tar, zip/unzip, split, merge (cat nome* > nomefinale). Se le operazioni vengono lanciate da interfaccia grafica il problema non si pone, ma da shell, sono dolori. Provate ad esempio a lanciare uno split di un file da 50Gb in file da 4 Gb per poterli copiare su un disco esterno con filesystem FAT32, dopo poche decine di secondi il vostro pc divenerà praticamente inutilizzabile.

Quando mi è capitato la stima verso linux mi è caduta sotto il livello del suolo, ma come sempre dopo poco mi sono detto che era probabilmente questione di mia ignoranza e non colpa del mio amato sistema operativo e in effetti così è, c’era da dubitarne?

Così dopo un po’ di tempo (ma poco davvero) speso a disturbare “google consulting” (insomma dopo un paio di link restituiti dalla ricerca) ecco la soluzione: ionice.

Qui potete trovare un bell’articolo sull’uso del comando:

http://friedcpu.wordpress.com/2007/07/17/why-arent-you-using-ionice-yet/

per i pigri e per quelli che sono allergici all’inglese alcuni veloci esempi di uso:

obbligare un processo ad accedere al disco solo se nessun altro processo lo richiede:

ionice -c3 -ppid (dove pid è il process id del processo che vogliamo limitare nell’uso del disco)

le classi di priorità sono tre:

  • 1 = real time
  • 2 = best effort (accetta come ulteriore parametro la prioritè espressa da 0 massima a 7 minima) questa con priorità 0 (quindi la più elevata) è la classe  standard per i processi al loro lancio
  • 3 = idle

Attenzione a settare la priorità di accesso al disco un processo a 1, perchè in questo caso fino a che il processo in questione non ha terminato le attività su disco TUTTI gli altri processi saranno “freezati”

esempi:

> ionice -c2 n0 tar -cf file.tar /home/myhome

esegue un tar della propria home sul file file.tar con classe di esecuzione 2 (best effort) e priorità 7 quindi abbassa la priorità del processo.

> ionice -p3456

restituisce la classe e l’eventuale priorità per il processo 3456

Per mia esperienza per i processi che devono fare elaborazioni non urgenti su disco, se non si vuole perdere velocità di risposta del sistema, la classe da usare è la 3.

Visto che i processi ereditano la priorità del processo padre quando lanciamo la shell sarà sufficiente lanciare un ionice per la shell appena aperta e tutti i comandi lanciati verranno eseguiti con classe pari a quella impostata per la shell.

Come farlo in modo semplice? Semplice! Basta ricordare che la variabile $$ ritorna il PID della shell, a questo punto basterà il semplice comando:

>ionice -c3 -p$$

e tutti i comandi lanciati da questa shell avranno classe IDLE

NOTA: ionice funziona solo se la versione del kernel in uso è > 2.6.13

NOTA2: ionice funziona solo se lo scheduler per il device (HDD) è il CFQ ma è in pratica il default per i kernel 2.6 quindi non dovrebbero esserci problemi