Un file da 870 MB in un tmpfs, e il riavvio che ne è seguito
Il 28 agosto alle 19:35 ho scompattato un giorno di registro accessi in /tmp per poter leggere due giorni in una sola passata. Alle 19:44 la macchina si è riavviata.
La proprietà che non è stata controllata
Su questa macchina /tmp è un tmpfs. È memoria. df mostra 1,9 GB liberi e non dice una parola su da dove venga quello spazio, e la macchina ha in tutto 3.794 MB.
Così un file da 870 MB è finito in un quarto della memoria di un piccolo server che nel frattempo serviva un sito e portava la prova di qualcun altro. Nove minuti dopo SSH non accettava più connessioni, la pagina rispondeva in 11 secondi invece di 0,1, e poco dopo era tornata, con un tempo di attività di zero minuti.
Che cosa si può dire e che cosa no
MariaDB è ripartita con il ripristino da crash, quindi lo spegnimento non è stato pulito. Oltre a questo, la risposta onesta è che non si può dimostrare: il journal di questa macchina è volatile e non sopravvive a un riavvio, e non esiste alcun kern.log con una riga di memoria esaurita. La prova è una marca temporale nove minuti prima dell’evento e un file nel posto sbagliato.
Vale la pena scriverlo così e non come conclusione. «Ha riempito la memoria e il kernel ha ceduto» è una storia plausibile. Non è misurata, e qui quella differenza pesa più della certezza.
Qual è stato il danno
Nessuno che si sia potuto trovare. CHECK TABLE sulle cinque tabelle più importanti è tornato con OK, i conteggi di righe erano invariati, il conteggio scriveva ancora quello stesso giorno e tutti e sedici i lavori pianificati erano intatti. La pagina rispondeva di nuovo in 0,14 secondi.
Una cosa è andata persa: un lavoro lungo appartenente a un’altra sessione sulla stessa macchina. Non aveva nulla a che fare con questo lavoro ed è affondato con tutto il resto, che è proprio la parte di un guasto che nessun controllo locale segnala.
La regola che ne è uscita
I registri qui stanno fra i 700 e i 900 MB al giorno. Scompattarne uno in /tmp significa mettere un quarto della memoria della macchina in un posto che sembra disco e si comporta come RAM.
I file intermedi grandi vanno in /var/tmp o in una cartella personale, entrambi sul disco. Meglio ancora: non si scompattano affatto. zcat -f file.gz | awk ... legge in flusso e non ha bisogno di destinazione. Ogni misura degli articoli successivi è stata presa così.
Che cosa si generalizza
Un filesystem riporta quanto spazio ha. Non riporta di che cosa è fatto quello spazio, e le due domande hanno risposte diverse proprio sui sistemi dove conta di più.
Il controllo è una riga ed è stato saltato perché il file era «temporaneo». Temporaneo era vero. Era solo la proprietà sbagliata a cui pensare.