VDEV spécial ZFS : la fonctionnalité qui accélère les métadonnées (et peut tuer le pool)

Cet article vous a aidé ?

ZFS a le don de rendre les choses difficiles simples — jusqu’à ce que ce ne soit plus le cas. Le vdev spécial est l’une de ces fonctionnalités qui peut donner l’impression qu’un pool est passé du « disque rotatif » au « pourquoi c’est si rapide ? » du jour au lendemain. Placez les métadonnées (et éventuellement les blocs de petits fichiers) sur du flash rapide, et soudain les parcours de répertoires claquent, les snapshots s’énumèrent instantanément, et les lectures aléatoires ne donnent plus l’impression qu’on feuillette un livre en le secouant.

Il peut aussi ruiner votre week-end. Les vdevs special peuvent devenir une dépendance littérale du pool : les perdre peut signifier perdre le pool. Pas « certains fichiers manquent », mais « le pool ne s’importe pas ». Cet article est le guide de l’opérateur : ce que les vdevs special stockent réellement, comment ils modifient les schémas d’E/S, comment les dimensionner et les mettre en miroir, quoi surveiller, et comment éviter l’histoire classique « on a optimisé jusqu’à provoquer une panne ».

Ce qu’est réellement un vdev special

Un pool ZFS est construit à partir de classes de vdev. La plupart des gens vivent dans le monde « normal » : vdevs de données (mirror/RAIDZ) plus éventuellement un slog (journal séparé) et éventuellement un L2ARC. Un vdev special est différent : c’est une classe de stockage qui contient des blocs critiques du pool. En pratique, c’est l’endroit où ZFS peut placer :

  • Les métadonnées (pointeurs de blocs, blocs indirects, dnodes, structures de répertoires, cartes d’espace, etc.).
  • Éventuellement, les petits blocs de données, contrôlés par special_small_blocks.
  • Éventuellement, les tables de déduplication (si la déduplication est activée) et d’autres structures « importantes et coûteuses » selon l’implémentation.

La vérité opérationnelle clé : le contenu d’un vdev special n’est pas un cache. Perdre un cache dégrade les performances. Perdre un vdev special et vous pouvez perdre le pool.

Les vdevs special sont comme un porte-étiquettes d’épices bien organisé dans une cuisine occupée : tout devient plus rapide à trouver. Mais si vous y stockez l’unique exemplaire du livre de recettes et que le porte-étiquettes brûle, le dîner est annulé.

Faits intéressants et contexte historique

Quelques points de contexte rapides qui aident à expliquer pourquoi les vdevs special existent et pourquoi ils se comportent ainsi :

  1. ZFS a été conçu pour des disques lents. Le design initial privilégiait les grosses écritures séquentielles et évitait les I/O aléatoires parce que les recherches sur HDD étaient l’ennemi.
  2. Les I/O de métadonnées sont la taxe latence silencieuse. Beaucoup de plaintes « mon pool est lent » sont en réalité des « mes recherches de métadonnées sont lentes », surtout sur des charges orientées répertoires.
  3. Le copy-on-write multiplie la chasse aux pointeurs. La sécurité de ZFS vient du fait de ne jamais écraser des blocs vivants ; le coût est plus de mises à jour de métadonnées et d’indirection.
  4. OpenZFS a introduit des classes d’allocation pour placer les blocs par type. Les vdevs special font partie de cette évolution : un moyen de dire « ce type de bloc appartient à ce type de média ».
  5. Les charges de petits fichiers pénalisaient RAIDZ sur HDD. RAIDZ est efficace en espace mais peut offrir des IOPS aléatoires douloureux sur du rust. Les accès riches en métadonnées l’exposent rapidement.
  6. ARC a résolu un côté du problème. Le cache en RAM aide, mais les cache miss frappent toujours les disques — et les misses de métadonnées sont fréquents lorsque les datasets ne tiennent pas dans l’ARC.
  7. Le flash a changé les attentes. Une fois que les équipes ont goûté à la latence NVMe, revenir à « la liste de répertoires prend des secondes » est devenu politiquement inacceptable.
  8. Des gens ont essayé des « pools métadonnées uniquement » avant les vdevs special. Certaines équipes séparaient manuellement les workloads sur deux pools (métadonnées sur pool SSD, données ailleurs) et payaient cela en complexité opérationnelle.
  9. Les vdevs special ont rendu le mix-média moins bricolé. Au lieu de deux pools et d’une logique applicative fragile, ZFS peut placer les bons blocs sur les bons périphériques à l’intérieur d’un seul pool.

Blague #1 : Les vdevs special sont comme un expresso — formidables quand vous en avez besoin, désastreux quand vous pensez que c’est un substitut au sommeil.

Pourquoi c’est rapide : la physique des E/S

La plupart des arguments sur « performance de stockage » finissent par se réduire à trois choses : la latence, les IOPS et la profondeur de file d’attente. Les HDD ont un bon débit mais une latence aléatoire catastrophique. Les opérations de métadonnées sont par nature aléatoires :

  • Parcourir un grand répertoire touche plusieurs blocs : entrées de répertoire, dnodes, blocs indirects, parfois plusieurs niveaux.
  • L’énumération des snapshots et la comptabilité d’espace nécessitent des space maps et des structures metaslab.
  • Les appels open/stat peuvent être gourmands en métadonnées même si vous ne lisez aucune donnée.

Placez ces blocs sur SSD/NVMe et vous éliminez la pénalité de recherche. L’effet peut être spectaculaire : un pool qui « passe les benchmarks » en séquentiel peut pourtant être insupportable pour des utilisateurs réels effectuant beaucoup de petites opérations.

Les vdevs special modifient aussi le comportement d’écriture. Les mises à jour de métadonnées font partie de presque chaque commit de groupe de transaction (TXG). Si le vdev special est rapide, le sync du TXG peut se terminer plus vite, ce qui peut réduire la latence perçue sous certaines charges. Mais ce n’est pas magique : si vous saturiez le vdev special, vous pouvez déplacer le goulot d’étranglement des « recherches HDD » vers « NVMe à 100 % d’utilisation ».

Ce qui vit sur le special (métadonnées, petits blocs, autres)

Métadonnées (toujours, si un special existe)

Avec un vdev special dans le pool, ZFS peut y allouer les métadonnées. Cela inclut les dnodes (métadonnées de fichier), les blocs indirects (pointeurs de blocs), les blocs de répertoire et d’autres structures qui rendent le pool navigable.

Petits blocs de fichiers (optionnel)

La propriété de dataset special_small_blocks contrôle si les blocs de données en dessous d’un seuil vont sur le special. Mettez-la à une valeur comme 16K ou 32K et soudain votre charge « millions de petits fichiers » cesse de marteler les recherches aléatoires sur HDD. Réglez-la trop haut et vous risquez de pousser une fraction significative de vos données réelles sur le vdev special, ce qui change votre domaine de défaillance et peut le remplir plus vite que prévu.

Tables de déduplication (prudence)

Si vous activez la déduplication, vous vous engagez dans une vie riche en métadonnées. Les tables de dédup sont sensibles à la latence et peuvent devenir énormes. Un vdev special peut aider, mais « dédup + special vdev » n’est pas un repas gratuit ; c’est plutôt une hypothèque à taux variable.

Ce n’est pas SLOG, ce n’est pas L2ARC

Les opérateurs confondent régulièrement special avec SLOG et L2ARC parce que les trois « impliquent des SSD ». Ils ne sont pas interchangeables :

  • SLOG accélère les écritures synchrones pour les charges qui appellent fsync() ou utilisent des sémantiques sync (bases de données, NFS en sync). C’est un journal, pas un accélérateur de métadonnées.
  • L2ARC est une extension de cache de lecture. Il est jetable. On peut le retirer sans tuer le pool.
  • Special stocke de vrais blocs qui peuvent être requis pour importer le pool.

Modèle de risque : comment cela peut tuer un pool

La phrase la plus importante de cet article est la suivante : les vdevs special font partie de l’histoire de redondance de votre pool.

Quand des métadonnées vivent sur le special, le pool dépend de ce vdev pour fonctionner. Si le vdev special est un périphérique seul (pas de miroir, pas de RAIDZ), et que ce périphérique tombe en panne, vous pourriez être incapable de lire les métadonnées nécessaires pour localiser les blocs de données sur les vdevs principaux. En pratique, vous avez construit un index rapide et vous en avez stocké l’unique copie sur un SSD.

Il existe des situations où le comportement en cas de défaillance partielle varie selon l’implémentation et selon ce qui a été alloué où. En opération, cette nuance ne vous aide pas à 03:00. Traitez la perte d’un vdev special comme une perte de pool sauf si vous avez testé votre scénario exact sur votre version exacte d’OpenZFS.

Blague #2 : Le vdev special est « spécial » comme un contrôleur RAID unique est « spécial » — vous vous en souviendrez à jamais s’il meurt au mauvais moment.

Concevoir des vdevs special : redondance, dimensionnement et périphériques

Règle 1 : mettiez-le en miroir (ou mieux)

En production, la disposition par défaut du vdev special devrait être un miroir. Si le pool est important, mettez le special en miroir en utilisant des périphériques aux modes de défaillance indépendants quand c’est possible (lots différents, firmware différent). Pour des flottes plus grandes, vous pouvez utiliser RAIDZ pour le special, mais les miroirs conservent une latence plus faible et des rebuilds plus simples.

Règle 2 : dimensionnez-le comme s’il allait être populaire

Les erreurs de dimensionnement du vdev special sont fréquentes parce que « métadonnées » semble petit. Ce n’est pas toujours le cas. La quantité de métadonnées dépend de :

  • Nombre de fichiers et répertoires
  • Nombre de snapshots (plus de snapshots = plus de structures metadata à parcourir)
  • Recordsize et comportement de fragmentation
  • special_small_blocks (cela peut transformer un « périphérique métadonnées » en « périphérique de données chaudes »)
  • Déduplication et xattrs/ACLs

Si vous le sous-dimensionnez et qu’il se remplit, ZFS renverra les allocations vers la classe normale dans de nombreux cas. Les performances deviennent alors incohérentes : certaines métadonnées sont rapides, d’autres sur rust, et vos graphiques de latence ressemblent à un sismographe.

Règle 3 : choisissez des périphériques pour la cohérence de latence, pas pour des benchmarks pico

Les vdevs special visent la latence de queue. Un SSD bon marché qui a de bons résultats au benchmark mais un affreux write amplification sous charge metadata soutenue ruinera votre journée. Cherchez :

  • Protection contre la perte de puissance (PLP) quand c’est possible
  • Latence cohérente en lecture/écriture aléatoire mixte
  • Endurance adaptée aux taux d’écriture des métadonnées
  • Firmware stable (évitez les « comportements surprenants des disques grand public »)

Règle 4 : rappelez-vous que l’allocateur est déterministe, mais votre charge ne l’est pas

Une fois que des blocs sont alloués sur le special, ils y restent sauf réécriture. Changer special_small_blocks plus tard ne migre pas les blocs existants. Cela signifie que les décisions prises au départ peuvent peser pendant des années.

Réglages qui comptent (et ceux qui n’en ont pas)

special_small_blocks (compte beaucoup)

Cette propriété décide si les petits blocs de données sont alloués sur le special. Valeurs typiques observées : 0 (désactivé), 8K, 16K, 32K. L’aligner sur la distribution de vos petits fichiers peut être transformateur. Le régler à l’aveugle, c’est la façon de se réveiller avec un vdev special plein.

recordsize et alignement de la charge

recordsize concerne les données de fichier, pas les métadonnées, mais il affecte la formation des blocs de données. Un dataset avec de petits records et beaucoup d’écritures aléatoires augmente la churn de métadonnées et peut accroître la pression sur le special. Ne réglez pas recordsize « parce que quelqu’un sur internet l’a dit ». Réglez-le parce que vous avez mesuré votre charge.

atime (ennuyeux, mais pertinent)

La mise à jour des temps d’accès augmente les écritures de métadonnées. Sur des systèmes sensibles à la latence des métadonnées, désactiver atime peut réduire la churn. Ce n’est pas une panacée, mais ça supprime du travail inutile.

Compression (généralement utile)

La compression réduit les E/S physiques et peut réduire le nombre de blocs. Les métadonnées peuvent aussi compresser. L’effet net est souvent positif, mais ne supposez rien ; mesurez la charge CPU disponible.

Tâches pratiques : commandes, sorties, interprétation

Ce sont des tâches opérateur que vous pouvez exécuter aujourd’hui. Les commandes supposent un système Linux avec OpenZFS. Adaptez les chemins et noms de pool en conséquence.

Task 1: Confirm whether the pool has a special vdev

cr0x@server:~$ sudo zpool status -v tank
  pool: tank
 state: ONLINE
config:

        NAME                        STATE     READ WRITE CKSUM
        tank                        ONLINE       0     0     0
          raidz2-0                  ONLINE       0     0     0
            sda                     ONLINE       0     0     0
            sdb                     ONLINE       0     0     0
            sdc                     ONLINE       0     0     0
            sdd                     ONLINE       0     0     0
            sde                     ONLINE       0     0     0
            sdf                     ONLINE       0     0     0
        special
          mirror-1                  ONLINE       0     0     0
            nvme0n1                 ONLINE       0     0     0
            nvme1n1                 ONLINE       0     0     0

errors: No known data errors

Interprétation : La classe special est présente et en miroir. Si vous voyez un seul périphérique sous special, considérez-le comme une conception à haut risque.

Task 2: Show allocation classes and space usage

cr0x@server:~$ sudo zpool list -v tank
NAME         SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank        65.2T  41.9T  23.3T         -    21%    64%  1.00x  ONLINE  -
  raidz2    65.0T  41.6T  23.4T         -    21%    64%
  special    200G   180G  20.0G         -    35%    90%

Interprétation : Le special est à 90% de sa capacité — c’est une alerte de paging dans la plupart des environnements. Vous voulez de la marge car les allocations de métadonnées peuvent exploser lors de suppressions, snapshots et churn.

Task 3: Check special_small_blocks and dataset properties

cr0x@server:~$ sudo zfs get -r special_small_blocks,recordsize,compression,atime tank/data
NAME       PROPERTY              VALUE     SOURCE
tank/data  special_small_blocks  16K       local
tank/data  recordsize            128K      default
tank/data  compression           zstd      local
tank/data  atime                 off       local

Interprétation : Les petits blocs ≤16K iront sur le special pour les nouvelles écritures. Les fichiers existants ne bougeront pas à moins d’être réécrits.

Task 4: Estimate metadata pressure with file counts

cr0x@server:~$ sudo find /tank/data -xdev -type f | wc -l
12873452

Interprétation : Des dizaines de millions d’inodes signifient que les métadonnées sont une charge à part entière. Le dimensionnement du special doit se baser sur cette réalité, pas sur « les métadonnées sont petites ».

Task 5: Observe real-time I/O distribution by vdev

cr0x@server:~$ sudo zpool iostat -v tank 1 5
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
tank        41.9T  23.3T  1200   900     85M   60M
  raidz2    41.6T  23.4T   200   150     40M   35M
    sda        -      -    35    25      6M    5M
    sdb        -      -    34    26      6M    5M
    sdc        -      -    33    25      6M    5M
    sdd        -      -    33    25      6M    5M
    sde        -      -    33    24      6M    5M
    sdf        -      -    32    25      6M    5M
  special      180G  20G  1000   750     45M   25M
    mirror-1     -     -  1000   750     45M   25M
      nvme0n1    -     -   500   375     22M   12M
      nvme1n1    -     -   500   375     22M   12M

Interprétation : La plupart des opérations touchent le special. C’est attendu pour des charges riches en métadonnées ; cela signifie aussi que la latence du special est maintenant l’expérience utilisateur.

Task 6: Watch latency and queueing (Linux block layer)

cr0x@server:~$ iostat -x 1 3
Device            r/s     w/s   rMB/s   wMB/s  avgrq-sz avgqu-sz await  r_await  w_await  %util
sda              3.0     2.0     0.5     0.6     341.3     1.2  35.0    31.0     41.0   12.0
nvme0n1        520.0   380.0    22.0    12.5      75.0     2.5   2.8     1.9      4.1  89.0

Interprétation : Le NVMe est proche de 90% d’utilisation avec une faible latence moyenne — encore acceptable, mais surveillez la latence de queue. Si await augmente, votre « accélérateur de métadonnées » devient le goulot d’étranglement.

Task 7: Check pool health and error counters aggressively

cr0x@server:~$ sudo zpool status tank
  pool: tank
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
  scan: scrub repaired 0B in 10:22:11 with 0 errors on Sun Dec 22 02:11:03 2025
config:

        NAME                        STATE     READ WRITE CKSUM
        tank                        ONLINE       0     0     0
          raidz2-0                  ONLINE       0     0     0
            sda                     ONLINE       0     0     0
            sdb                     ONLINE       0     0     0
            sdc                     ONLINE       0     0     0
            sdd                     ONLINE       0     0     0
            sde                     ONLINE       0     0     0
            sdf                     ONLINE       0     0     0
        special
          mirror-1                  ONLINE       0     0     2
            nvme0n1                 ONLINE       0     0     4
            nvme1n1                 ONLINE       0     0     0

errors: No known data errors

Interprétation : Les erreurs CKSUM sur le special ne sont pas « bénignes ». Elles sont un signal clignotant indiquant « votre couche metadata est malade ». Planifiez un remplacement et investiguez câblage/réinitialisations PCIe/firmware.

Task 8: Trigger and monitor a scrub (and understand why it matters)

cr0x@server:~$ sudo zpool scrub tank
cr0x@server:~$ sudo zpool status tank
  pool: tank
 state: ONLINE
  scan: scrub in progress since Tue Dec 24 01:20:12 2025
        3.12T scanned at 5.1G/s, 1.20T issued at 2.0G/s, 41.9T total
        0B repaired, 2.86% done, 05:41:10 to go

Interprétation : Les scrubs sont votre système d’alerte précoce pour les erreurs latentes. Les erreurs du vdev special découvertes lors d’un scrub sont un cadeau — profitez-en.

Task 9: View per-dataset logical space and snapshot overhead

cr0x@server:~$ sudo zfs list -o name,used,avail,refer,compressratio -r tank/data | head
NAME                 USED  AVAIL  REFER  RATIO
tank/data           22.1T  18.0T  21.0T  1.35x
tank/data/home       1.2T  18.0T   1.1T  1.20x
tank/data/builds     9.8T  18.0T   8.7T  1.10x

Interprétation : De gros deltas de snapshot et un fort churn corrèlent souvent avec une pression sur les métadonnées. Si le special galère, cherchez les datasets qui génèrent beaucoup de petites modifications.

Task 10: Check ashift and device sector alignment (special hates misalignment)

cr0x@server:~$ sudo zdb -C tank | grep -E 'ashift|vdev_tree' -n | head -n 8
55:        vdev_tree:
56:            type: 'root'
57:            id: 0
58:            guid: 1234567890
74:                    ashift: 12

Interprétation : ashift=12 (secteurs 4K) est une base raisonnable courante. Un ashift mal défini peut provoquer une amplification d’écriture, ce qui est particulièrement pénible sur les vdevs special.

Task 11: Add a mirrored special vdev (carefully)

Exemple d’ajout d’un vdev special en miroir à un pool existant. Confirmez les noms de périphériques, effacez les partitions correctement, et comprenez que cela change la dépendance du pool.

cr0x@server:~$ sudo zpool add tank special mirror /dev/disk/by-id/nvme-SAMSUNG_MZVLB1T0XXXX /dev/disk/by-id/nvme-SAMSUNG_MZVLB1T0YYYY
cr0x@server:~$ sudo zpool status tank | sed -n '1,40p'
  pool: tank
 state: ONLINE
config:

        NAME                                STATE     READ WRITE CKSUM
        tank                                ONLINE       0     0     0
          raidz2-0                          ONLINE       0     0     0
            ...
        special
          mirror-1                          ONLINE       0     0     0
            nvme-SAMSUNG_MZVLB1T0XXXX       ONLINE       0     0     0
            nvme-SAMSUNG_MZVLB1T0YYYY       ONLINE       0     0     0

Interprétation : Utiliser /dev/disk/by-id évite le problème « le reboot a renommé mes disques ». Si vous utilisez /dev/nvme0n1 et que cela change, vous aurez un rapport d’incident excitant.

Task 12: Replace a failing special vdev member

cr0x@server:~$ sudo zpool replace tank nvme0n1 /dev/disk/by-id/nvme-INTEL_SSDPE2KX010T8ZZZZ
cr0x@server:~$ sudo zpool status tank
  pool: tank
 state: ONLINE
  scan: resilver in progress since Tue Dec 24 02:10:33 2025
        78.2G scanned at 1.2G/s, 18.4G issued at 290M/s, 180G total
        18.4G resilvered, 10.22% done, 00:09:12 to go

Interprétation : Les resilver du special sont généralement rapides car ils sont plus petits que le pool principal. Cette vitesse peut induire de la complaisance — traitez-le quand même comme un événement critique.

Task 13: Set special_small_blocks for a dataset (with intent)

cr0x@server:~$ sudo zfs set special_small_blocks=16K tank/data/builds
cr0x@server:~$ sudo zfs get special_small_blocks tank/data/builds
NAME              PROPERTY              VALUE  SOURCE
tank/data/builds  special_small_blocks  16K    local

Interprétation : Les nouveaux petits blocs vont sur le special. Pour migrer des petits fichiers existants, vous devrez réécrire (par ex. réplication, rsync avec réécriture, ou send/receive dans un dataset neuf).

Task 14: Measure metadata-heavy behavior with simple syscalls

cr0x@server:~$ time ls -l /tank/data/builds/objects > /dev/null

real    0m1.842s
user    0m0.110s
sys     0m1.650s

Interprétation : Un temps sys élevé indique du travail kernel/système de fichiers (métadonnées). Comparez avant/après changements de special, et comparez pendant des incidents.

Feuille de route pour un diagnostic rapide

Ceci est le workflow « vous avez 10 minutes avant la réunion ». L’objectif est d’identifier si le goulot d’étranglement est la saturation du special, la latence des vdevs principaux, la pression ARC, ou autre chose.

Première étape : le pool est-il sain, et le special est-il dégradé ?

cr0x@server:~$ sudo zpool status -x
all pools are healthy

Si ce n’est pas sain : arrêtez. Ne faites pas de tuning de performance sur un pool malade. Si le special est DEGRADED, les symptômes de performance peuvent être secondaires à des retries et à la gestion d’erreurs.

Deuxième étape : les opérations sont-elles concentrées sur le special, et est-il occupé ?

cr0x@server:~$ sudo zpool iostat -v tank 1 10

Lisez-le comme un SRE : si le special exécute la plupart des ops et est proche de la saturation du périphérique (vérifiez avec iostat -x), votre « accélérateur » est la réactif limitant.

Troisième étape : l’espace special est-il presque plein ?

cr0x@server:~$ sudo zpool list -v tank

Le special approchant 80–90% est un point d’inflexion courant. Le comportement d’allocation change, la fragmentation augmente, et le pool devient étrangement incohérent.

Quatrième étape : l’ARC manque-t-il des métadonnées ?

cr0x@server:~$ grep -E 'hits|misses|size|c_max' /proc/spl/kstat/zfs/arcstats | head -n 12
hits                            4    987654321
misses                          4    123456789
size                            4    34359738368
c_max                           4    34359738368

Si l’ARC est petit par rapport à la charge et que les misses augmentent, les métadonnées frappent le disque plus souvent. Le special aide, mais si le special est surchargé et que l’ARC est à la diète, vous prenez un double coup.

Cinquième étape : la charge est-elle lourde en écritures synchrones (et vous incriminez à tort le special) ?

cr0x@server:~$ sudo zfs get sync tank/data
NAME       PROPERTY  VALUE  SOURCE
tank/data  sync      standard  default

Si les plaintes de latence coïncident avec les écritures sync et que vous n’avez pas de SLOG approprié (ou que votre SLOG est faible), le special ne vous sauvera pas.

Erreurs courantes (symptômes et corrections)

Erreur 1 : vdev special monodisque en production

Symptôme : Tout va bien jusqu’au jour où ce n’est plus le cas ; une panne d’un seul SSD se transforme en échec d’import ou en erreurs de métadonnées irréparables.

Correction : Utilisez au minimum un vdev special en miroir. Traitez-le comme un disque root dans un système critique : redondance, surveillance, pièces de rechange, et procédures de remplacement testées.

Erreur 2 : régler special_small_blocks trop haut

Symptôme : Le special se remplit de façon inattendue ; les performances se dégradent ; les écritures commencent à déborder sur les HDD ; la latence devient incohérente ; « pourquoi le special est à 95% ? » devient une question hebdomadaire.

Correction : Abaissez special_small_blocks, et planifiez une réécriture/migration des datasets ayant déjà alloué sur le special. Dimensionnez le special sur le pire cas du footprint de petits fichiers, pas sur la moyenne.

Erreur 3 : supposer que le special est un cache qu’on peut « simplement enlever plus tard »

Symptôme : Le plan du projet inclut « ajouter special maintenant, enlever plus tard ». Puis quelqu’un découvre que retirer le special n’est pas comme retirer un L2ARC ; ce n’est pas trivial et peut être impossible sans migration selon la version et l’usage.

Correction : Traitez le special comme un choix architectural permanent. Si vous voulez un accélérateur réversible, utilisez L2ARC (avec des caractéristiques de perf différentes).

Erreur 4 : mélanger des SSD grand public avec comportement perte de puissance douteux

Symptôme : Erreurs aléatoires après des coupures, réinitialisations de contrôleur, pics de latence, erreurs de checksum occasionnelles qui « disparaissent » après un reboot (elles n’ont pas disparu ; vous avez juste arrêté de regarder).

Correction : Utilisez des périphériques adaptés aux métadonnées critiques : PLP si possible, firmware conservateur, et backplanes PCIe stables. Surveillez SMART et les logs d’erreurs.

Erreur 5 : sous-surveiller l’utilisation et l’usure du special

Symptôme : Vous découvrez le special plein ou en fin d’endurance pendant un incident non lié. Le pool est « rapide » jusqu’à un mur.

Correction : Alertez sur la capacité du special, l’usure des périphériques et les compteurs d’erreurs. Suivez les taux d’écriture. Planifiez des cycles de remplacement.

Erreur 6 : confondre les bénéfices du special avec « réparer la fragmentation »

Symptôme : L’équipe ajoute un special et s’attend à ce que le débit séquentiel s’améliore ; ce n’est pas le cas. Ou elle s’attend à ce que cela guérisse l’amplification d’écriture d’un pool RAIDZ très fragmenté.

Correction : Le special aide les métadonnées et les petits I/O. Il ne change pas la géométrie fondamentale de RAIDZ pour les gros flux. Ne le survendez pas.

Checklists / plan étape par étape

Étape par étape : décider de déployer un vdev special

  1. Identifiez la douleur : Est-ce la latence des métadonnées (stat/open/ls), les IOPS de petits fichiers, l’énumération des snapshots, ou la latence d’écritures sync ?
  2. Mesurez le baseline : Capturez zpool iostat -v, iostat -x, et de simples benchmarks de syscalls (listing de répertoire) pendant une période lente.
  3. Confirmez la posture de redondance : Si vous ne pouvez pas miroiter les périphériques special, vous n’êtes pas prêt.
  4. Estimez la capacité du special : Nombre de fichiers, comportement de snapshots, et si vous utiliserez special_small_blocks.
  5. Sélectionnez les périphériques : Optimisez pour la cohérence de latence et l’endurance, pas pour des IOPS marketing.
  6. Planifiez la surveillance : Alertes de capacité, usure SMART, compteurs d’erreurs, et tableaux de bord de performance.
  7. Planifiez des drills de panne : Entraînez-vous à remplacer un membre miroir du special en fenêtre de maintenance avant d’y être forcé pendant une panne.

Étape par étape : plan de déploiement sécurisé en production

  1. Ajoutez un vdev special en miroir (jamais un disque seul) pendant une fenêtre contrôlée.
  2. Commencez par métadonnées uniquement (laissez special_small_blocks=0 initialement) et observez.
  3. Mesurez les changements dans les opérations metadata et l’utilisation des périphériques special.
  4. Si nécessaire, activez les petits blocs pour des datasets spécifiques seulement (pas pour tout le pool), en commençant à 8K ou 16K.
  5. Validez la marge sur l’espace special et l’usure des périphériques après un cycle business complet (semaine/mois), pas après une heure de benchmark.
  6. Documentez dans les runbooks : à quoi ça sert, ce qui casse si ça tombe, et comment le remplacer.

Étape par étape : quand le special est trop plein

  1. Arrêtez d’empirer la situation : suspendez les migrations qui créent des millions de petits fichiers ; pensez à limiter les jobs qui causent un fort churn.
  2. Vérifiez la politique : confirmez special_small_blocks sur les datasets.
  3. Ajoutez de la capacité en ajoutant un autre vdev special en miroir (si supporté/approprié pour votre conception).
  4. Migrer les datasets chauds vers un nouveau dataset avec special_small_blocks corrigé, en réécrivant les données pour relocaliser les blocs.
  5. Revisitez la rétention des snapshots qui amplifient le coût en métadonnées.

Trois mini-récits du monde de l’entreprise

Mini-récit 1 : un incident causé par une fausse supposition

C’était une entreprise moyenne avec une ferme NFS backée par ZFS. Les utilisateurs se plaignaient que « le partage est lent », mais l’équipe perf regardait les graphiques de débit : beaucoup de bande passante, pas d’évidence de saturation. L’administrateur stockage a lu sur les vdevs special et a eu une idée : ajouter un SSD entreprise seul comme special « juste pour les métadonnées » et voilà.

C’était rapide immédiatement. Le volume de tickets a chuté. L’équipe a déclaré victoire et est passée à autre chose. Le problème des succès discrets est qu’ils empêchent de voir la trappe.

Des mois plus tard, lors d’une maintenance non liée, ce SSD a disparu de l’énumération PCIe après un reboot. Le pool ne s’importait plus proprement. Le premier réflexe de l’on-call fut de traiter cela comme un problème L2ARC — le retirer et continuer. Mais le special n’est pas jetable, et le pool a été explicite de la manière la moins utile possible : « j’ai besoin de ce que vous avez perdu ».

Ils ont récupéré après une longue nuit impliquant reseating matériel et beaucoup de silence nerveux sur la conférence. Le postmortem ne portait pas sur « SSD défaillant ». Il portait sur la fausse hypothèse : que les vdevs special sont des accessoires de performance. En réalité, ils sont une partie de la colonne vertébrale du pool.

La corrective action fut ennuyeuse : reconstruire le special en miroir, mettre à jour les runbooks, et ajouter la surveillance de présence de périphérique et des compteurs d’erreurs. Le meilleur : cela n’a pas seulement réduit le risque ; la paire miroir a aussi stabilisé la latence sous charge.

Mini-récit 2 : une optimisation qui s’est retournée contre eux

Une autre organisation faisait tourner une passerelle de stockage d’objets sur ZFS. La charge était beaucoup de petits objets — des milliers de clients, beaucoup de créations et suppressions, et des politiques périodiques qui nettoyaient les anciennes données. Ils ont ajouté un vdev special miroir généreusement dimensionné puis ont eu l’idée ambitieuse : définir special_small_blocks=128K globalement « pour tout accélérer ».

Un temps, cela a marché. La latence a baissé partout. Le special semblait occupé mais gérable, et tout le monde savourait la victoire. Le problème était que « petit » à 128K n’est pas petit ; c’est une part significative des données réelles. Au fil du temps, le special est devenu une couche chaude contenant une part non prévue du working set.

Puis le job de lifecycle a frappé. Les suppressions dans ZFS ne sont pas instantanées ; elles créent du travail metadata. Le special s’est rempli jusqu’à la zone dangereuse, la fragmentation a augmenté, et l’allocation a commencé à se comporter différemment. Des pics de latence sont apparus dans l’application. La passerelle a commencé à temporiser des requêtes. L’appel d’incident a été rempli de personnes qui discutaient réseau et TLS alors que le vrai problème était que la couche metadata étouffait en faisant office de couche données.

Ils ont stabilisé la situation en ajoutant un autre vdev special en miroir pour retrouver de la marge, puis ont rétrogradé special_small_blocks à une valeur conservatrice sur les pires datasets. La leçon durable : les vdevs special sont puissants précisément parce qu’ils changent le placement des blocs. Si vous changez le placement sans modèle de dimensionnement, le système acceptera votre optimisme et vous facturera plus tard avec intérêts.

Mini-récit 3 : une pratique ennuyeuse mais correcte qui a sauvé la mise

Les équipes de stockage les plus calmes que j’ai vues ont une habitude : elles répètent les pannes peu glamour. Un shop proche des finances exploitait un pool ZFS avec vdevs special en miroir, SLOG en miroir, et des vdevs data RAIDZ ordinaires. Rien d’exotique. Ce qui les rendait inhabituels était la discipline : scrubs mensuels, drills trimestriels « retirer un disque », et alertes strictes sur la capacité du special et les erreurs de checksum.

Un matin, leur monitoring a signalé une petite mais non nulle augmentation d’erreurs de checksum sur un périphérique special. Personne ne hurlait, et la perf utilisateur semblait fine. L’on-call a ouvert un ticket quand même — parce que le pager disait « la couche metadata tousse », et ils ont écouté.

Ils ont remplacé le périphérique suspect pendant les heures ouvrables sous une fenêtre de changement. Le resilver s’est terminé vite. Ils ont renvoyé le SSD pour analyse et ont continué. Deux semaines plus tard, un autre serveur dans le même rack a subi un événement d’alimentation qui a desserré un connecteur marginal. L’équipe qui avait ignoré les avertissements a passé la journée en théâtre de récupération. L’équipe qui avait remplacé tôt n’a rien eu à faire d’autre que boire un café et regarder les messages défiler.

C’est la partie que personne n’aime entendre : les pratiques ennuyeuses n’empêchent pas seulement les pannes ; elles épargnent le coût émotionnel des pannes. Le meilleur incident est celui qui n’ouvre jamais de conference bridge.

FAQ

1) Ajouter un vdev special accélère-t-il toutes les lectures et écritures ?

Non. Il accélère principalement les opérations de métadonnées et, si configuré, les petits blocs de données. Les gros reads/writes en streaming restent sur les vdevs principaux et suivent leur profil de performance.

2) Un vdev special est-il la même chose qu’un SLOG ?

Non. Le SLOG aide les écritures synchrones en fournissant un fast intent log. Le vdev special stocke de vraies métadonnées (et éventuellement de petits blocs). Ils résolvent des problèmes différents et ont des conséquences de panne différentes.

3) Si le miroir du special perd un disque, suis-je en sécurité ?

Vous êtes en sécurité comme pour tout miroir dégradé : vous êtes sans redondance jusqu’à remplacement et resilver. Traitez un special dégradé comme urgent car il contient des blocs critiques.

4) Puis-je retirer un vdev special plus tard si je change d’avis ?

Pas de façon triviale. Les blocs special sont de vraies allocations ; retirer ou évacuer n’est pas comme supprimer un cache. Dans de nombreux déploiements, « supprimer le special » signifie « migrer vers un nouveau pool ». Planifiez comme si c’était permanent.

5) Quelle valeur de départ raisonnable pour special_small_blocks ?

Pour beaucoup de charges mixtes : commencez metadata-only (0), puis envisagez 8K ou 16K pour des datasets spécifiques avec des petits fichiers connus. Évitez de le rendre global sauf si vous avez modélisé la capacité et l’impact sur le domaine de défaillance.

6) Le special aide-t-il la performance des snapshots ?

Souvent, oui — l’énumération des snapshots, les parcours et les opérations lourdes en métadonnées en bénéficient généralement. Mais si votre vrai problème est « trop de snapshots causant du churn », le special ne vous exonère pas de la discipline de rétention.

7) Comment savoir si le special est mon goulot d’étranglement ?

Regardez zpool iostat -v pour voir si la plupart des opérations touchent le special, puis utilisez iostat -x pour vérifier si les périphériques special sont saturés ou ont un await élevé. Si le special est occupé et que des pics de latence coïncident avec les plaintes utilisateurs, vous avez trouvé le suspect.

8) Puis-je utiliser RAIDZ pour des vdevs special ?

Oui, mais réfléchissez-y. RAIDZ peut augmenter l’amplification d’écriture et la latence pour de petites écritures aléatoires comparé aux miroirs. Le special est une couche sensible à la latence ; les miroirs sont le choix courant pour une raison.

9) Ai-je besoin de NVMe, ou un SSD SATA suffit ?

Un SSD SATA peut largement améliorer les métadonnées comparé au HDD, mais NVMe tend à offrir une meilleure cohérence de latence sous charge parallèle. Choisissez en fonction de votre concurrence et de vos exigences de latence tail, pas seulement du débit moyen.

10) Que se passe-t-il si le special se remplit complètement ?

Le comportement varie selon la version et les besoins d’allocation, mais « special plein » n’est jamais bon. Certaines allocations peuvent déborder vers les vdevs normaux, les performances deviennent imprévisibles, et le risque opérationnel augmente. Considérez une forte utilisation comme un état pré-incident.

Conclusion

Les vdevs special de ZFS sont l’un des moyens les plus efficaces pour donner l’impression qu’un pool est moderne sous des charges riches en métadonnées. Ils peuvent transformer des tempêtes de répertoires en trafic routinier et faire en sorte que l’accès aux petits fichiers cesse de punir vos vdevs HDD. Mais ce n’est pas un cache ni un jouet. Un vdev special est une partie structurelle du pool : il change l’endroit où résident des blocs critiques, ce qui modifie à la fois les performances et le rayon d’impact d’une panne de périphérique.

Si vous ne retenez qu’une leçon opérationnelle : mettez votre vdev special en miroir, surveillez-le comme s’il était critique (parce qu’il l’est), et soyez conservateur avec special_small_blocks jusqu’à ce que vous ayez mesuré et dimensionné. ZFS fera volontiers ce que vous lui demandez. L’astuce est de demander quelque chose que vous pouvez vous permettre de garder en fonctionnement.

← Précédent
ZFS vs mdadm : où mdraid l’emporte et où il échoue
Suivant →
Imprimantes entre bureaux : Résoudre « Je le vois mais ça n’imprime pas » sur VPN

Laisser un commentaire