Hyper-V und Data Deduplication

Mittels Data Deplication können Daten auf Festplatten massiv eingespart werden. Die volle Power der Data Deduplication wird vorallem auf Hyper-V Servern entfaltet, da diese meinst die gleichen Datenblöcke enthalten (bei VDI’s z.B. immer das gleiche Windows Image).
In der Praxis kann man mit Data Deduplication bis zu 70/80% an Daten einsparen. Der volle Effekt wird allerdings erst spürbar, wenn die VM’s ausgeschaltet sind. Dafür habe ich ein PowerShell Skript entwickelt.

Dieses Skript erledigt folgende Schritte:

  1. Überprüfen welche VMs eingeschaltet sind
  2. Eingeschaltete VMs werden heruntergefahren
  3. Warten, bis alle VMs heruntergefahren sind
  4. Überprüfen auf welchen Laufwerken die VHD’s abgespeichert sind
  5. Überprüfen, ob auf diesen Laufwerken Data Deduplication aktiviert ist
  6. Starten der Deduplizierung
  7. Nach Abschluss der Deduplizierung werden die VMs gestartet, die vor der Deduplizierung liefen

Wichtig:

  • Das Skript muss auf dem Hyper-V Host ausgeführt werden
  • Die Platten müssen lokal vorhanden sein – also z.B. über SCSI eingebunden sein

Nach dem durchlaufen des Skripts kann mit

1
Get-DedupVolume

die prozentuale Einsparung angeschaut werden:

Wie man hier sieht, befindet sich die Saving Rate nicht in den oben genannten 70-80%. In dieser Umgebung sind viele unterschiedliche VM’s, weswegen der Prozentsatz nicht ganz so hoch ist.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
function Catch-Status
{
    do{
        cls
        $CurrentTime = get-date -DisplayHint Time
 
        Clear-Variable -Name Job
        $Job = Get-DedupJob
 
        if($job)
	    {
            Write-Progress -Activity "Type: $($job.Type) on Volume $($job.volume)" -PercentComplete $job.Progress -Status "Processing $($job.Progress)";
	    }
 
        Start-Sleep -Milliseconds 100
 
    }while($job)
}
 
$DriveLetterArray = @()
 
#Get VM's on Host
$RunningVMs = Get-VM | Where-Object {$_.State -ne "Off"}
$AllVMs = Get-VM
 
#Shutdown all running VMs
$RunningVMs | Stop-VM -Force
 
#Gather Disk Information
foreach($VM in $AllVMs)
{
    $ConnectedDrives = (Get-VM -Name $VM.Name).HardDrives
 
    foreach($Drive in $ConnectedDrives)
    {
        $DriveLetter = Split-Path $Drive.Path -Resolve -Qualifier
        if($DriveLetterArray -notcontains $DriveLetter)
        {
            $DriveLetterArray += $DriveLetter
        }  
    }
}
 
$DedupEnabledDisks = Get-DedupVolume
 
if($DriveLetterArray -notcontains $DedupEnabledDisks.Volume)
{
    $DedupEnabledDisks = $DedupEnabledDisks.Volume
}
 
 
foreach($disk in $DedupEnabledDisks)
{
    Start-DedupJob -Type Optimization -Volume $disk -Priority High -Full
    Catch-Status
    Start-DedupJob -Type Scrubbing -Volume $disk -Priority High -Full
    Catch-Status
    Start-DedupJob -Type GarbageCollection -Volume $disk -Priority High -Full
    Catch-Status
    Start-DedupJob -Type Optimization -Volume $disk -Priority High -Full
    Catch-Status
}
Posted in Hyper-V.

Leave a Reply