Sur Windows Server 2022, il arrive que la déduplication se lance mais ne traite aucune donnée : le job « Optimization » finit en quelques secondes, les économies restent à 0 %. Voici une procédure concrète pour diagnostiquer et corriger, sans reformater ni perdre de données.
Vue d’ensemble de la question
Scénario typique : vous formatez un volume, activez la déduplication, copiez un jeu d’essai tout neuf puis exécutez Start-DedupJob
(type Optimization, valeur par défaut). Le job aboutit presque instantanément : aucun bloc n’est traité, l’économiseur de stockage reste à 0 %, et rien d’alarmant n’apparaît dans le journal d’événements. La tentation est grande de reformater et de tout recommencer — solution lourde, risquée et inutile dans la majorité des cas.
Ce guide propose une méthode pas à pas pour remettre le moteur de déduplication en état, comprendre pourquoi il ne « voit » rien à optimiser et relancer un traitement complet, le tout en production et sans remise à zéro du volume.
Pourquoi le job s’arrête aussitôt ?
- Seuils d’éligibilité non respectés : par défaut, la déduplication ne traite que les fichiers dont l’âge minimal est supérieur à un certain nombre de jours (valeur usuelle : 3) et dont la taille minimale dépasse un seuil (usuellement ~32 KB). Des données fraîchement copiées ou très petites sont donc ignorées.
- Règles d’exclusion : les extensions ou dossiers exclus (
ExcludeFileType
,ExcludeFolder
) rendent certains fichiers inéligibles. - Fichiers ouverts en exclusif : un processus verrouille les fichiers (ex. sauvegarde en cours, antivirus, VM). La déduplication les reporte.
- Ressources contraignantes : peu de mémoire ou de CPU libre ; le job cède la place à d’autres tâches et se termine sans action notable.
- État interne à « nettoyer » : un précédent job a mal fini (arrêt brutal, redémarrage) et des métadonnées bloquent la reprise. Un cycle Unoptimization / Garbage Collection suffit souvent à repartir.
- Planification et chevauchement : un horaire actif, un job concurrent ou une fenêtre trop courte empêchent l’optimisation manuelle de s’exécuter réellement.
- Limites fonctionnelles : la déduplication n’opère pas sur le volume système, ne traite pas les fichiers au‑delà d’un certain gabarit (p. ex. > 1 To) ni ceux ouverts en exclusif. Suivant l’édition et le scénario, ReFS n’est pas toujours éligible.
Réponse & solutions proposées
Suivez les étapes ci‑dessous dans l’ordre ; elles couvrent 90 % des cas où l’optimisation termine « à vide ».
Étape | Action | Objectif / commentaire |
---|---|---|
Vérifications rapides | Get-DedupVolume , Get-DedupStatus , Get-DedupMetadata | Confirmer que le volume est bien marqué Enabled = True, qu’il reste des ressources (mémoire, CPU) et qu’aucun job bloqué n’est listé. |
Forcer la « dés‑optimisation » | Start-DedupJob -Type Unoptimization -Volume X: | Réinitialise les états internes en réhydratant si nécessaire. Une fois terminé, relancez Start-DedupJob -Type Optimization . |
Ajuster l’âge minimal des fichiers | Set-DedupVolume -Volume X: -MinimumFileAgeDays 0 | Par défaut seuls les fichiers âgés (≥ 3 jours) sont dédupliqués ; ramener la valeur à 0 pour un dataset fraîchement copié. |
Lancer le Garbage Collection | Start-DedupJob -Type GarbageCollection -Volume X: -Priority High | Nettoie les blocs orphelins et débloque l’optimisation. |
Désactiver / réactiver la déduplication | Disable-DedupVolume X: → redémarrage du service Dedup → Enable-DedupVolume X: | Régénère les structures logiques sans reformater. À utiliser hors pic d’activité. |
Vérifier la planification | Get-DedupSchedule , éventuellement Start-DedupJob -Type Optimization -Memory 80 -Priority High | Écarter un chevauchement ou une fenêtre trop étroite. |
Dernier recours : réinstaller la fonctionnalité | Uninstall-WindowsFeature FS-Data-Deduplication puis Install-WindowsFeature ... | Réinitialise complètement le moteur si tout le reste échoue (prévoir une fenêtre de maintenance). |
Procédure pas à pas avec commandes et sorties attendues
Vérifier l’état du volume et du service
Get-DedupVolume -Volume X: | Format-List *
Get-DedupStatus | Format-List *
Get-DedupMetadata -Volume X:
Get-Service *dedup*
Attendez‑vous à voir Enabled = True pour le volume, aucune erreur, et le service Data Deduplication (ddpsvc
) en état Running. Si le service n’est pas démarré :
Start-Service -Name ddpsvc
Pour un diagnostic minimaliste, contrôlez la présence d’un job en cours :
Get-DedupJob -Volume X:
Relancer la chaîne de traitement via « Unoptimization »
Attention : la dés‑optimisation peut temporairement augmenter l’espace utilisé (réhydratation). Assurez‑vous d’avoir de la marge disque.
Start-DedupJob -Type Unoptimization -Volume X: -Priority High
# Puis, quand terminé
Start-DedupJob -Type Optimization -Volume X: -Priority High
Cette séquence force la réévaluation des éligibilités et vide certains états qui, sinon, empêchent le scanner d’identifier du travail.
Abaisser l’âge minimal des fichiers (et, si nécessaire, la taille minimale)
Sur un jeu de test fraîchement copié, la politique par défaut peut ignorer les fichiers trop « récents ». Ajustez l’âge :
Set-DedupVolume -Volume X: -MinimumFileAgeDays 0
Si votre dataset contient majoritairement de très petits fichiers, vérifiez aussi la taille minimale et adaptez‑la :
# Vérifier la valeur actuelle
(Get-DedupVolume -Volume X:).MinimumFileSize
# Éventuellement la réduire (exemple)
Set-DedupVolume -Volume X: -MinimumFileSize 0
Relancez enfin une optimisation ciblée et prioritaire :
Start-DedupJob -Type Optimization -Volume X: -Priority High -Memory 80
Nettoyer les orphelins avec Garbage Collection
Un garbage collection remet le magasin de chunks en état, purge les références obsolètes et lève les blocages silencieux :
Start-DedupJob -Type GarbageCollection -Volume X: -Priority High
Basculer la fonctionnalité (sans formater)
Une bascule contrôlée de la fonctionnalité peut suffire à reconstruire des structures internes endommagées.
Disable-DedupVolume -Volume X: -Confirm:$false
Restart-Service -Name ddpsvc
Enable-DedupVolume -Volume X: -UsageType Default
Start-DedupJob -Type Optimization -Volume X:
Valider et corriger la planification
Un horaire actif peut interrompre un job manuel (« fenêtre fermée »). Listez les schedules :
Get-DedupSchedule
Pour forcer une passe intensive ponctuelle :
Start-DedupJob -Type Optimization -Volume X: -Priority High -Memory 90
Vérifier les journaux d’événements dédiés
Ouvrez Journaux des applications et des services → Microsoft → Windows → Deduplication → Operational et Diagnostic. Filtrez les catégories Optimization, Garbage Collection, Scrubbing. Les messages « No files to optimize » ou « Skipping file due to policy » confirment une cause « politique » (âge, taille, exclusions) plutôt qu’un incident.
Vérifications complémentaires utiles
- Services dépendants : Data Deduplication et File Server VSS Agent Service doivent être démarrés.
- Mémoire : sous forte pression, les jobs de déduplication se mettent en retrait. Augmentez la fenêtre (Schedule), la priorité, ou le budget via
-Memory
. - Intégrité NTFS/ReFS : exécutez
chkdsk /scan X:
(en ligne) ouRepair-Volume X: -Offline
pendant une maintenance, pour exclure une corruption du volume. - Limites fonctionnelles : certains types de fichiers ou tailles extrêmes ne sont pas optimisés ; les fichiers verrouillés sont reportés. Ne ciblez jamais le volume système.
- Surveillance : suivez Performance Monitor (compteurs Dedup IO, Jobs/sec) pour confirmer l’activité avant de conclure à un blocage.
Tableau de triage rapide
Symptôme | Cause probable | Vérification | Action |
---|---|---|---|
Job « Optimization » finit en < 10 s | Aucun fichier éligible (âge/taille) | Get-DedupVolume : MinimumFileAgeDays, MinimumFileSize | Set-DedupVolume -MinimumFileAgeDays 0 et, si besoin, réduire la taille minimale. |
Économies 0 % après plusieurs passes | Exclusions d’extensions/dossiers | Get-DedupVolume | Select Exclude* | Retirer/adapter les exclusions, relancer une optimisation. |
Jobs démarrent mais restent « Queued » | Fenêtre de planification fermée / ressources | Get-DedupSchedule , charge CPU/RAM | Étendre la fenêtre, augmenter -Priority et -Memory . |
Messages « No files to optimize » | État interne à purger | Journaux Operational / Diagnostic | Unoptimization puis GarbageCollection , relancer l’optimisation. |
Blocage récurrent après reboot | Métadonnées incohérentes / service | Get-Service ddpsvc | Bascule Disable/Enable et Restart-Service ddpsvc . |
Exemples de scripts prêts à l’emploi
Diagnostic express d’un volume
# Exécuter dans une console PowerShell élevée
param([Parameter(Mandatory=$true)][string]$Volume = "X:")
Write-Host "=== ÉTAT DÉDUP SUR \$Volume ==="
\$vol = Get-DedupVolume -Volume \$Volume
\$status = Get-DedupStatus
\$meta = Get-DedupMetadata -Volume \$Volume
\$vol | Format-List Volume, Enabled, MinimumFileAgeDays, MinimumFileSize, ExcludeFileType, ExcludeFolder
\$status | Format-List LastOptimizationTime, LastGarbageCollectionTime, InPolicyFilesCount, InPolicyFileBytes
\$meta | Format-List DataChunkCount, ContainerCount, IndexCount
Get-DedupJob -Volume \$Volume
Remise en route « douce » (sans réinstallation)
# Forces de manière sûre un cycle complet pour débloquer l'optimisation
param([Parameter(Mandatory=$true)][string]$Volume = "X:")
Write-Host "Réglage d’âge minimal à 0 jour..."
Set-DedupVolume -Volume \$Volume -MinimumFileAgeDays 0
Write-Host "Nettoyage Garbage Collection..."
Start-DedupJob -Type GarbageCollection -Volume \$Volume -Priority High | Out-Null
while((Get-DedupJob -Volume \$Volume | Where-Object {$\_.Type -eq "GarbageCollection"}).Progress -lt 100){ Start-Sleep -Seconds 5 }
Write-Host "Relance de l’optimisation..."
Start-DedupJob -Type Optimization -Volume \$Volume -Priority High -Memory 80 | Out-Null
Bonnes pratiques pour éviter la panne sèche
- Profil d’usage adapté : lorsque vous activez la déduplication, choisissez le UsageType pertinent (ex. Default, Backup, VDI) afin d’obtenir des seuils adaptés par défaut.
- Fenêtres généreuses : configurez des plannings qui laissent le temps à l’optimisation de s’exécuter réellement, surtout sur de gros volumes.
- Surveillance proactive : consolidez un tableau de bord avec PerfMon, la taille de System Volume Information\Dedup, et les derniers événements Operational.
- Exclusions explicites : définissez clairement ce qui doit être dédupliqué (ou non) et documentez les règles avec
Set-DedupVolume -ExcludeFileType / -ExcludeFolder
. - Procédure de « reset » standardisée : gardez sous la main les séquences Unoptimization → Garbage Collection → Optimization pour un retour à la normale sans panique.
Questions fréquentes
Le job finit immédiatement mais mes fichiers ont plus de 3 jours.
Vérifiez la taille minimale et les exclusions. De petits fichiers (quelques ko) ou des extensions exclues font que l’optimisation n’a rien à faire malgré l’âge suffisant.
Puis‑je supprimer le dossier System Volume Information\Dedup ?
Non. Ne manipulez jamais à la main le magasin de chunks. Utilisez Unoptimization, Garbage Collection, puis relancez une Optimization.
Faut‑il redémarrer le serveur ?
Non, pas dans l’immense majorité des cas. Un redémarrage du service ddpsvc
suffit quand c’est nécessaire.
La déduplication compresse‑t‑elle mes fichiers ?
Elle stocke les blocs communs une seule fois et applique une compression côté magasin de chunks. Vos fichiers restent accessibles de façon transparente par NTFS.
La déduplication est‑elle supportée sur ReFS ?
Selon l’édition et le scénario, l’optimisation peut ne pas être disponible. Sur Windows Server « classique », privilégiez NTFS pour la déduplication.
Checklist finale avant de reformater
- État :
Get-DedupVolume
,Get-DedupStatus
sans anomalies. - Âge/Taille :
-MinimumFileAgeDays 0
pour les tests, taille minimale adaptée à votre dataset. - Exclusions : extensions/dossiers vérifiés.
- Cycle soft‑reset : Unoptimization → Garbage Collection → Optimization.
- Service :
ddpsvc
redémarré, absence de chevauchement de plannings. - Intégrité :
chkdsk /scan
OK.
Résumé opérationnel
Quand un job de déduplication sur Windows Server 2022 « ne fait rien », la cause est presque toujours liée aux politiques d’éligibilité (âge, taille, exclusions) ou à un état interne à purger après une interruption. Les commandes essentielles à retenir :
# Inspecter
Get-DedupVolume -Volume X:
Get-DedupStatus
Get-DedupMetadata -Volume X:
Get-DedupJob -Volume X:
# Dégager les blocages
Start-DedupJob -Type Unoptimization -Volume X:
Start-DedupJob -Type GarbageCollection -Volume X:
# Rendre les fichiers immédiatement éligibles pour un test
Set-DedupVolume -Volume X: -MinimumFileAgeDays 0
# Relancer une passe prioritaire
Start-DedupJob -Type Optimization -Volume X: -Priority High -Memory 80
Ces mesures permettent en général de débloquer un volume sans reformater, en conservant les données et en minimisant l’impact sur la production.
Annexe : exemples de sorties attendues
PS C:\> Get-DedupVolume -Volume X: | fl Volume,Enabled,MinimumFileAgeDays,MinimumFileSize,Exclude*
Volume : X:
Enabled : True
MinimumFileAgeDays : 3
MinimumFileSize : 32768
ExcludeFileType : {iso, vhdx, ...}
ExcludeFolder : {}
PS C:\> Get-DedupStatus | fl *
LastOptimizationTime : 2025-09-10 21:32:14
LastGarbageCollectionTime : 2025-09-10 22:05:01
InPolicyFilesCount : 0
InPolicyFileBytes : 0
OptimizedFilesCount : 0
SavingRate : 0
Après ajustements (âge = 0, GC, relance), vous devriez observer le compteur InPolicyFilesCount > 0, et la progression d’un job Optimization non nulle.
Remarques de sécurité et de performance : exécutez toujours ces commandes dans une console PowerShell élevée. Pour des environnements très contraints en RAM/CPU, préférez des plannings nocturnes avec -Priority Low
et limitez le budget mémoire avec -Memory
. N’utilisez la réinstallation de la fonctionnalité que lorsque la bascule Disable/Enable et la séquence Unoptimization/Garbage Collection n’ont apporté aucune amélioration.
En suivant cette démarche structurée, vous transformez un symptôme frustrant (« job terminé sans traitement ») en un runbook reproductible et sûr, et vous évitez surtout le piège du reformatage inutile.