ZFS Resilver : Pourquoi la reconstruction prend des jours (et comment l’accélérer en toute sécurité)

Cet article vous a aidé ?

L’alerte arrive à 09:12 : « DEGRADED pool. » Vous remplacez le disque, lancez zpool replace et vous vous attendez à quelques heures d’activité.
Puis zpool status vous annonce « resilvering… 3% » et une ETA qui ressemble à un long week-end.

Le temps de resilver n’est pas une faiblesse morale. C’est de la physique, de la profondeur de file d’attente, de la géométrie des vdev et la réalité gênante que les charges de production ne s’arrêtent pas parce que vous le souhaitez.
L’astuce est de savoir quels leviers sont sûrs, lesquels sont du cargo-cult et lesquels échangent vitesse aujourd’hui contre perte de données demain.

Ce que fait réellement le resilver (et pourquoi il semble plus lent qu’il « devrait »)

Dans ZFS, un « resilver » est la reconstruction après qu’un périphérique a été remplacé ou est revenu en ligne. ZFS parcourt les métadonnées du pool pour découvrir quels blocs sont réellement utilisés,
puis régénère les copies/parités manquantes et les écrit sur le nouveau périphérique (ou celui revenu).

Cette partie « parcourir les métadonnées » explique pourquoi le resilver n’est souvent pas une simple copie linéaire des « octets utilisés ». C’est une chaîne de dépendances :
ZFS doit lire les métadonnées pour savoir où se trouvent les blocs de données, puis lire ces blocs, puis écrire les blocs reconstruits, tout en restant cohérent avec les écritures en cours.
Si votre pool est fragmenté, riche en métadonnées ou sous charge, le resilver devient un festival de seek et de queues.

De plus, resilver n’est pas juste un gros flux de lecture et d’écriture. C’est « trouver tous les blocs référencés et réparer le côté manquant », ce qui en RAIDZ impose de lire suffisamment
de colonnes pour reconstruire la parité, et en miroir signifie copier les blocs de l’autre côté. Les miroirs peuvent être rapides si les lectures sont séquentielles. RAIDZ souvent ne le sont pas.

Une réalité opérationnelle supplémentaire : ZFS essaie d’être un bon voisin. Par défaut il ne va pas évincer vos charges de production pour faire le travail à votre place.
Le resilver concurrence tout le reste pour l’I/O, et ZFS laisse intentionnellement de la marge—à moins que vous ne lui disiez le contraire.

Pourquoi un resilver prend des jours : les véritables goulots d’étranglement

1) I/O aléatoire et fragmentation : vos « octets utilisés » ne sont pas contigus

Si votre pool fonctionne depuis des années avec des charges mixtes—images VM, bases de données, petits fichiers, suppressions, snapshots—les blocs se dispersent.
ZFS doit suivre des pointeurs de métadonnées, ce qui se traduit par beaucoup de petites lectures. Les HDD détestent ça. Même les SSD peuvent peiner si vous les saturez par des désaccords de profondeur de file d’attente
ou si vous entraînez une amplification d’écriture.

Le mensonge que l’on se raconte est : « Il n’y a que 12 To utilisés ; ça devrait resilver en 12 To / débit disque. » Cela suppose des lectures/écritures séquentielles, peu de surcharge de métadonnées,
et aucune contention. En réalité, le débit effectif du resilver est souvent limité par les IOPS, pas par les MB/s.

2) Géométrie des vdev : la reconstruction RAIDZ lit plus que vous ne le pensez

Dans un miroir, pour reconstruire un côté manquant vous pouvez en général lire le disque sain et écrire le nouveau disque. En RAIDZ, pour reconstruire un disque manquant,
ZFS lit les colonnes restantes de chaque stripe. C’est plus d’I/O par octet reconstruit, et c’est dispersé sur davantage de plateaux.

Le resilver RAIDZ peut être particulièrement pénible sur des vdev larges avec de gros disques. Le pool est dégradé, donc la redondance est réduite, et les performances chutent exactement quand vous en avez besoin.
Si vous êtes malchanceux, vous servirez aussi des lectures de production avec moins de colonnes disponibles. C’est comme reconstruire un pont pendant l’heure de pointe.

3) « Allocation pendant le resilver » : les blocs bougent sous vos pieds

ZFS est copy-on-write. Les nouvelles écritures vont vers de nouveaux emplacements, les anciens blocs restent référencés jusqu’à ce qu’ils soient libérés. Pendant le resilver, les écritures actives peuvent changer ce qui doit être copié :
mises à jour de métadonnées, blocs indirects, nouveaux pointeurs de blocs. ZFS gère cela, mais cela signifie que l’opération est moins « passe unique » que ce que l’on suppose.

4) Remplissage du pool : au-delà d’environ 80% ça devient vite moche

Les pools pleins se fragmentent davantage, allouent en morceaux plus petits, et forcent ZFS à travailler plus dur pour trouver de l’espace. Le resilver devient plus aléatoire, et la surcharge augmente.
Si vous avez aussi beaucoup de snapshots, l’espace libéré n’est pas vraiment libre tant que les snapshots n’expirent pas, donc « df indique 20% libres » peut être une fiction.

5) Recordsize, volblocksize et charges à petits blocs

Le resilver doit gérer vos tailles de blocs telles qu’elles existent sur disque. Un zvol VM avec volblocksize 8K ou un dataset base de données avec recordsize 16K
se traduit par beaucoup plus de blocs à parcourir qu’un dataset rempli de records de 1M.

Plus de blocs signifie plus de métadonnées, plus de checksums, plus d’opérations I/O, et moins de chance d’avoir de jolis motifs séquentiels. Vous ne remarquez pas cela au quotidien
jusqu’au moment de la reconstruction.

6) Compression et dedup : super jusqu’à la reconstruction

La compression aide généralement le resilver parce que moins d’octets doivent être lus et écrits—si le CPU n’est pas le goulot.
La dédup est l’inverse : elle ajoute des recherches de métadonnées et rend souvent tout plus aléatoire.

Si vous avez activé dedup parce que vous avez vu un jour une slide sur « efficacité de stockage », vous vous êtes construit une taxe de resilver. Elle se cumule sous pression.

7) Checksumming, chiffrement et goulots CPU

ZFS vérifie les checksums lors des lectures. Si vous utilisez le chiffrement natif, il déchiffre aussi. Sur des CPU anciens ou des machines sollicitées, le resilver peut devenir lié au CPU,
surtout quand le pattern I/O comporte beaucoup de petits blocs (plus d’opérations de checksum par octet).

8) « Priorité du resilver » est un compromis, pas un miracle gratuit

Vous pouvez souvent accélérer le resilver en lui laissant consommer plus d’I/O. Cela accélère la récupération mais peut écraser la latence de vos applications.
L’accélération sûre est celle qui maintient vos SLO.

9) Disques de remplacement lents ou mal assortis

Si le nouveau disque est SMR, a une GC interne agressive, est connecté via un HBA médiocre, ou est simplement plus lent que l’ancien,
le temps de resilver peut exploser. « Même capacité » n’est pas « même comportement ».

Blague #1 : Le resilver, c’est l’équivalent stockage de repeindre sa maison en y habitant toujours — tout est techniquement possible, juste peu agréable.

Faits intéressants & historique (parce que le passé explique la douleur)

  • ZFS a commencé chez Sun Microsystems au milieu des années 2000 en réaction aux systèmes de fichiers qui traitaient « gestion de volume » et « système de fichiers » séparément.
  • Copy-on-write était un pari délibéré : il a rendu les snapshots peu coûteux et la cohérence forte, mais il a aussi rendu les schémas d’allocation plus complexes avec le temps.
  • Resilver n’est pas un scrub : scrub valide l’intégralité du pool ; resilver reconstruit la redondance après perte d’un périphérique. Ils partagent des chemins de code mais ont des intentions différentes.
  • L’espace « slop » existe pour une raison : ZFS garde un peu d’espace non allouable pour éviter la fragmentation catastrophique et les échecs d’allocation sur des pools presque pleins.
  • L’expansion RAIDZ était historiquement limitée (étendre un vdev RAIDZ en ajoutant des disques) ce qui a poussé beaucoup d’équipes vers des vdev larges dès le départ — parfait au jour 1, stressant au jour 900.
  • Les disques SMR ont changé la donne : ils peuvent paraître corrects en benchmarks et s’effondrer ensuite sous des écritures aléatoires soutenues comme le trafic de resilver.
  • OpenZFS est devenu le centre de gravité après Sun, avec plusieurs plateformes (illumos, FreeBSD, Linux) portant la torche et divergeant sur des paramètres réglables.
  • Des améliorations pour un resilver séquentiel ont été ajoutées au fil du temps pour accélérer certains motifs, mais elles ne peuvent pas undo la fragmentation ni corriger « pool à 92% plein » comme choix de vie.

Playbook de diagnostic rapide : trouver le goulot en 10 minutes

Quand le resilver est lent, ne devinez pas. Prenez trois mesures : ce que ZFS pense faire, ce que font les disques, et ce que font le CPU et la mémoire.
Puis décidez d’accélérer le resilver ou de réduire la charge de production—ou les deux.

First: confirm the rebuild is real and see the shape of it

  • Vérifiez zpool status pour le taux de scan, les erreurs, et si c’est un resilver ou un scrub.
  • Confirmez quel vdev est affecté et si vous êtes en RAIDZ ou miroir.
  • Cherchez des progrès du type « resilvered X in Y » ; si ça bouge à peine, vous êtes probablement lié par les IOPS ou bloqué par des erreurs/retries.

Second: identify the limiting resource (IOPS, bandwidth, CPU, or contention)

  • Disque occupé mais faible débit : I/O aléatoire / mise en file / SMR / retries.
  • CPU élevé dans les threads kernel/ZFS : checksum/chiffrement/workload riche en métadonnées.
  • Pics de latence dans les applis : resilver qui concurrence l’I/O de production ; ajustez les priorités ou planifiez une réduction de charge.

Third: decide on the safe intervention

  • Si la production est calme, augmentez l’agressivité du resilver légèrement et surveillez la latence.
  • Si la production en souffre, réduisez l’impact du resilver et acceptez une reconstruction plus longue—sauf si le risque dicte le contraire.
  • Si un périphérique génère des erreurs, arrêtez de « tuner » et commencez le diagnostic matériel/câblage.

Tâches pratiques : commandes, sorties et décisions (12+)

Voici les contrôles que j’exécute réellement. Chacun inclut ce que signifie la sortie et la décision qui en découle.
Les commandes sont montrées comme si vous êtes sur une machine Linux avec OpenZFS ; adaptez les chemins si vous êtes sur illumos/FreeBSD.

Task 1: Confirm scan state, speed, and whether you’re resilvering or scrubbing

cr0x@server:~$ zpool status -v tank
  pool: tank
 state: DEGRADED
status: One or more devices is being resilvered.
action: Wait for the resilver to complete.
  scan: resilver in progress since Mon Dec 23 09:12:11 2025
        1.87T scanned at 58.3M/s, 612G issued at 19.1M/s, 22.4T total
        102G resilvered, 2.91% done, 5 days 03:18:22 to go
config:

        NAME                        STATE     READ WRITE CKSUM
        tank                        DEGRADED     0     0     0
          raidz2-0                  DEGRADED     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
            sdg                     ONLINE       0     0     0
            sdh                     ONLINE       0     0     0
            sdi                     ONLINE       0     0     0
            sdj                     ONLINE       0     0     0
            sdk                     ONLINE       0     0     0
            sdl                     ONLINE       0     0     0
            sdm                     ONLINE       0     0     0
            sdn                     ONLINE       0     0     0
            sdo                     ONLINE       0     0     0
            sdp                     ONLINE       0     0     0
            sdq                     ONLINE       0     0     0
            sdr                     ONLINE       0     0     0
            sds                     ONLINE       0     0     0
            sdt                     ONLINE       0     0     0
            sdu                     ONLINE       0     0     0
            sdv                     ONLINE       0     0     0
            sdx                     ONLINE       0     0     0
            sdy                     ONLINE       0     0     0
            sdz                     ONLINE       0     0     0
            sdaa                    ONLINE       0     0     0
            sdab                    ONLINE       0     0     0
            sdac                    ONLINE       0     0     0
            sdad                    ONLINE       0     0     0
            sdae                    ONLINE       0     0     0
            sdaf                    ONLINE       0     0     0
            sdag                    ONLINE       0     0     0
            sdah                    ONLINE       0     0     0
            sdai                    ONLINE       0     0     0
            sdaj                    ONLINE       0     0     0
            sdak                    ONLINE       0     0     0
            sdal                    ONLINE       0     0     0
            sdam                    ONLINE       0     0     0
            sdan                    ONLINE       0     0     0
            sdao                    ONLINE       0     0     0
            sdap                    ONLINE       0     0     0
            sdaq                    ONLINE       0     0     0
            sdar                    ONLINE       0     0     0
            sdas                    ONLINE       0     0     0
            sdat                    ONLINE       0     0     0
            sdau                    ONLINE       0     0     0
            sdav                    ONLINE       0     0     0
            sdaw                    ONLINE       0     0     0
            sdax                    ONLINE       0     0     0
            sday                    ONLINE       0     0     0
            sdaz                    ONLINE       0     0     0
            sdba                    ONLINE       0     0     0
            sdbb                    ONLINE       0     0     0
            sdbc                    ONLINE       0     0     0
            sdbd                    ONLINE       0     0     0
            sdbe                    ONLINE       0     0     0
            sdbf                    ONLINE       0     0     0
            sdbg                    ONLINE       0     0     0
            sdbh                    ONLINE       0     0     0
            sdbi                    ONLINE       0     0     0
            sdbj                    ONLINE       0     0     0
            sdbk                    ONLINE       0     0     0
            sdbl                    ONLINE       0     0     0
            sdbm                    ONLINE       0     0     0
            sdbn                    ONLINE       0     0     0
            sdbo                    ONLINE       0     0     0
            sdbp                    ONLINE       0     0     0
            sdbq                    ONLINE       0     0     0
            sdbr                    ONLINE       0     0     0
            sdbs                    ONLINE       0     0     0
            sdbt                    ONLINE       0     0     0
            sdbu                    ONLINE       0     0     0
            sdbv                    ONLINE       0     0     0
            sdbw                    ONLINE       0     0     0
            sdbx                    ONLINE       0     0     0
            sdby                    ONLINE       0     0     0
            sdbz                    ONLINE       0     0     0
            sdcA                    ONLINE       0     0     0
            sdcB                    ONLINE       0     0     0
            sdcC                    ONLINE       0     0     0
            sdcD                    ONLINE       0     0     0
            sdcE                    ONLINE       0     0     0
            sdcF                    ONLINE       0     0     0
            sdcG                    ONLINE       0     0     0
            sdcH                    ONLINE       0     0     0
            sdcI                    ONLINE       0     0     0
            sdcJ                    ONLINE       0     0     0
            sdcK                    ONLINE       0     0     0
            sdcL                    ONLINE       0     0     0
            sdcM                    ONLINE       0     0     0
            sdcN                    ONLINE       0     0     0
            sdcO                    ONLINE       0     0     0
            sdcP                    ONLINE       0     0     0
            sdcQ                    ONLINE       0     0     0
            sdcR                    ONLINE       0     0     0
            sdcS                    ONLINE       0     0     0
            sdcT                    ONLINE       0     0     0
            sdcU                    ONLINE       0     0     0
            sdcV                    ONLINE       0     0     0
            sdcW                    ONLINE       0     0     0
            sdcX                    ONLINE       0     0     0
            sdcY                    ONLINE       0     0     0
            sdcZ                    ONLINE       0     0     0
            sdd0                    ONLINE       0     0     0
errors: No known data errors

Ce que cela signifie : « scanned » vs « issued » vous indique le parcours des métadonnées vs l’I/O de reconstruction réelle.
Si « issued » est bien inférieur à « scanned », vous passez du temps à parcourir les métadonnées et/ou vous êtes bridés par les IOPS.

Décision : Si l’ETA est en jours et que votre pool est grand, ne paniquez pas encore. Passez aux vérifications de goulot ci-dessous avant de toucher aux réglages.

Task 2: Check pool health and error trends (don’t tune around dying hardware)

cr0x@server:~$ zpool status -x
pool 'tank' is degraded

Ce que cela signifie : Le pool n’est pas sain ; le resilver est attendu. Si vous voyez des erreurs supplémentaires (READ/WRITE/CKSUM), c’est plus urgent.

Décision : Si les erreurs augmentent pendant le resilver, arrêtez le « travail de performance » et commencez le « triage matériel ».

Task 3: Confirm which disk is new and whether it negotiated correctly (link speed, size)

cr0x@server:~$ lsblk -o NAME,SIZE,MODEL,SERIAL,ROTA,TYPE /dev/sdx
NAME   SIZE MODEL         SERIAL       ROTA TYPE
sdx   14.6T ST16000NM000J ZR12ABCDEF      1 disk

Ce que cela signifie : Vous voulez que le remplacement corresponde à la capacité attendue et soit un modèle CMR entreprise, pas un disque desktop SMR surprise.

Décision : Si model/serial semble incorrect, arrêtez et validez l’achat. Le « correctif » le moins coûteux est de retourner le mauvais disque avant qu’il ne vous fasse perdre la semaine.

Task 4: Spot SMR behavior or deep write stalls using iostat

cr0x@server:~$ iostat -x 2 5 /dev/sdx
Linux 6.6.0 (server)  12/25/2025  _x86_64_  (32 CPU)

Device            r/s     w/s   rMB/s   wMB/s  avgrq-sz avgqu-sz   await  r_await  w_await  svctm  %util
sdx              12.0   180.0     1.1     9.4     116.0     27.8   145.2     8.1   154.8   2.9  56.8
sdx              11.5   190.5     1.0     2.2      36.2     64.1   336.7     9.2   356.8   2.7  52.4

Ce que cela signifie : L’augmentation de await avec effondrement de wMB/s est un comportement classique de « disque qui plante ».
Pas toujours SMR, mais souvent « le firmware du disque réorganise les écritures » ou vous avez un problème de transport/HBA.

Décision : Si le périphérique de remplacement a un await pathologique, déplacez-le vers une autre baie/câble/port HBA ou remplacez le modèle de disque.

Task 5: See if resilver is IOPS-bound across the vdev

cr0x@server:~$ iostat -x 2 3
Device            r/s     w/s   rMB/s   wMB/s  avgqu-sz   await  %util
sda              85.0    22.0     5.1     1.2      9.2   86.4   92.0
sdb              82.0    25.0     4.9     1.4      8.7   84.9   90.1
sdc              83.0    23.0     5.0     1.3      9.1   85.7   91.5

Ce que cela signifie : Un %util élevé avec peu de MB/s signifie que vous ne streamez pas ; vous cherchez. C’est pourquoi le calcul « disque 14 To à 250 MB/s » échoue.

Décision : Ne montez pas les boutons « vitesse resilver » en vous attendant à des miracles. Vous devez réduire la pression I/O aléatoire (mettre les charges en pause, réduire le churn de snapshots),
ou accepter le calendrier.

Task 6: Check ARC pressure and whether the box is thrashing

cr0x@server:~$ arcstat 2 5
    time  read  miss  miss%  dmis  dm%  pmis  pm%  mmis  mm%  arcsz     c
09:23:01   914   202     22    46   23   156   77     0    0   96G   112G
09:23:03   901   229     25    51   22   178   78     0    0   96G   112G
09:23:05   938   301     32    90   29   211   70     0    0   96G   112G

Ce que cela signifie : L’augmentation des misses pendant le resilver peut vouloir dire que les métadonnées ne tiennent pas bien, ou que la production + resilver dépasse l’utilité du cache.

Décision : Si l’ARC est contraint et que vous swappez, arrêtez : la pression mémoire va détruire le resilver et tout le reste. Ajoutez de la RAM ou réduisez la charge.

Task 7: Confirm you are not swapping (swapping turns rebuild into a slow-motion disaster)

cr0x@server:~$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  0      0  82432  12644 9812448   0    0  4920  1280 4200 6100 18 12 58 12  0
 2  0      0  80120  12644 9812016   0    0  5100  1320 4302 6230 17 11 57 15  0

Ce que cela signifie : si/so devraient être zéro. Si vous swappez, les parcours de métadonnées ZFS et le travail de checksum vont se traîner.

Décision : Si swap présent, réduisez la cap d’ARC, arrêtez les gourmands en mémoire, ou déplacez les charges. Ne dites pas « laissez finir ».

Task 8: Check whether a scrub is running concurrently (and stop it if it’s not policy-critical)

cr0x@server:~$ zpool status tank | sed -n '1,20p'
  pool: tank
 state: DEGRADED
  scan: scrub in progress since Mon Dec 23 08:55:02 2025
        3.11T scanned at 72.5M/s, 901G issued at 21.0M/s, 22.4T total
        0B repaired, 4.03% done, 2 days 22:10:05 to go

Ce que cela signifie : Un scrub en concurrence avec un resilver est généralement de l’autosabotage sauf raison spécifique.

Décision : Si le pool est déjà dégradé et que vous essayez de restaurer la redondance, priorisez le resilver et mettez le scrub en pause.

cr0x@server:~$ sudo zpool scrub -s tank
scrub stopped

Task 9: Verify autotrim and ashift assumptions (performance cliffs hide here)

cr0x@server:~$ zdb -C tank | egrep -i 'ashift|autotrim'
        ashift: 12
        autotrim: off

Ce que cela signifie : ashift définit l’alignement secteur. Un ashift incorrect peut réduire irrémédiablement les performances d’écriture.
autotrim importe surtout pour les pools SSD.

Décision : Vous ne pouvez pas changer ashift en place. S’il est mauvais, planifiez une migration. Ne prétendez pas qu’un réglage corrigera la géométrie.

Task 10: Check dataset-level properties that amplify resilver work

cr0x@server:~$ zfs get -o name,property,value -s local recordsize,compression,dedup,atime tank/vmstore
NAME          PROPERTY     VALUE
tank/vmstore  recordsize   128K
tank/vmstore  compression  lz4
tank/vmstore  dedup        off
tank/vmstore  atime        off

Ce que cela signifie : recordsize petit, dedup=on, et atime=on (pour datasets très actifs) peuvent augmenter le churn de métadonnées et le travail de reconstruction.

Décision : Ne changez pas ces paramètres en plein resilver comme « astuce de vitesse ». Servez-vous en pour concevoir à l’avenir et pour cibler les charges à limiter.

Task 11: Identify whether special vdev or metadata devices are the bottleneck

cr0x@server:~$ zpool status tank | sed -n '1,120p'
  pool: tank
 state: DEGRADED
  scan: resilver in progress since Mon Dec 23 09:12:11 2025
config:

        NAME                       STATE     READ WRITE CKSUM
        tank                       DEGRADED     0     0     0
          raidz2-0                 DEGRADED     0     0     0
            sda                    ONLINE       0     0     0
            ...
        special
          mirror-1                 ONLINE       0     0     0
            nvme0n1                ONLINE       0     0     0
            nvme1n1                ONLINE       0     0     0

Ce que cela signifie : Si vous avez un special vdev (métadonnées/petits blocs), ses performances peuvent dominer la vitesse du resilver parce que le resilver est riche en métadonnées.

Décision : Surveillez la latence et la santé des NVMe ; un vdev de données « correct » peut toujours resilver lentement si les dispositifs de métadonnées sont saturés ou dégradés.

Task 12: Check for I/O errors and retries in kernel logs (silent killer)

cr0x@server:~$ sudo dmesg -T | egrep -i 'ata[0-9]|scsi|reset|I/O error|blk_update_request' | tail -n 12
[Tue Dec 23 10:02:14 2025] sd 3:0:8:0: [sdx] tag#83 I/O error, dev sdx, sector 1883742336 op 0x1:(WRITE) flags 0x0 phys_seg 16 prio class 0
[Tue Dec 23 10:02:15 2025] ata9: hard resetting link
[Tue Dec 23 10:02:20 2025] ata9: SATA link up 1.5 Gbps (SStatus 113 SControl 310)

Ce que cela signifie : Les reset de lien et la négociation à vitesse dégradée (1.5 Gbps) vont étirer le resilver jusqu’à des temps géologiques.

Décision : Réparez le câblage/backplane/HBA. Ne réglez pas ZFS pour compenser un transport instable.

Task 13: See if ZFS is throttling resilver due to tunables (and adjust carefully)

cr0x@server:~$ sudo sysctl -a 2>/dev/null | egrep 'zfs_vdev_resilver|zfs_resilver|scan_idle'
debug.zfs_scan_idle=50
debug.zfs_vdev_resilver_max_active=2
debug.zfs_vdev_resilver_min_active=1

Ce que cela signifie : Ces boutons influencent à quel point ZFS envoie des I/O pour le resilver et combien il idle pour favoriser la production.
Les noms varient selon plateforme/distribution ; ne copiez-collez pas des valeurs de blog sans réfléchir.

Décision : Si vous avez de la marge I/O et une latence acceptable, augmentez max_active modestement. Si la latence est déjà mauvaise, ne le faites pas.

Task 14: Verify the pool isn’t dangerously full (full pools rebuild slowly and fail creatively)

cr0x@server:~$ zfs list -o name,used,avail,refer,mountpoint -p tank | head
NAME         USED        AVAIL       REFER       MOUNTPOINT
tank   19854735163392  2533274798080  1048576    /tank

Ce que cela signifie : Environ 19.8 To utilisés, 2.5 To disponibles. Sur un pool ~22 To, c’est flirt avec la zone dangereuse.

Décision : Si vous êtes au-dessus d’environ 80–85% et que le resilver est lent, priorisez la libération d’espace (supprimez vieux snapshots, déplacez les données froides) avant de tuner pour la vitesse.

Façons sûres d’accélérer le resilver (ce qui marche, ce qui ne marche pas)

L’objectif n’est pas « rendre le resilver rapide ». L’objectif est « restaurer la redondance rapidement sans écraser la production ou corrompre les données ».
Ce ne sont pas la même chose. Vous pouvez toujours rendre les choses rapides en les faisant mal.

1) Réduire l’I/O concurrente (le mouvement peu sexy mais le plus efficace)

Si le resilver est lié aux IOPS, la meilleure action est d’arrêter de générer de l’I/O aléatoire. Cela signifie généralement :

  • Mettre en pause les jobs batch : sauvegardes, réindexation de logs, analytics, gros rsync.
  • Limiter ou migrer les locataires bruyants (les clusters de VM sont célèbres pour ça).
  • Différer la suppression de snapshots qui déclenche beaucoup de frees/rewrites (dépend de l’implémentation et de la charge).

C’est souvent politiquement difficile. Ça ne devrait pas l’être. Un pool dégradé est un événement de risque. Traitez-le comme tel.

2) Augmenter l’agressivité du resilver—prudemment, avec un plan de rollback

Les réglages ZFS qui contrôlent la concurrence du scan/resilver peuvent augmenter le débit. Ils peuvent aussi augmenter la latence et déclencher des timeouts dans des applis sensibles.
Ajustez par petites étapes, mesurez, et revenez en arrière si la douleur dépasse le gain.

cr0x@server:~$ sudo sysctl -w debug.zfs_scan_idle=0
debug.zfs_scan_idle = 0

Ce que cela signifie : Réduire le temps idle veut dire que le travail de scan cède moins la place à l’I/O normale. Le resilver obtient plus de tours.

Décision : Utilisez ceci seulement si vous pouvez tolérer une latence plus élevée, et surveillez immédiatement les SLO applicatifs. Si la latence explose, remettez à la valeur précédente.

cr0x@server:~$ sudo sysctl -w debug.zfs_vdev_resilver_max_active=4
debug.zfs_vdev_resilver_max_active = 4

Ce que cela signifie : Plus d’opérations I/O concurrentes par vdev. Bon pour des systèmes sous-utilisés, mauvais pour des plateaux déjà saturés.

Décision : Si les disques montrent faible %util et faible profondeur de file d’attente, cela peut aider. Si les disques sont déjà au taquet, cela n’augmentera que la latence.

3) Mettre le disque de remplacement sur le meilleur chemin (HBA, firmware, câblage)

La vérité ennuyeuse : la vitesse du resilver est souvent limitée par un seul lien qui se comporte mal. Un disque sur SATA à 1.5 Gbps, ou un port HBA qui vacille,
peut tirer un resilver RAIDZ vers le bas parce que la reconstruction de parité attend les retardataires.

Réparez la couche physique. Puis tunez.

4) Préférer les miroirs quand le temps de rebuild compte plus que la capacité

Si vous concevez des systèmes où le temps de rebuild en cas de panne est un risque majeur, les miroirs sont vos amis. Ils resilvent en copianto les blocs alloués du côté sain.
Dans de nombreuses déploiements réels, les miroirs offrent aussi des performances plus prévisibles en cas de défaillance partielle.

RAIDZ est correct—parfois excellent—mais ne prétendez pas que c’est « pareil et moins cher ». Pendant le resilver, c’est une bête différente.

5) Garder les pools moins pleins (votre futur vous remerciera)

La façon la plus simple d’accélérer un resilver est d’éviter la fragmentation pathologique. Le prédicteur le plus fiable de la fragmentation dans l’univers ZFS est :
combien près du remplissage vous maintenez le pool.

Mettez des quotas. Faites-les respecter. Ayez un plan de capacité. « On nettoiera après » est la façon d’obtenir des resilvers de 5 jours et des réunions à 2h du matin.

6) Utiliser des tailles de blocs sensées pour la charge (avant l’incident, pas pendant)

Pour les stockages VM, choisissez volblocksize avec intention. Pour les datasets, choisissez recordsize aligné sur la charge. Il ne s’agit pas d’optimiser des benchmarks ;
il s’agit de réduire le nombre de métadonnées et de blocs pour que le travail de reconstruction évolue de façon raisonnable.

7) Ne pas « optimiser » en désactivant les checksums ou en faisant confiance au hasard

Les checksums ne sont pas des ceintures de sécurité optionnelles. Le resilver est précisément le moment où vous voulez l’intégrité bout en bout.
ZFS ne vous donne pas de voie supportée et sensée pour « sauter la vérification pour la vitesse », et c’est une fonctionnalité, pas une limitation.

Blague #2 : Tourner des boutons pendant un resilver sans mesurer, c’est comme ajouter plus de café pour réparer une imprimante en panne—satisfaisant émotionnellement, techniquement sans rapport.

Une citation à garder sur votre pont d’incident

« L’espoir n’est pas une stratégie. » — idée paraphrasée souvent citée en ingénierie et opérations

La version opérationnelle : mesurez d’abord, changez une chose, mesurez encore. Tout le reste est de la performance cosplay.

Trois mini-récits d’entreprise depuis le terrain

Mini-récit 1 : L’incident causé par une mauvaise hypothèse

Une entreprise SaaS de taille moyenne faisait tourner un cluster VM sur ZFS sur un vdev RAIDZ2 large. Ça fonctionnait « bien » depuis des années. Un disque a lâché un mardi.
L’on-call l’a remplacé rapidement et a lancé le replace. Tout le monde s’est détendu.

L’hypothèse : « Le resilver ne copie que les données utilisées, donc ce sera plus rapide qu’une reconstruction complète. » Le pool était à environ 60% d’utilisation.
Ils ont fait le calcul classique sur un coin de serviette en utilisant le débit séquentiel et ont décidé que le resilver finirait pendant la nuit.

La nuit est passée et le progrès est resté bloqué à un pourcentage à un chiffre. La latence pour les VMs clients a grimpé par intermittence, et l’infrastructure hyperviseur a commencé à journaliser des timeouts d’I/O invités.
L’équipe a réagi en ajoutant plus de charge—spécifiquement en migrant des VMs pour « équilibrer ». Ces migrations étaient des lectures/écritures aléatoires. Elles ont mis de l’huile sur le feu.

Le vrai problème : le pool était vieux, chargé de snapshots et fortement fragmenté. Le resilver était limité par les IOPS, pas par la bande passante. Chaque mitigation « bouger vite » a empiré le pattern I/O.
Après 36 heures, un second disque a signalé des erreurs. Ce n’était plus un rebuild lent ; c’était un incident à risque de données.

Ils ont récupéré, mais la leçon est restée : le temps de resilver n’est pas une fonction du seul « To utilisés ». C’est une fonction de l’historique d’allocation, de la forme des workloads et de la contention.
Le postmortem a produit des actions simples et inconfortables : faire respecter de la marge de capacité, limiter le nombre de snapshots, et arrêter de construire des vdev larges pour des clusters VM sensibles à la latence.

Mini-récit 2 : L’optimisation qui a mal tourné

Un autre service a décidé que les resilvers prenaient trop de temps. Quelqu’un a trouvé des réglages en ligne et a configuré la concurrence scan/resilver agressivement sur toute la flotte.
En staging calme, c’était superbe : les rebuilds étaient plus rapides. Tout le monde s’est félicité. Le changement est passé en production.

Puis une vraie panne est arrivée en heures de pointe. Un disque est tombé. Le resilver a monté en puissance comme un réacteur : beaucoup d’I/O concurrente, minimal d’idle.
La vitesse de reconstruction s’est améliorée, certes. Pendant ce temps, la latence de la base de données est passée de « correcte » à « pourquoi tout timeoute ? ».

Le pire n’était pas la latence. C’étaient les retries. Les applis ont commencé à retenter les requêtes échouées, ce qui a augmenté la charge, augmenté l’I/O, augmenté la latence.
Le système est entré dans une spirale connue : plus il luttait, plus il s’échinait.

L’équipe a rollbacké les réglages en plein incident. Le rebuild a ralenti, mais la plateforme s’est stabilisée.
Conclusion du postmortem : « resilver plus rapide » n’est pas un défaut global. C’est un interrupteur en mode incident, lié aux heures business et aux SLO, avec monitoring et rollback explicites.

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

Une société de services financiers (oui, le genre qui aime le changement contrôlé) utilisait des vdev mirorés pour datasets critiques et RAIDZ pour les couches plus froides.
Ils appliquaient aussi une politique simple : les pools restent sous un seuil de remplissage défini, et la rétention des snapshots est plafonnée avec élagage régulier.

Un disque est tombé pendant la clôture trimestrielle. Bien sûr. L’on-call l’a remplacé, et le resilver a commencé. Ils n’ont pas touché aux réglages au départ.
Au lieu de ça, ils ont exécuté le runbook : mettre en pause les jobs batch non essentiels, vérifier qu’aucun scrub ne tourne, contrôler la vitesse de lien, consulter dmesg pour des resets, et surveiller les tableaux de latence.

Le resilver s’est terminé dans une fenêtre prévisible. Pas de drame. Pas de seconde défaillance. Pas de tuning héroïque.
La partie préférée de l’équipe : combien peu ils ont eu à expliquer à la direction—parce que rien de visible pour les clients ne s’est produit.

Le travail « ennuyeux » avait été fait des mois plus tôt : marge, design de vdev sensé et discipline opérationnelle.
C’est le type d’histoire de fiabilité que personne ne raconte aux conférences parce que ça ne se met pas sur un t-shirt. C’est pourtant celle que vous voulez.

Erreurs communes : symptôme → cause racine → fix

1) Symptom: Resilver rate starts decent, then collapses

Cause racine : Internal write stall du disque de remplacement (souvent SMR ou GC firmware), ou négociation de lien retombée, ou hit de régions plus fragmentées.

Fix : Vérifiez iostat -x pour l’augmentation de await et l’effondrement du MB/s ; vérifiez dmesg pour resets/vitesse de lien. Changez de port/câble/HBA ou remplacez le disque.

2) Symptom: “Scanned” grows fast, “issued” is tiny

Cause racine : Parcours riche en métadonnées avec faible reconstruction effective, souvent dû à la fragmentation et à de nombreux snapshots ; parfois dû aux réglages de throttling.

Fix : Réduisez le churn de métadonnées concurrent (pause des snapshot, activité lourde du filesystem). Envisagez temporairement de diminuer scan idle si le budget de latence le permet.

3) Symptom: Apps time out during resilver even though throughput isn’t high

Cause racine : Pic de latence de queue due à la contention I/O aléatoire ; quelques files saturées alors que le débit moyen semble modeste.

Fix : Surveillez await, profondeur de file et latence p99 applicative. Réduisez la charge, ou augmentez l’idle du resilver pour donner la priorité à la production.

4) Symptom: Resilver never finishes; progress inches and then “restarts”

Cause racine : Périphérique qui vacille, déconnexions transitoires, ou erreurs répétées forçant des retries ; parfois un backplane marginal.

Fix : Vérifiez les compteurs d’erreurs dans zpool status ; inspectez dmesg. Réparez le matériel. Aucun réglage ne compense un câble qui vous déteste.

5) Symptom: CPU pegged during resilver on an “I/O system”

Cause racine : Travail de checksum/chiffrement sur beaucoup de petits blocs, plus surcharge métadonnée. Peut être amplifié par dedup.

Fix : Confirmez avec top/vmstat et stats ARC ; réduisez le churn petits-blocs (pause migrations VM), et planifiez des upgrades CPU pour les pools chiffrés.

6) Symptom: Resilver is slow only on one pool, not others on the same hardware

Cause racine : Remplissage du pool, fragmentation, choix de taille de bloc dataset, nombre de snapshots, ou différences de largeur de vdev.

Fix : Comparez l’utilisation zfs list, le nombre de snapshots et les propriétés des datasets. Le matériel n’est pas « lent » ; votre historique d’allocation l’est.

7) Symptom: Rebuild speed improved after “tuning,” then pool gets weird later

Cause racine : Changements persistants de sysctl/réglages appliqués globalement sans garde-fous ; augmentation de pression I/O provoquant timeouts et défaillances secondaires.

Fix : Rendez les réglages limités à l’incident avec rollback explicite. Capturez les valeurs de base et remettez-les après que le pool soit sain.

Checklists / step-by-step plan

Step-by-step: when a disk fails and resilver begins

  1. Confirmer l’état : zpool status. Assurez-vous que c’est un resilver, pas un scrub, et identifiez le vdev affecté.
  2. Arrêter la maintenance concurrente : Si un scrub tourne, arrêtez-le sauf si la politique l’exige maintenant.
  3. Sanité matérielle : Confirmez le modèle du disque de remplacement (CMR vs SMR), la vitesse de lien, et l’absence de resets dans dmesg.
  4. Mesurer la contention : iostat -x et tableaux de latence applicative. Décidez si vous avez la marge pour pousser le resilver plus fort.
  5. Vérifier la pression mémoire : vmstat et stats ARC. Assurez-vous qu’il n’y a pas de swap.
  6. Décider la priorité : Si le risque est élevé (second disque instable, données critiques), priorisez le resilver. Si les heures business sont critiques, privilégiez les SLO.
  7. Appliquer les réglages prudemment (optionnel) : Augmentez l’agressivité du resilver par petites augmentations, en surveillant p95/p99.
  8. Communiquer : Fixez les attentes. « Dégradé jusqu’à X » est une déclaration de risque business, pas une curiosité stockage.
  9. Après achèvement : Vérifiez que le pool est sain, puis remettez les réglages temporaires. Planifiez un scrub après restauration de la redondance.

Checklist: safe speedups you can justify in a postmortem

  • Mettre en pause les I/O batch non essentielles et les jobs générant beaucoup de snapshots.
  • Arrêter les scrubs concurrents pendant le resilver (sauf contraintes de conformité).
  • Réparer les problèmes de transport (resets de lien, vitesses SATA réduites) avant de tuner.
  • Augmenter la concurrence du resilver modestement seulement si les disques ont de la marge et que la latence applicative est stable.
  • Réduire temporairement le scan idling uniquement pendant une fenêtre d’incident contrôlée.
  • Préférer les miroirs pour les couches où le risque de rebuild prime sur l’efficacité de capacité.
  • Maintenir une marge de capacité comme politique, pas une suggestion.

Checklist: things you should not do during a resilver

  • Ne pas activer dedup « pour économiser de l’espace » en plein incident.
  • Ne lancez pas de grosses migrations, rebalancements ou réécritures massives à moins d’accepter un risque plus grand.
  • Ne montez pas continuellement les réglages quand la latence est déjà mauvaise ; vous ne ferez qu’amplifier la défaillance.
  • N’ignorez pas les logs kernel. Si vous voyez des resets ou des I/O errors, vous êtes en territoire matériel maintenant.

FAQ

1) Is resilver supposed to be faster than scrub?

Souvent, oui—parce que le resilver touche seulement les blocs alloués qui nécessitent reconstruction. Mais la fragmentation et le parcours des métadonnées peuvent effacer cet avantage.
Si le pool est ancien et riche en I/O aléatoire, le resilver peut ressembler à un scrub avec des étapes supplémentaires.

2) Why does “scanned” not match “resilvered”?

« Scanned » reflète combien le processus de scan a parcouru les pointeurs de blocs et les métadonnées du pool.
« Resilvered » est la donnée réellement reconstruite écrite sur le remplacement. Beaucoup de scan avec peu de resilvered signifie typiquement du travail métadonnées ou du throttling/IOPS limitant.

3) Does ZFS resilver copy only used space?

ZFS vise à resilver uniquement les blocs alloués (référencés), pas tout le périphérique brut. Voilà pourquoi l’espace libre ne coûte pas toujours du temps.
Mais les « blocs alloués » peuvent encore être dispersés en millions de petites étendues, ce qui rend l’opération lente.

4) Can I pause and resume a resilver?

Selon la plateforme et la version, vous pouvez parfois arrêter un scan et le reprendre plus tard, mais le comportement varie et peut redémarrer des portions de travail.
Opérationnellement : traitez « pause » comme « délai avec risque », pas comme un point de contrôle propre.

5) Should I run a scrub immediately after replacing a disk?

En général : resilver d’abord, scrub après. Tant que le pool est dégradé, vous voulez restaurer la redondance le plus vite possible.
Une fois le resilver terminé et le pool sain, un scrub est un bon suivi pour valider l’intégrité—planifiez-le en période de faible charge.

6) What’s the single safest way to shorten resilver time?

Réduire l’I/O concurrente et garder les pools moins pleins. Les réglages aident à la marge ; la charge et la fragmentation déterminent la base.
L’accélération « la plus sûre » est de diminuer la pression sur le pool afin que le resilver puisse utiliser les IOPS sans nuire à la production.

7) Are mirrors always better than RAIDZ for resilver?

Pas toujours, mais les miroirs resilvent généralement de façon plus prévisible et avec moins d’amplification de lecture de parité.
RAIDZ peut être efficace et fiable, mais le comportement de rebuild en cas de panne est plus complexe, surtout sur des vdev larges et des pools chargés.

8) Why did replacing a disk with a “same size” model make resilver slower?

Même capacité n’est pas même performance. Vous avez peut-être introduit un comportement SMR, des débits d’écriture soutenus plus faibles, un firmware moins bon sous écritures aléatoires, ou un lien négocié à une vitesse inférieure.
Vérifiez le modèle et inspectez les erreurs de transport.

9) Does compression make resilver faster or slower?

Généralement plus rapide pour les systèmes liés à l’I/O car moins d’octets transitent. Cela peut être plus lent si le CPU devient le goulot, surtout avec chiffrement et petits blocs.
Mesurez le CPU pendant le resilver ; ne supposez pas.

10) If resilver is slow, is my data at risk?

Un pool dégradé a une redondance réduite, donc le risque est plus élevé jusqu’à la fin du resilver. Un resilver lent prolonge la fenêtre d’exposition.
Voilà pourquoi la bonne réaction n’est pas seulement « attendre » ; c’est « réduire la charge, réparer les problèmes matériels et restaurer la redondance rapidement ».

Prochaines étapes que vous pouvez faire aujourd’hui

Si vous êtes au milieu d’un resilver douloureusement lent, faites ceci dans l’ordre :

  1. Exécutez zpool status et confirmez que vous ne scrubez pas accidentellement en étant dégradé.
  2. Vérifiez dmesg pour resets de lien et erreurs I/O ; réparez les problèmes physiques avant de toucher aux réglages ZFS.
  3. Utilisez iostat -x pour décider si vous êtes lié par les IOPS ou la bande passante.
  4. Réduisez l’I/O concurrente : mettez en pause sauvegardes, migrations, jobs batch et tout churn de snapshots intensif.
  5. Si le budget de latence le permet, ajustez modestement l’agressivité du resilver et surveillez p95/p99 ; revenez en arrière après que le pool soit sain.

Si vous n’êtes pas actuellement dégradé, mieux encore. Profitez de ce calme pour acheter de la vitesse future : gardez de la marge, évitez les SMR surprises, choisissez la géométrie des vdev intentionnellement,
et traitez le temps de resilver comme une contrainte de conception prioritaire—pas un détail que vous découvrez quand le disque meurt.

← Précédent
Ubuntu 24.04 : rsyslog vs journald — choisir la journalisation sans perdre d’événements importants
Suivant →
De la pâte thermique partout : quand l’enthousiasme défie la physique

Laisser un commentaire