Ieri sono intervenuto su un server che aveva un load average parecchio alto e passava il 90% del tempo in modalità kernel. Usando il comando top
ho visto che i processi in cima alla classifica erano dei server oracle ed exim. I processi oracle possono stare lì per parecchio tempo perché vi possono essere delle query particolarmente impegnative, ma il comando exim mi ha un po’ insospettito.
Ho quindi verificato che un certo job veniva lanciato dal cron ogni minuto e inviava un email con degli errori di sintassi. Exim avrebbe dovuto occuparsi della consegna dell’email, ma a causa di un errore nella configurazione del DNS, non vi riusciva e si riproponeva di riprovare più tardi, lasciando quindi quell’email in coda.
Tutti i messaggi della coda di Exim stanno nella directory /var/spool/exim/input
. In questa directory c’erano circa 177000 file. I file di per sè sono tanti, ma rimangono gestibili. Visto che tutti quanti erano eguali e riportavano gli stessi errori, ho pensato di rimuoverli con piccolo ciclo shell che richiamasse il comando exim -Mrm NOMEFILE
. Dopo circa mezz’ora erano stati cancellati solo 6000 file e il load average era raddoppiato. Allora ho fatto il tutto in maniera forse poco ortodossa, cancellando con il comando rm
tutto il contenuto della directory.
Il load average è sceso, ma i nuovi messaggi generati dal cron (per il job in questione e per altri job) facevano comunque sì che il processo exim restasse in cima alla classifica. E soprattutto, la maggior parte del tempo CPU era sempre passata in modalità kernel anziché utente.
Ho allora verificato quanto fosse grande la directory /var/spool/exim/input:
# ls -ld /var/spool/exim/input
drwxr-x--- 2 Debian-exim Debian-exim 4643078144 dic 12 17:39 /var/spool/exim/input
che fa circa 4Gb per la sola directory. Ho quindi «clonato» la directory e tutto si è magicamente sistemato:
# mkdir /var/spool/exim/input2
# chown --reference /var/spool/exim/input{,2}
# chmod --reference /var/spool/exim/input{,2}
# mv /var/spool/exim/input{,.bak} && mv /var/spool/exim/input{2,}
# invoke-rc.d exim restart