Blackout-Time (VM Live Migration): Unterschied zwischen den Versionen
Aus Wiki-WebPerfect
Admin (Diskussion | Beiträge) (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…“) |
Admin (Diskussion | Beiträge) |
||
(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{ | ||
− | $ | + | $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 | ||
− | + | ||
− | $ | + | $BOReport = @() |
− | + | ||
− | + | foreach ($event in $eventsnormal) { | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | foreach ($event in $ | + | |
$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" | ||
− | $ | + | $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 |
} | } | ||
} | } | ||
− | |||
</source> | </source> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | [[Kategorie:PowerShell]] | ||
+ | [[Kategorie:Hyper-V / VMM]] |
Aktuelle Version vom 27. April 2020, 09:15 Uhr
Inhaltsverzeichnis
[Verbergen]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 } }