Blackout-Time (VM Live Migration): Unterschied zwischen den Versionen

Aus Wiki-WebPerfect
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „<source lang"powershell"> <# .SYNOPSIS Für Troubleshooting-Zwecke von Blackout-Zeiten während Live-Migrationen .DESCRIPTION Mit diesem Skript kann man alle…“)
 
 
(20 dazwischenliegende Versionen des gleichen Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
<source lang"powershell">
+
[[Datei:VM-Blackout-Time.png|right|600px]]
 +
 
 +
== Beschreibung ==
 +
=== Live Migration ===
 +
Folgende Punkte sind die chronilogische Abfolge einer Live Migration:
 +
*Establish connection between source and target computer
 +
*Transfer VM configuration and device information
 +
*Transfer VM memory
 +
*Suspend source VM and transfer state
 +
*Resume target VM
 +
 
 +
''Das Ziel ist es kein TCP/IP Timeout zu bekommen.''
 +
 
 +
=== Blackout-Time ===
 +
Die Blackout-Time ist die Zeit zwischen der, der Hyper-V Host die Source-VM stoppt, den State transferiert und die Target-VM "startet". (Siehe Bild auf der rechten seite.)
 +
Die Blackout-Time einer VM entsteht bei einer Live Migration und ist im EventLog des Hyper-V Nodes unter dem Provider ''Microsoft-Windows-Hyper-V-VMMS-Admin'' ersichtlich.
 +
''Die "Blackout-Time" und die "stun-time" bedeuten das Gleiche.''
 +
 
 +
 
 +
== Blackout-Time per PowerShell-Skript abfragen (V5) ==
 +
<span style="font-size:20px;"><span style="color:red">'''-> This function/script is moved to [https://github.com/R-Studio/PSTools GitHub]!'''</span></span><br>
 +
<source lang="powershell">
 +
Function Get-LiveMigrationBlackoutTime {
 +
    [CmdletBinding()]
 +
 +
    param(
 +
        [Parameter(Position=0,mandatory=$true)][string] $Cluster,
 +
        [Parameter(Position=1,mandatory=$true)][int] $EventlogAge,
 +
        [ValidateSet("VMName", "BlackoutTime","TimeCreated")]
 +
    [String]$Sortby = "BlackoutTime"
 +
    )
 +
 +
    process{
 +
        $ErrorActionPreference = "SilentlyContinue"
 +
 +
        $eventsnormal = (Get-ClusterNode -Cluster $Cluster).Name | foreach {Get-WinEvent -ComputerName $_ -FilterHashtable @{LogName = 'Microsoft-Windows-Hyper-V-VMMS-Admin'; ID = 20415,20417; StartTime = ((Get-Date).AddDays($EventlogAge))}} #| select TimeCreated, Id, Message, MachineName
 +
        $HyperVNode = $events.MachineName
 +
 +
        $obj = foreach ($event in $eventsnormal) { 
 +
            If ($event.id -eq 20417) {
 +
                $Level = "Critical"
 +
            } Else {
 +
                $Level = "Normal"
 +
            }
 +
           
 +
            $EventVM = $event.properties.value[0]
 +
            $EventVMID = $event.properties.value[1]
 +
            $EventBlackoutTime = $event.properties.value[2]
 +
            $HyperVNode = $event.MachineName
 +
            $TimeCreated = $event.TimeCreated
 +
           
 +
            [PSCustomObject]@{
 +
                VMName = $EventVM
 +
                BlackoutTime = $EventBlackoutTime
 +
                VMID = $EventVMID
 +
                HyperVNode = $HyperVNode
 +
                TimeCreated = $TimeCreated
 +
                Level = $Level
 +
            }
 +
        }
 +
        $obj | Sort-Object -Descending $Sortby
 +
    }
 +
}
 +
</source>
 +
 
 +
 
 +
== Blackout-Time per PowerShell-Skript abfragen (V4) ==
 +
<source lang="powershell">
 
<#
 
<#
  
Zeile 24: Zeile 91:
 
Function Get-LiveMigrationBlackoutTime {
 
Function Get-LiveMigrationBlackoutTime {
 
     [CmdletBinding()]
 
     [CmdletBinding()]
 
+
 
     param(
 
     param(
 
         [Parameter(Position=0,mandatory=$true)][string] $Cluster,
 
         [Parameter(Position=0,mandatory=$true)][string] $Cluster,
         [Parameter(Position=1,mandatory=$true)][int] $EventlogAge
+
         [Parameter(Position=1,mandatory=$true)][int] $EventlogAge,
 +
        [ValidateSet("VMName", "BlackoutTime","TimeCreated")]
 +
    [String]$Sortby = "BlackoutTime"
 
     )
 
     )
 
+
 
     process{
 
     process{
         $events = (Get-ClusterNode -Cluster $Cluster).Name | foreach {Get-WinEvent -ComputerName $_ -FilterHashtable @{LogName = 'Microsoft-Windows-Hyper-V-VMMS-Admin'; ID = 20415}} | ? {$_.TimeCreated -ge ((get-date).AddDays($EventlogAge))} | select TimeCreated, Id, Message, MachineName
+
         $ErrorActionPreference = "SilentlyContinue"
 +
 +
        $eventsnormal = (Get-ClusterNode -Cluster $Cluster).Name | foreach {Get-WinEvent -ComputerName $_ -FilterHashtable @{LogName = 'Microsoft-Windows-Hyper-V-VMMS-Admin'; ID = 20415; StartTime = ((Get-Date).AddDays($EventlogAge))}} | select TimeCreated, Id, Message, MachineName
 +
        $eventscritical = (Get-ClusterNode -Cluster $Cluster).Name | foreach {Get-WinEvent -ComputerName $_ -FilterHashtable @{LogName = 'Microsoft-Windows-Hyper-V-VMMS-Admin'; ID = 20417; StartTime = ((Get-Date).AddDays($EventlogAge))}} | select TimeCreated, Id, Message, MachineName
  
 
         $HyperVNode = $events.MachineName
 
         $HyperVNode = $events.MachineName
 
+
         $table = New-Object system.Data.DataTable “$TableName”
+
         $BOReport = @()
 
+
        $spalte1 = New-Object system.Data.DataColumn VM,([string])
+
         foreach ($event in $eventsnormal) {
        $spalte2 = New-Object system.Data.DataColumn BlackoutTime,([double])
+
        $spalte3 = New-Object system.Data.DataColumn VMID,([string])
+
        $spalte4 = New-Object System.Data.DataColumn HyperVNode,([string])
+
        $spalte5 = New-Object System.Data.DataColumn TimeCreated,([string])
+
 
+
        $table.columns.add($spalte1)
+
        $table.columns.add($spalte2)
+
        $table.columns.add($spalte3)
+
        $table.columns.add($spalte4)
+
        $table.columns.add($spalte5)
+
 
+
 
+
         foreach ($event in $events) {
+
 
             $EventMessageVM = $event.message -replace  ".*\'(.*)\'.*blackout time of (.+) seconds \(VMID (.*)\).", '$1'
 
             $EventMessageVM = $event.message -replace  ".*\'(.*)\'.*blackout time of (.+) seconds \(VMID (.*)\).", '$1'
 
             $EventMessageBlackoutTime = $event.message -replace ".*\'(.*)\'.*blackout time of (.+) seconds \(VMID (.*)\).", '$2'
 
             $EventMessageBlackoutTime = $event.message -replace ".*\'(.*)\'.*blackout time of (.+) seconds \(VMID (.*)\).", '$2'
Zeile 56: Zeile 115:
 
             $HyperVNode = $event.MachineName
 
             $HyperVNode = $event.MachineName
 
             $TimeCreated = $event.TimeCreated
 
             $TimeCreated = $event.TimeCreated
 +
            $Level = "Normal"
  
             $row = $table.NewRow()
+
             $obj = New-Object -TypeName PSObject
             $row.VM = $EventMessageVM
+
            $obj | Add-Member -MemberType NoteProperty -Name VMName -Value $EventMessageVM
             $row.BlackoutTime = $EventMessageBlackoutTime
+
            $obj | Add-Member -MemberType NoteProperty -Name BlackoutTime -Value $EventMessageBlackoutTime
             $row.VMID = $EventMessageVMID
+
            $obj | Add-Member -MemberType NoteProperty -Name VMID -Value $EventMessageVMID
             $row.HyperVNode = $HyperVNode
+
            $obj | Add-Member -MemberType NoteProperty -Name HyperVNode -Value $HyperVNode
             $row.TimeCreated = $TimeCreated
+
            $obj | Add-Member -MemberType NoteProperty -Name TimeCreated -Value $TimeCreated
             $table.Rows.Add($row)
+
            $obj | Add-Member -MemberType NoteProperty -Name Level -Value $Level
 +
            $BOReport += $obj
 +
        }
 +
 +
        foreach ($event in $eventscritical) {
 +
            $EventMessageVM = $event.message -replace  ".*\'(.*)\'.*blackout time of (.+) seconds \(VMID (.*)\).", '$1'
 +
             $EventMessageBlackoutTime = $event.message -replace ".*\'(.*)\'.*blackout time of (.+) seconds \(VMID (.*)\).", '$2'
 +
            $EventMessageVMID = $event.message -replace ".*\'(.*)\'.*blackout time of (.+) seconds \(VMID (.*)\).", '$3'
 +
             $HyperVNode = $event.MachineName
 +
            $TimeCreated = $event.TimeCreated
 +
            $Level = "Critical"
 +
 +
            $obj = New-Object -TypeName PSObject
 +
            $obj | Add-Member -MemberType NoteProperty -Name VMName -Value $EventMessageVM
 +
            $obj | Add-Member -MemberType NoteProperty -Name BlackoutTime -Value $EventMessageBlackoutTime
 +
             $obj | Add-Member -MemberType NoteProperty -Name VMID -Value $EventMessageVMID
 +
             $obj | Add-Member -MemberType NoteProperty -Name HyperVNode -Value $HyperVNode
 +
             $obj | Add-Member -MemberType NoteProperty -Name TimeCreated -Value $TimeCreated
 +
             $obj | Add-Member -MemberType NoteProperty -Name Level -Value $Level
 +
            $BOReport += $obj
 
         }
 
         }
  
         $table | sort BlackoutTime -Descending | format-table -AutoSize
+
         $BOReport | Sort-Object -Descending $Sortby | Format-Table
 
     }
 
     }
 
}
 
}
 
 
</source>
 
</source>
 +
 +
 +
 +
 +
 +
[[Kategorie:PowerShell]]
 +
[[Kategorie:Hyper-V / VMM]]

Aktuelle Version vom 27. April 2020, 09:15 Uhr

VM-Blackout-Time.png

Beschreibung

Live Migration

Folgende Punkte sind die chronilogische Abfolge einer Live Migration:

  • Establish connection between source and target computer
  • Transfer VM configuration and device information
  • Transfer VM memory
  • Suspend source VM and transfer state
  • Resume target VM

Das Ziel ist es kein TCP/IP Timeout zu bekommen.

Blackout-Time

Die Blackout-Time ist die Zeit zwischen der, der Hyper-V Host die Source-VM stoppt, den State transferiert und die Target-VM "startet". (Siehe Bild auf der rechten seite.) Die Blackout-Time einer VM entsteht bei einer Live Migration und ist im EventLog des Hyper-V Nodes unter dem Provider Microsoft-Windows-Hyper-V-VMMS-Admin ersichtlich. Die "Blackout-Time" und die "stun-time" bedeuten das Gleiche.


Blackout-Time per PowerShell-Skript abfragen (V5)

-> This function/script is moved to GitHub!

Function Get-LiveMigrationBlackoutTime {
    [CmdletBinding()]
 
    param(
        [Parameter(Position=0,mandatory=$true)][string] $Cluster,
        [Parameter(Position=1,mandatory=$true)][int] $EventlogAge,
        [ValidateSet("VMName", "BlackoutTime","TimeCreated")]
	    [String]$Sortby = "BlackoutTime"
    )
 
    process{
        $ErrorActionPreference = "SilentlyContinue"
 
        $eventsnormal = (Get-ClusterNode -Cluster $Cluster).Name | foreach {Get-WinEvent -ComputerName $_ -FilterHashtable @{LogName = 'Microsoft-Windows-Hyper-V-VMMS-Admin'; ID = 20415,20417; StartTime = ((Get-Date).AddDays($EventlogAge))}} #| select TimeCreated, Id, Message, MachineName
        $HyperVNode = $events.MachineName
 
        $obj = foreach ($event in $eventsnormal) {  
            If ($event.id -eq 20417) {
                $Level = "Critical"
            } Else {
                $Level = "Normal"
            }
 
            $EventVM = $event.properties.value[0]
            $EventVMID = $event.properties.value[1]
            $EventBlackoutTime = $event.properties.value[2]
            $HyperVNode = $event.MachineName
            $TimeCreated = $event.TimeCreated
 
            [PSCustomObject]@{
                VMName = $EventVM
                BlackoutTime = $EventBlackoutTime
                VMID = $EventVMID
                HyperVNode = $HyperVNode
                TimeCreated = $TimeCreated
                Level = $Level
            }
        }
        $obj | Sort-Object -Descending $Sortby 
    }
}


Blackout-Time per PowerShell-Skript abfragen (V4)

<#
 
.SYNOPSIS
Für Troubleshooting-Zwecke von Blackout-Zeiten während Live-Migrationen
 
.DESCRIPTION
Mit diesem Skript kann man alle Blackout-Zeiten während Live-Migrationen innerhalb eines Cluster filtern.
 
.NOTES
Author: Robin Hermann
 
.LINK
http://wiki.webperfect.ch
 
 
.EXAMPLE
Get-LiveMigrationBlackoutTime -Cluster <ClusterName> -EventLogAge -7
Dieses Beispiel zeigt alle Blackout-Zeiten während Live-Migrationen der letzten 7 Tage an.
 
#>
 
 
Function Get-LiveMigrationBlackoutTime {
    [CmdletBinding()]
 
    param(
        [Parameter(Position=0,mandatory=$true)][string] $Cluster,
        [Parameter(Position=1,mandatory=$true)][int] $EventlogAge,
        [ValidateSet("VMName", "BlackoutTime","TimeCreated")]
	    [String]$Sortby = "BlackoutTime"
    )
 
    process{
        $ErrorActionPreference = "SilentlyContinue"
 
        $eventsnormal = (Get-ClusterNode -Cluster $Cluster).Name | foreach {Get-WinEvent -ComputerName $_ -FilterHashtable @{LogName = 'Microsoft-Windows-Hyper-V-VMMS-Admin'; ID = 20415; StartTime = ((Get-Date).AddDays($EventlogAge))}} | select TimeCreated, Id, Message, MachineName
        $eventscritical = (Get-ClusterNode -Cluster $Cluster).Name | foreach {Get-WinEvent -ComputerName $_ -FilterHashtable @{LogName = 'Microsoft-Windows-Hyper-V-VMMS-Admin'; ID = 20417; StartTime = ((Get-Date).AddDays($EventlogAge))}} | select TimeCreated, Id, Message, MachineName
 
        $HyperVNode = $events.MachineName
 
        $BOReport = @()
 
        foreach ($event in $eventsnormal) {
            $EventMessageVM = $event.message -replace  ".*\'(.*)\'.*blackout time of (.+) seconds \(VMID (.*)\).", '$1'
            $EventMessageBlackoutTime = $event.message -replace ".*\'(.*)\'.*blackout time of (.+) seconds \(VMID (.*)\).", '$2'
            $EventMessageVMID = $event.message -replace ".*\'(.*)\'.*blackout time of (.+) seconds \(VMID (.*)\).", '$3'
            $HyperVNode = $event.MachineName
            $TimeCreated = $event.TimeCreated
            $Level = "Normal"
 
            $obj = New-Object -TypeName PSObject
            $obj | Add-Member -MemberType NoteProperty -Name VMName -Value $EventMessageVM
            $obj | Add-Member -MemberType NoteProperty -Name BlackoutTime -Value $EventMessageBlackoutTime
            $obj | Add-Member -MemberType NoteProperty -Name VMID -Value $EventMessageVMID
            $obj | Add-Member -MemberType NoteProperty -Name HyperVNode -Value $HyperVNode
            $obj | Add-Member -MemberType NoteProperty -Name TimeCreated -Value $TimeCreated
            $obj | Add-Member -MemberType NoteProperty -Name Level -Value $Level
            $BOReport += $obj
        }
 
         foreach ($event in $eventscritical) {
            $EventMessageVM = $event.message -replace  ".*\'(.*)\'.*blackout time of (.+) seconds \(VMID (.*)\).", '$1'
            $EventMessageBlackoutTime = $event.message -replace ".*\'(.*)\'.*blackout time of (.+) seconds \(VMID (.*)\).", '$2'
            $EventMessageVMID = $event.message -replace ".*\'(.*)\'.*blackout time of (.+) seconds \(VMID (.*)\).", '$3'
            $HyperVNode = $event.MachineName
            $TimeCreated = $event.TimeCreated
            $Level = "Critical"
 
            $obj = New-Object -TypeName PSObject
            $obj | Add-Member -MemberType NoteProperty -Name VMName -Value $EventMessageVM
            $obj | Add-Member -MemberType NoteProperty -Name BlackoutTime -Value $EventMessageBlackoutTime
            $obj | Add-Member -MemberType NoteProperty -Name VMID -Value $EventMessageVMID
            $obj | Add-Member -MemberType NoteProperty -Name HyperVNode -Value $HyperVNode
            $obj | Add-Member -MemberType NoteProperty -Name TimeCreated -Value $TimeCreated
            $obj | Add-Member -MemberType NoteProperty -Name Level -Value $Level
            $BOReport += $obj
        }
 
        $BOReport | Sort-Object -Descending $Sortby | Format-Table
    }
}