Windows Server 2022: deduplicazione che “non parte” su volume nuovo? Cause, fix e playbook PowerShell

Su Windows Server 2022 può capitare che la deduplicazione non elabori i file su un volume appena formattato e già abilitato: Start-DedupJob termina subito, nessun errore nei log e nessun risparmio di spazio. Ecco una guida pratica per sbloccare la situazione senza ricorrere subito al re‑format.

Indice

Scenario e sintomi

Il caso tipico è questo: si crea o si riformatta un volume, si abilita la deduplicazione dati e si copiano file “deduplicabili”. Quando si avvia manualmente un job di ottimizzazione con Start-DedupJob -Type Optimization -Volume X: il comando restituisce immediatamente il prompt. In Deduplication/Operational non compaiono errori, lo spazio usato non cambia e Get-DedupStatus non mostra attività. Riformattare il volume e ricominciare da zero sembra l’unica azione risolutiva, ma è onerosa. La buona notizia: nella maggior parte dei casi si tratta di metadati incoerenti o di parametri che escludono i file, e si può recuperare senza distruggere i dati.

Perché accade

  • Metadati non inizializzati o incoerenti: il catalogo Dedup sul volume (archiviato in System Volume Information) può restare in uno stato che fa “saltare” l’analisi.
  • Nessun file in policy: per impostazione predefinita la deduplica ignora file più piccoli di ~32 KB, più grandi di ~1 TB e più “giovani” del valore MinimumFileAgeDays (generalmente 3 giorni). Su dataset di test appena copiati, il job finisce subito perché non trova candidati.
  • Pianificazione e trigger non allineati: finestre di manutenzione che non partono o partono quando il server è in uso intenso, con throttling aggressivo.
  • Job scheduler in stallo: rari casi in cui una coda “fantasma” o un job sospeso impedisce nuova attività.
  • Problemi I/O o antivirus: latenza disco anomala o prodotti di sicurezza che scandagliano la cartella Dedup possono fermare i job senza errori espliciti.

Risposta rapida

Prima di pensare al re‑format, esegui la seguente sequenza sul volume interessato (sostituisci X: con la lettera corretta):

$vol = 'X:'

Verifica stato e servizio

Get-Service -Name ddpsvc | Format-Table Status,Name,DisplayName
Update-DedupStatus -Volume $vol
Get-DedupStatus -Volume $vol | Format-List *

Rendi deduplicabili anche i file appena copiati

Set-DedupVolume -Volume $vol -MinimumFileAgeDays 0

Disabilita e riabilita per ricostruire il catalogo senza toccare i dati

Disable-DedupVolume -Volume $vol
Enable-DedupVolume  -Volume $vol

Rimuovi eventuale stato di ottimizzazione incoerente

Start-DedupJob -Type Unoptimization    -Volume $vol -Confirm:$false

Garbage Collection completo sui metadati

Start-DedupJob -Type GarbageCollection -Volume $vol -Full

(Opzionale) Scrubbing approfondito dei chunk

Start-DedupJob -Type Scrubbing         -Volume $vol -Full

Avvia l’ottimizzazione vera e propria

Start-DedupJob -Type Optimization      -Volume $vol

Monitora in tempo reale

Get-DedupJob -Volume $vol -IncludeCompleted | Format-Table Type,State,StartTime,Progress,Throughput 

Nella maggior parte dei casi vedrai nuovamente avanzare i job e variare i contatori InPolicyFiles, OptimizedFiles e SpaceSavings.

Procedura guidata di ripristino

Avvio parallelo controllato

Se hai più volumi con deduplica, avvia in parallelo un Optimization su quelli che hanno dati idonei. Lavorare in contemporanea talvolta “sblocca” lo scheduler. Usa il parallelismo con giudizio (monitorando CPU, RAM e I/O):

Start-DedupJob -Type Optimization -Volume D:
Start-DedupJob -Type Optimization -Volume E:
Start-DedupJob -Type Optimization -Volume F:

Controlla con Get-DedupJob che lo stato diventi Running e che il Progress aumenti.

Rigenerazione del catalogo

Disabilitare e riabilitare la deduplicazione sul volume forza la rigenerazione dei metadati senza toccare i file:

Disable-DedupVolume -Volume X:
Enable-DedupVolume  -Volume X:

Dopo il ri‑enable, lancia un Optimization o, se sospetti stato sporco, un Unoptimization seguito da GarbageCollection completo.

Unoptimization per ripartire pulito

Unoptimization rimuove lo stato di ottimizzazione registrato, costringendo Dedup a rianalizzare i file:

Start-DedupJob -Type Unoptimization -Volume X:
Enable-DedupVolume -Volume X:  # nel caso fosse stato disabilitato
Start-DedupJob -Type Optimization -Volume X:

Garbage Collection e Scrubbing

GarbageCollection -Full elimina chunk orfani e riallinea il catalogo; Scrubbing -Full verifica l’integrità dei chunk ed è utile se sospetti corruzione silente:

Start-DedupJob -Type GarbageCollection -Volume X: -Full
Start-DedupJob -Type Scrubbing         -Volume X: -Full

Reinstallazione del ruolo

Se i job restano inerti e i log non aiutano, valuta la rimozione e reinstallazione del ruolo Data Deduplication (con riavvio intermedio):

Get-WindowsFeature FS-Data-Deduplication
Remove-WindowsFeature FS-Data-Deduplication
Restart-Computer
Add-WindowsFeature    FS-Data-Deduplication

Al termine, abilita nuovamente sul volume e ripeti i job di GarbageCollection e Optimization.

Soluzioni proposte nella discussione

PassoDescrizioneComando o azione
1. Avviare più job contemporanei solo se disponibili risorseSe esistono job pianificati su altri volumi, lanciarli in parallelo può aiutare a “sbloccare” l’attività sospesa, purché CPU e I/O lo consentano.Start-DedupJob -Type Optimization -Volume X (su più volumi in parallelo)
2. Disabilitare e riabilitare Dedup sul volumeForza la rigenerazione del catalogo metadati senza toccare i dati.Disable-DedupVolume -Volume X
Enable-DedupVolume -Volume X
3. Eseguire un job di UnoptimizationRimuove manualmente lo stato di ottimizzazione così da ricominciare l’analisi.Start-DedupJob -Type Unoptimization -Volume X poi di nuovo Enable-DedupVolume
4. Eseguire Garbage Collection mirataUtile se il problema dipende da metadati orfani.Start-DedupJob -Type GarbageCollection -Volume X -Full
5. Reinstallare il ruolo DeduplicationEstremo rimedio: rimuove il feature, riavvio, reinstallazione.Server Manager / Remove-WindowsFeature FS-Data-Deduplication e poi Add-WindowsFeature

Controlli preliminari che fanno la differenza

Verifica delle soglie dimensionali e dell’età dei file

Se stai testando con pochi file appena copiati, è molto probabile che non rientrino nella policy. Imposta temporaneamente l’età minima a 0 per rendere eleggibili i file “freschi” e verifica i limiti di dimensione:

Set-DedupVolume -Volume X: -MinimumFileAgeDays 0
Get-DedupVolume -Volume X: | Select-Object Volume, MinimumFileAgeDays, ExcludeFileType

Ricorda che file < 32 KB o > 1 TB (default) vengono ignorati. Per un test rappresentativo, usa un set di file medi (decine di MB) con contenuti ripetitivi o ridondanti.

Pianificazione e trigger

Get-DedupSchedule | Format-Table Name,Type,Days,Start,DurationHours,Enabled

Assicurati che gli slot non coincidano con finestre a forte carico. Se necessario, crea una schedule ad hoc per il recupero:

New-DedupSchedule -Name 'Recovery' -Type Optimization -Start (Get-Date).AddMinutes(5) -DurationHours 12 -Days Monday,Tuesday,Wednesday,Thursday,Friday -Enabled $true

Analisi dello stato del volume

Update-DedupStatus  -Volume X:
Get-DedupStatus     -Volume X: | Format-List *
Get-DedupVolume     -Volume X: | Format-List *
Get-DedupJob        -Volume X: -IncludeCompleted

Controlla con attenzione: InPolicyFilesCount, OptimizedFilesCount, SpaceSavings, LastOptimizationTime, DedupMode e lo State dei job correnti.

Log dedicati

Apri Applications and Services Logs → Microsoft → Windows → Deduplication/Operational e filtra gli eventi chiave: 102 (Optimization), 204 (Garbage Collection), 4097 (Metadata corruption). Puoi farlo anche via PowerShell:

$log = 'Microsoft-Windows-Deduplication/Operational'
Get-WinEvent -LogName $log | Where-Object { $_.Id -in 102,204,4097 } | 
  Select-Object TimeCreated, Id, LevelDisplayName, Message | 
  Format-Table -Wrap

Salute del disco e interferenze

  • Controlla SMART e latenze: un disco lento o con errori può far terminare i job senza progressi tangibili.
  • Escludi dall’antivirus System Volume Information\Dedup e ChunkStore per evitare lock indesiderati.

Diagnostica approfondita delle policy

La deduplicazione applica criteri a livello di volume. Ecco i più rilevanti e come modificarli per il troubleshooting.

ParametroSignificatoComandoValore consigliato per test
MinimumFileAgeDaysEtà minima dei file per essere candidatiSet-DedupVolume -MinimumFileAgeDays 00 durante il test, poi ripristina (es. 3)
ExcludeFileTypeTipi file esclusiSet-DedupVolume -ExcludeFileType .pst,.vhdx (esempio)Verifica che i formati di test non siano esclusi
ExcludeFolderCartelle escluseSet-DedupVolume -ExcludeFolder 'Temp','Backup'Evita che i file di test ricadano in esclusioni
ReadOnlyModeVolume in sola lettura per DedupGet-DedupVolume | Select ReadOnlyModeAssicurati sia False

Interpretare correttamente Get-DedupStatus

Alcuni indicatori chiave:

  • InPolicyFilesCount: numero di file che soddisfano la policy; se è zero, il job di ottimizzazione non ha lavoro da svolgere.
  • OptimizedFilesCount / OptimizedFilesSize: conteggi e dimensioni dei file già ottimizzati.
  • SpaceSaved / SavingsRate: risparmio totale e percentuale; controlla che crescano dopo l’ottimizzazione.
  • LastOptimizationTime: utile per capire se un job è realmente partito di recente.
  • DedupMode: stato del volume rispetto a Dedup (abilitato, in manutenzione, ecc.).

Flusso decisionale suggerito

  1. Conferma i prerequisiti: ruolo installato, servizio ddpsvc Running, file system supportato, volumi integri.
  2. Azzeramento policy bloccanti: MinimumFileAgeDays a 0 e verifica esclusioni.
  3. Rigenerazione catalogo: Disable/Enable sul volume.
  4. Unoptimization → GarbageCollection → Scrubbing.
  5. Optimization e monitoraggio Get-DedupJob e Get-DedupStatus.
  6. Reinstallazione del ruolo se persiste lo stallo; solo in ultima istanza valuta il re‑format del volume.

Script di recupero pronto all’uso

Questo script esegue in sicurezza la catena di azioni consigliate su un volume; registra un log minimale in C:\Temp\Dedup-Recovery.log.

param(
  [Parameter(Mandatory)][ValidatePattern('^[A-Z]:$')]
  [string]$Volume
)

$ErrorActionPreference = 'Stop'
$log = 'C:\Temp\Dedup-Recovery.log'
New-Item -ItemType Directory -Path (Split-Path $log) -Force | Out-Null

function Write-Log($msg){ $ts = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'; "$ts`t$msg" | Tee-Object -FilePath $log -Append }

try {
Write-Log "=== Dedup Recovery avviato su $Volume ==="
Write-Log "Servizio dedup: $(Get-Service ddpsvc | Select-Object -ExpandProperty Status)"

Set-DedupVolume -Volume $Volume -MinimumFileAgeDays 0
Write-Log "MinimumFileAgeDays impostato a 0"

Disable-DedupVolume -Volume $Volume
Enable-DedupVolume  -Volume $Volume
Write-Log "Dedup disabilitata/riabilitata"

Start-DedupJob -Type Unoptimization -Volume $Volume -Confirm:$false
Write-Log "Job Unoptimization avviato"

Start-DedupJob -Type GarbageCollection -Volume $Volume -Full
Write-Log "Job GarbageCollection -Full avviato"

Start-DedupJob -Type Scrubbing -Volume $Volume -Full
Write-Log "Job Scrubbing -Full avviato"

Start-DedupJob -Type Optimization -Volume $Volume
Write-Log "Job Optimization avviato"

Update-DedupStatus -Volume $Volume
$st = Get-DedupStatus -Volume $Volume
Write-Log ("Status: InPolicy={0}, Optimized={1}, Savings={2:N2}%" -f `
$st.InPolicyFilesCount, $st.OptimizedFilesCount, $st.SavingsRate)
}
catch {
Write-Log "Errore: $($_.Exception.Message)"
throw
}
finally {
Write-Log "=== Dedup Recovery completato su $Volume ==="
} 

Verifiche infrastrutturali e performance

  • CPU e RAM: Dedup è CPU‑intensiva; durante il recupero evita carichi concorrenti (backup/compressioni).
  • I/O: monitora latenza medio‑alta sul volume; se la coda disco è costantemente elevata, i job possono rallentare o fermarsi.
  • Antivirus/EDR: escludi la cartella Dedup e i processi di sistema coinvolti, altrimenti si generano lock.
  • Backup e snapshot: alcune soluzioni di backup possono interferire con i lock del ChunkStore; prova a fermarle temporaneamente durante i job di recupero.

Domande frequenti

Posso eliminare manualmente la cartella Dedup dal volume?
Fortemente sconsigliato. Usa Unoptimization, GarbageCollection e Scrubbing. La rimozione manuale può corrompere definitivamente lo stato.

Qual è un buon dataset per testare?
File tra 1 MB e 1 GB con ridondanza intrinseca (ad esempio librerie, ISO simili o set di log ripetitivi). Evita pochi file enormi o migliaia di file minuscoli.

Quanto lasciare MinimumFileAgeDays a zero?
Solo per il troubleshooting. In produzione ripristina un valore conservativo (es. 3–7 giorni) per ridurre rielaborazioni inutili su file frequentemente modificati.

È supportato su tutti i file system?
La deduplicazione è pensata per volumi supportati da Windows Server 2022; verifica sempre i requisiti del tuo scenario e della tua edizione prima di abilitarla su nuovi volumi.

Check‑list operativa pronta

  • Imposta MinimumFileAgeDays = 0 e rimuovi esclusioni che toccano il dataset.
  • Disable-DedupVolumeEnable-DedupVolume.
  • Start-DedupJob -Type Unoptimization.
  • Start-DedupJob -Type GarbageCollection -Full e, se opportuno, -Type Scrubbing -Full.
  • Start-DedupJob -Type Optimization e monitoraggio con Get-DedupJob.
  • Controllo log eventi 102, 204, 4097 e stato con Get-DedupStatus.
  • Se tutto fallisce: reinstallazione ruolo Deduplication; re‑format solo come ultima risorsa.

Best practice per evitare recidive

  • Automatizza un controllo settimanale: esporta Get-DedupStatus, Get-DedupJob e un estratto dei log eventi; conserva lo storico per trend.
  • Cap con policy realistiche: non esasperare con età minima a 0 in produzione; usa schedule notturne e finestra di manutenzione ampia.
  • Capacità: lascia margine di spazio libero (almeno 10–15%) per permettere a Dedup di lavorare senza frammentazione eccessiva.
  • Integrazione con backup: coordina i job Dedup con il piano di backup per evitare scansioni doppie sui medesimi file.
  • Esclusioni antivirus: definiscile una volta sola e verificale dopo ogni aggiornamento del prodotto di sicurezza.

Conclusioni

Il comportamento “fa nulla e finisce” di Start-DedupJob su Windows Server 2022 è quasi sempre riconducibile a metadati incoerenti o a policy troppo restrittive che escludono i file. Prima di ricorrere alla riformattazione, applica la sequenza di recupero: disabilita/riabilita, esegui Unoptimization, quindi GarbageCollection (e, se necessario, Scrubbing) e infine rilancia l’Optimization. In parallelo controlla soglie, stato e log dedicati. Solo se il problema persiste dopo queste azioni valuta la reinstallazione del ruolo Deduplication o, davvero in ultima istanza, il re‑format del volume. Con questa checklist la deduplicazione tornerà operativa nella maggior parte delle situazioni senza tempi morti e senza perdita di dati.


Indice