Uneori problema nu este ca discul este plin in sensul clasic.
Te uiti cu:
df -h
si vezi ca mai exista spatiu liber. Totusi aplicatia incepe sa se comporte ciudat: upload-uri care esueaza, sesiuni care nu se mai scriu, cache care nu se mai actualizeaza, loguri lipsa sau erori de tipul:
No space left on device
In cazul asta merita verificat si consumul de inode-uri.
Ce sunt inode-urile, pe scurt
Pe un filesystem Linux, spatiul pe disc si inode-urile sunt lucruri diferite.
Spatiul pe disc iti spune cati GB mai ai disponibili.
Inode-urile iti spun cate fisiere si directoare mai poate tine filesystem-ul.
Un fisier foarte mic consuma putin spatiu, dar consuma tot un inode. Daca o aplicatie creeaza foarte multe fisiere mici, poti ajunge in situatia in care mai ai spatiu liber pe disc, dar nu mai poti crea fisiere noi.
De aici apar simptome ciudate: aplicatia pare stricata, dar problema reala este in filesystem.
Cum verifici
Verificarea pentru spatiu:
df -h
Verificarea pentru inode-uri:
df -i
Daca vezi ceva de genul:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda2 6553600 6500000 53600 100% /
atunci problema este destul de clara. Filesystem-ul respectiv nu mai are inode-uri libere sau este foarte aproape de limita.
Important este sa verifici mount-ul corect. Poate problema nu este pe /, ci pe /var, /home, /srv, /data sau pe un volum separat folosit de aplicatie.
Unde se intampla de obicei
Problema apare des in zone unde se strang multe fisiere mici:
/tmp
/var/tmp
/var/cache
/var/log
/var/lib
/var/spool
/var/www
/srv
La aplicatii web, merita verificate si directoarele de cache, sesiuni, upload-uri, fisiere generate, thumbnail-uri sau exporturi temporare.
Nu ai nevoie de fisiere mari ca sa consumi toate inode-urile. Ajung foarte multe fisiere mici, adunate in timp.
Cum cauti zona cu probleme
Poti incepe cu o verificare pe directoarele mari din filesystem-ul afectat.
Pentru /var:
for dir in /var/*; do
echo "$dir"
find "$dir" -xdev -printf '.' 2>/dev/null | wc -c
done
Pentru o zona de aplicatie:
for dir in /var/www/example/*; do
echo "$dir"
find "$dir" -xdev -printf '.' 2>/dev/null | wc -c
done
O alta varianta utila este sa vezi directoarele cu multe fisiere:
find /var -xdev -type f 2>/dev/null | sed 's#/[^/]*$##' | sort | uniq -c | sort -nr | head -30
Comenzile astea sunt pentru investigare. Pe sisteme mari pot dura si pot genera I/O, deci nu le rula orbeste pe productie in plin varf de trafic.
Ce nu trebuie facut
Nu sterge direct cu:
rm -rf /cale/oarecare/*
doar pentru ca ai gasit multe fisiere acolo.
Intai trebuie inteles ce sunt fisierele, cine le foloseste si daca pot fi sterse fara efecte laterale.
Poti sterge din greseala sesiuni active, fisiere de upload, cache necesar, fisiere temporare inca folosite sau loguri utile pentru investigatie.
O curatare facuta in graba poate rezolva simptomul pe moment, dar poate produce alta problema.
Ce faci practic
Dupa ce ai identificat sursa, curatarea trebuie facuta controlat.
Pentru fisiere temporare vechi, intai doar listezi:
find /tmp -xdev -type f -mtime +7 -print
Daca esti sigur ca pot fi sterse:
find /tmp -xdev -type f -mtime +7 -delete
Pentru cache de aplicatie, ideal este sa folosesti comanda sau procedura aplicatiei, nu sa stergi manual fara context.
Pentru loguri, verifica logrotate:
logrotate -d /etc/logrotate.conf
Optiunea -d este debug, deci verifica fara sa aplice efectiv rotirea.
Pe termen mai lung, solutia nu este doar sa cureti manual. Trebuie retention, logrotate corect, curatare periodica pentru temp/cache si monitorizare pentru inode-uri, nu doar pentru spatiu pe disc.
Concluzie
Daca df -h arata bine, dar aplicatia spune No space left on device, verifica si:
df -i
Este o verificare simpla, dar poate schimba complet directia investigatiei.
Problemele cu inode-uri apar de obicei din multe fisiere mici: cache, sesiuni, temp, upload-uri, loguri sau fisiere generate.
Nu sterge orbeste. Identifica sursa, intelege ce fisiere sunt acolo, curata controlat si pune o regula clara ca problema sa nu revina.
In productie, spatiul pe disc nu este singura limita. Uneori limita este numarul de fisiere pe care filesystem-ul mai poate sa le tina.