Le deploy échoue : « No space left on device ». df -h montre 35 % libre sur /var. Personne ne regarde df -i : 100 % inodes utilisés dans storage/framework/sessions — 4 millions de fichiers de 100 octets.
Les inodes sont le plafond invisible des petits fichiers.
Comprendre les inodes
Chaque fichier, symlink, socket = 1 inode (simplifié). Création impossible si inode table pleine même avec Go libres.
df -i avant chaque incident « espace ».
Diagnostic
for d in /*; do echo $(find $d -xdev | wc -l) $d; done — lent mais révélateur.
Plus rapide : find /var/www -xdev -type f | cut -d/ -f1-5 | sort | uniq -c | sort -n.
Causes web classiques
Sessions file driver, cache view compilé, failed queue jobs, extract zip temporaire, logs multi-fichiers par requête.
| Fix | Action |
|---|---|
| Sessions | Redis/database driver |
| Cache | TTL + prune scheduled |
| Queue failed | Horizon/cleanup job |
| Upload temp | cron tmpwatch |
Cleanup sans casse
Arrêtez écriture (maintenance mode), purge ciblée, pas rm -rf aveugle sur sessions actives.
Vérifiez legal hold / audit avant purge logs.
Architecture
Séparer /var/cache ou sessions sur volume dédié. Sharding hash subdirs (aa/bb/file). Monitor inode % comme disk %.
Prévention continue
Alerte inode 85% comme disque 85%. Cron prune cache nightly avec metric fichiers supprimés.
Sessions : migrer Redis avant inode incident — retrofit urgent coûte plus.
Évitez millions fichiers flat : hash subdirs ab/cd/ef123.
Conteneurs : limit log rotation driver json-file max-size.
Support ticket inode quota mutualisé : demander chiffre avant upgrade plan — parfois gratuit.
Migration sessions file → Redis
Plan : dual-write sessions temporaire, flip config, purge file sessions après 24h TTL max.
Mesure inode before/after — preuve fix.
Framework cache prefix : versionner clé cache (v2_) pour purge mass safe.
Maildir thousands fichiers : migration vers DB ou object pour pièces jointes — inode fix temporaire purge, pas durable.
CI artifact cache local : nettoyage branch stale — chaque branch = milliers fichiers.
Outils diagnostic
ncdu interactif pour naviguer millions petits fichiers. debugfs expert only.
Mail queue exim/qmail : chaque message fichier — purge queue si spam attack inbound.
Plan capacity : inode count at mkfs if rebuilding FS — mkfs.ext4 -N tuning.
Synthèse opérationnelle
Inodes épuisés signalent design inadapté (sessions fichier, cache illimité) plus que manque d'espace Go. df -i systématique sur « no space left ». Migration sessions Redis, prune cache, sharding hash directories.
Conteneurs et mutualisé : quotas inode panel — ticket support avant saturation.
Plan remediation 48h
Jour 1 : confirm df -i, locate top directory, enable maintenance if needed, prune cache safe subset. Jour 2 : migrate sessions Redis, deploy cron prune, add inode alert 85%. Semaine : refactor cache strategy, hash subdirs, capacity review with host support.
Communication interne : inode incident ≠ disk full — message clair évite mauvaise action finance « acheter Go ».
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Prévention inode
Alerte 85%. Sessions Redis migration. Hash subdirs. Cron prune. Support quota inode avant upgrade plan inutile.
Formation : inode ≠ Go libres. Template repo sessions Redis default.
Conteneurs et cache
json-file log max-size. Cache prefix versionné v2 pour purge safe.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Décider et avancer sans angle mort
- Confirmer avec
df -i— pas confondre avec disque plein en Go ; message clair à la finance. - Localiser le répertoire fautif — cache sessions, thumbnails, logs fragmentés, millions de petits fichiers.
- Migrer sessions vers Redis — avant l'incident si possible ; retrofit urgent coûte plus.
- Hasher les sous-répertoires —
ab/cd/ef123au lieu de millions de fichiers à plat. - Alerter inode à 85 % — comme disque 85 % ; cron prune nightly avec métrique.
Demandez le quota inode au support mutualisé avant upgrade — comparez via l'annuaire et le comparateur.
Questions fréquentes
Différence espace disque et inodes ?
Le disque peut afficher des Go libres alors que le système de fichiers n'a plus d'inodes pour créer un fichier — fréquent avec millions de petits fichiers cache ou sessions.
Que faire en urgence ?
Confirmez df -i, identifiez le top répertoire, purgez cache sûr ou migrez sessions vers Redis. N'achetez pas des Go supplémentaires — le problème n'est pas la capacité bloc.
Si votre cache écrit un fichier par requête, le plafond inode arrive avant le plafond disque — comptez.
