Vos SSD meurent, et ce n’est pas de la malchance. C’est votre façon d’écrire. Les backends post‑LLM sont devenus discrètement très orientés écriture : embeddings, compactages de bases vectorielles, scratch d’agents, logs structurés et caches de CI. Si vous n’avez pas fixé un budget d’endurance (DWPD/TBW) et instrumenté l’amplification d’écriture, vous pariez sur des décès précoces et silencieux de NVMe — souvent en 6 à 18 mois.
Hacker News a passé la semaine dernière à remettre en avant un papier classique sur l’écriture efficace sur SSD. Très bien. Mais le lire ne vous sauvera pas. Il vous faut une politique. Voici un playbook opérationnel pour des CTO qui ne veulent ni remplacer des disques chaque trimestre ni découvrir ce que « media wearout indicator 0xE2 » signifie à 2 h du matin.
Ce qui a changé : les backends IA sont des machines d’écriture
Trois évolutions ont discrètement fait exploser les budgets d’endurance SSD :
- Embeddings et réindexation : le chunking des données et l’(ré)embedding de millions de documents génèrent des écritures séquentielles de plusieurs Go/jour ; les bases vectorielles ajoutent ensuite la compaction.
- Observabilité omniprésente : traces au niveau des tokens, logs structurés et artefacts par requête (prompts, appels d’outils intermédiaires) augmentent les petites écritures synchrones.
- Scratch d’agent + caching : caches locaux pour sorties de modèles, reranking et retrieval produisent des rafales d’écriture et de petits fichiers chauds qui amplifient le GC interne.
Votre stockage n’a pas empiré. Vos charges, si.
Les maths de l’endurance en 5 minutes
Vous ne contrôlez pas la physique du NAND ; vous contrôlez la vitesse à laquelle vous la brûlez. Deux nombres comptent :
- DWPD (Drive Writes Per Day) : combien d’écritures complètes du disque par jour un SSD est garanti de supporter pendant sa période de garantie (généralement 5 ans).
- TBW (Total Bytes Written) : le volume total de données écrites autorisé sur la période de garantie.
Ils sont liés : TBW ≈ Capacity × 365 × Years × DWPD.
Vérification de réalité : grand public vs entreprise
- NVMe grand public 1 To : TBW souvent 300–600 To → ≈0,16–0,33 DWPD sur 5 ans. Traduction : ~160–330 Go/jour en sécurité, pas 1–2 To/jour.
- U.2 entreprise 3,84 To (TLC) : 1–3 DWPD → 7 000–21 000 To TBW. Traduction : budget de 3,8–11,5 To/jour pendant 5 ans avec protection contre les coupures d’alimentation.
- SSD QLC « capacity » : moins chers, mais endurance généralement 0,2–0,8 DWPD. Pas pour les chemins d’écriture « hot ».
Ajoutez maintenant le WAF (Write Amplification Factor) : le ratio entre écritures NAND et écritures hôte, typiquement 1,2–5 en production. Si votre OS rapporte 2 To/jour mais que le SSD journalise 4 To/jour, votre WAF est 2 — et votre disque meurt deux fois plus vite que vous ne le pensez.
Un exemple concret
Vous exploitez un service à forte récupération sur un NVMe grand public de 1 To sur une machine de dev ou un nœud on‑prem. Les écritures hôte moyennent 1,2 To/jour. Le SMART du SSD « Data Units Written » indique 2,0 To/jour. WAF ≈ 1,7.
- DWPD effectif = 2,0 / 1,0 = 2,0
- TBW ≈ 600 To (typique)
- Espérance de vie à ce rythme ≈ 600 To / 2,0 To/jour = 300 jours
Il tombe en panne en ~10 mois. Ce n’est pas un défaut — c’est des maths.
La politique : fixez un budget d’endurance
Avant tout tuning, tracez une ligne pour chaque machine ou volume :
- Budget DWPD : ciblez un DWPD ≤ 0,3 pour les NVMe grand public ; ≤ 0,8 pour les QLC ; ≤ 1,5 pour les TLC entreprise (sauf si vous avez acheté des modèles 3 DWPD).
- Mesurez les écritures hôte et le WAF : il faut les deux pour être honnête avec vous‑même.
- Classez les sources d’écriture : base/index vectoriel, WAL OLTP, logs/traces, caches/scratch, CI/CD et overlays de conteneurs.
- Allouez un budget quotidien de bytes par classe et faites‑le respecter via limites de débit, rotation et déport vers du stockage objet.
Le reste est du détail d’implémentation.
Mesurez ce que voit le SSD
Sur bare metal et la plupart des clouds
- Écritures OS : node_exporter (node_disk_written_bytes_total), iostat, ou /sys/block/<dev>/stat.
- Écritures NAND du SSD : page de log NVMe SMART (nvme smart-log). Suivez Data Units Written et Percentage Used. Exposez‑les à Prometheus.
- WAF : WAF = NAND_writes / Host_writes. Alertez si > 2 pendant plus d’1 heure.
Sur volumes managés (EBS, PD, Azure Disks)
- Suivez VolumeWriteBytes et VolumeWriteOps. Vous ne verrez pas les écritures NAND ; traitez le risque WAF comme une fonction du profil de charge (petites écritures synchrones = mauvais).
- Privilégiez le stockage NVMe local d’instance pour le scratch chaud et les logs réhydratables ; utilisez les volumes réseau pour les données durables avec des patterns amicaux pour le WAL.
Décisions d’architecture qui sauvent des SSD
1) Logs et traces : streamer, compresser et purger agressivement
- Réglez max-size/max-files sur les logs de conteneurs ; utilisez un driver de logging non bloquant (Fluent Bit/Vector) pour expédier vers S3/GCS avec zstd niveau 3–6.
- Échantillonnez les traces. Les traces au niveau des tokens sont idéales pour le debug, pas pour 100 % du trafic prod. Échantillonnez à 1–5 % ou selon le taux d’erreur.
- Déportez la rétention long terme vers du stockage objet ; gardez au plus 24–72 h en « hot » sur le NVMe local.
2) OLTP et WAL : batcher et compresser
- Pour Postgres, activez wal_compression=on (LZ4 si disponible) et envisagez des politiques synchronous_commit qui reflètent les besoins réels de durabilité par classe de transaction.
- Utilisez des batches d’ingestion/copy au lieu de transactions minuscules ; visez des rafales d’écriture de 4–16 Mo.
- Placez les fichiers tmp et chemins de spill sur un périphérique de scratch séparé que vous êtes prêt à remplacer fréquemment.
3) Bases vectorielles : les choix d’index sont des choix d’endurance
- Pré‑batcher les embeddings et réaliser les constructions d’index hors du primaire. Écrire une fois, échanger de façon atomique.
- Préférez des index amicaux au disque (p. ex. variantes DiskANN) aux réécritures constantes in‑place. Utilisez PQ/IVF pour réduire l’empreinte brute de 4 à 16× avant d’écrire.
- Avec des stores adossés à RocksDB, limitez le débit de compaction (RocksDB RateLimiter), augmentez la taille des memtables/CF pour absorber les pics et tunez les fichiers blob pour les grandes valeurs afin de réduire le churn de petites écritures.
4) Caches et scratch d’agents : séparés et sacrificiels
- Mettez les caches éphémères sur leur propre volume ou classe de périphérique. S’il meurt, vous ne perdez pas le nœud.
- Utilisez tmpfs (RAM) pour le scratch « hot » sous le Go. La mémoire coûte moins cher que des SSD morts.
- Définissez TTL et plafonds de taille. Si votre cache peut croître sans limite, il le fera.
5) CI/CD et artefacts : l’hygiène bat l’héroïsme
- Limitez le churn des layers avec les exports de cache Docker buildx vers du stockage objet plutôt que de matraquer l’overlayfs local.
- Utilisez overlay2 metacopy=on, redirect_dir=on sur Linux pour réduire les copies de données lors des renoms/déplacements.
- Nettoyez agressivement. N’accumulez pas 200 Go de layers sur les laptops développeur avec des SSD grand public.
Réglages FS et OS qui comptent vraiment
- noatime (ou relatime par défaut sur les distros récentes) : évitez les écritures de métadonnées supplémentaires lors des lectures.
- discard=async (ou fstrim hebdomadaire) pour des performances soutenues et un GC interne moindre.
- Ordonnanceur d’E/S : NVMe préfère none (noop). N’essayez pas d’être plus malin que le contrôleur du SSD.
- ext4 vs XFS : les deux conviennent. XFS passe à l’échelle pour des écrivains parallèles ; ext4 est prévisible pour des charges mixtes. Ce qui compte davantage, c’est votre pattern d’écriture.
- Grosses écritures alignées : coalisez à ≥1 Mo autant que possible. Évitez les tempêtes de sync en 4 Ko.
Matériel à réellement acheter
- TLC entreprise avec PLP : la protection contre les coupures d’alimentation évite que des écritures FUA surprises ne dégénèrent en chaos amplifié. Pensez PM9A3, P5510‑class, ou équivalent.
- Marge de capacité : l’endurance augmente effectivement quand vous laissez 20–30 % d’espace libre. L’over‑provisioning abaisse le WAF.
- QLC uniquement pour le « cold » : excellent pour des données majoritairement en lecture à bas coût. Pas pour votre tier de compaction, le WAL ou les caches.
Kubernetes et réalité multi‑tenant
- Request/limit ephemeral-storage par pod. Alertez lorsque les nœuds dépassent 70 % d’usage éphémère ; limitez ou éjectez avant que le SSD ne parte en thrash.
- Montez les volumes de scratch (hostPath ou PV locaux) sur des périphériques séparés de votre volume DB principal.
- Des sidecars verbeux en logs vont assassiner l’endurance. Expédiez les logs sur le réseau ; ne taillez pas sur disque pour ensuite relayer.
Nuances cloud : vous ne voyez pas le NAND, mais vous pouvez quand même le brûler
Le stockage bloc managé masque le TBW, mais vous payez toujours vos patterns — en throttling IOPS, latence, coûts de réindexation et remplacements EBS « surprise » pendant les fenêtres de maintenance.
- Gardez les données write‑hot sur le NVMe local d’instance avec checkpoint/réhydratation depuis du stockage objet.
- Utilisez des profils gp3/io2 dimensionnés pour votre pattern de burst‑batched, pas pour le pire cas d’écritures sync minuscules.
- Snapshot après quiescence pour éviter des restaurations point‑dans‑le‑temps à fort churn qui matraquent les journaux.
Observabilité : prouvez que vous êtes dans le budget
Tableaux de bord avec trois graphes par périphérique
- Écritures hôte (Go/jour)
- « Data Units Written » du SSD (Go/jour) ou métrique proxy cloud
- WAF (devrait osciller entre 1,1 et 1,8 pour des systèmes sains et batchés ; alerte à 2+)
Alertes qui valent un appel
- Percentage Used > 80 % sur SMART pour tout périphérique de prod
- Incréments d’erreurs Media/CRC non nuls
- WAF > 2 maintenu > 30 minutes sur les volumes DB primaires ou de store vectoriel
Faites tourner les disques ou migrez les volumes avant la panne quand Percentage Used dépasse 90 % ou quand des attributs de panne prédictive se déclenchent. Planifiez les remplacements comme vous planifiez les renouvellements SSL — ennuyeux et à l’heure.
Patrons de conception qui divisent les écritures par 2 à 10
- Batcher agressivement : regroupez les logs de tokens par requête, pas par token. Micro‑batches amicaux pour le WAL à 4–16 Mo.
- Utilisez le stockage objet comme puits d’écriture : les ajouts et blobs immuables appartiennent à S3/GCS avec des règles de cycle de vie. Le SSD local est pour les index et les jeux de travail « hot ».
- Pré‑compute hors‑ligne : construisez les index hors bande, puis échangez de façon atomique. Évitez le churn des reconstructions in‑place en live.
- Désactivez la journalisation involontaire : deux ou trois couches de journaux (app + DB + FS) multiplient les écritures. Sachez où votre fsync compte vraiment.
- La mémoire plutôt que le disque pour les petits temporaires : tmpfs pour ≤1–2 Go de scratch s’amortit en endurance économisée.
Réalité des coûts : l’électricité flambe — l’endurance est un levier de coûts
Sur le plus grand réseau des États‑Unis, les prix de gros de l’électricité ont bondi de 76 % d’une année sur l’autre. Des patterns lourds en écriture ne font pas que tuer des SSD ; ils brûlent du CPU en compaction et GC, augmentent la consommation électrique et allongent les fenêtres de réindexation qui touchent vos SLO. La discipline d’endurance est un levier de TCO : moins de remplacements, moins de ralentissements, moins de sur‑provisionnement « juste pour survivre aux mardis de compaction ».
Comment nous mettrions cela en œuvre en 30 jours
Semaine 1 : instrumenter et établir la base
- Déployez node_exporter + nvme_exporter ; construisez le dashboard WAF.
- Classez les 5 principales sources d’écriture par nœud. Tagguez par équipe/service.
- Fixez des budgets DWPD par périphérique et créez les alertes.
Semaine 2 : gains rapides
- Activez wal_compression, des plafonds de rotation des logs et la compression zstd pour l’expédition des logs/traces.
- Déplacez le scratch et les caches sur des volumes dédiés ; activez tmpfs pour les temporaires < 1 Go.
- Batcher les embeddings et mettez en pause les reconstructions d’index live jusqu’à disposer d’un pipeline avec échange atomique.
Semaines 3–4 : correctifs structurels
- Mettez en place des constructions d’index hors bande avec promotion atomique.
- Limitation de débit de compaction et tuning des memtables pour RocksDB/store vectoriel.
- Cloud : déplacez les chemins d’écriture « hot » vers le NVMe d’instance avec checkpoint vers stockage objet.
- Procurez des SSD TLC entreprise avec PLP pour les nœuds DB/vectoriels. Laissez 20–30 % d’espace libre.
Résultat que nous observons typiquement : réduction de 2 à 5× des écritures NAND à charge constante, avec des améliorations de latence grâce à un GC plus stable et moins de falaises d’E/S.
Arbitrages à assumer
- Plus de mémoire, moins de douleur disque : utiliser la RAM (tmpfs, memtables plus grosses) coûte de l’argent. Cela se rembourse en endurance et en latence de queue.
- Compaction plus lente vs index plus frais : limiter la compaction peut retarder la visibilité des mises à jour. Acceptable pour le RAG et l’analytics, pas toujours pour l’OLTP.
- Risque du NVMe d’instance : les disques locaux disparaissent à l’arrêt/termination. Il faut automatiser les checkpoints et la réhydratation.
- Coût de la compression : zstd/LZ4 consomment du CPU. Généralement gagnant net si cela évite le thrash disque ; mesurez.
Angle nearshore Brazil : n’expédiez pas des SSD bon marché pour économiser des centimes
Si vous bâtissez des équipes nearshore ou des PoP régionaux in Brazil, ne les équipez pas de M.2 grand public pour gratter 15–20 % de CapEx. Les délais in Brazil pour remplacer des SSD entreprise peuvent être de plusieurs semaines, pas de quelques jours, selon le fournisseur et l’import. Achetez le bon média (TLC avec PLP), surveillez le WAF et traitez les caches comme jetables. C’est moins cher que des imports dictés par une panne et du temps d’ingénierie perdu.
L’essentiel
Les backends de l’ère IA n’ont pas cassé les SSD ; ils ont mis à nu vos patterns d’écriture. Donnez un chiffre à l’endurance, mesurez le WAF et déplacez les données à forts ajouts vers le bon tier. Le reste, c’est de la plomberie. Ennuyeux, fiable, et bien moins cher que des RMA surprises.
Points clés
- Fixez un budget DWPD/TBW par périphérique et alertez sur WAF > 2 — l’endurance est un SLO de première classe.
- Déplacez logs/traces vers du stockage objet, limitez la rétention sur disque à 24–72 h et compressez avec zstd.
- Batcher les écritures (4–16 Mo), activez la compression du WAL et limitez le débit des compactions RocksDB/vectorielles.
- Mettez caches/scratch sur des médias séparés et sacrificiels ou sur tmpfs ; réservez les TLC entreprise avec PLP pour les données primaires.
- Activez noatime et discard=async ; préférez des écritures larges et alignées, évitez les tempêtes de sync en 4 Ko.
- Utilisez le NVMe d’instance pour les écritures « hot » avec checkpoints automatisés ; gardez les données durables sur des volumes réseau dimensionnés.
- Planifiez les remplacements à 80–90 % de « Percentage Used » — n’attendez jamais le voyant rouge.