问题示例:
Measure-Command { Get-VMSwitch -SwitchType "External" }
Windows 2012和2016具有相同的硬件,CPU负载约为50%
Windows Server 2016(3个外部交换机)
Days : 0
Hours : 0
Minutes : 0
Seconds : 6
Milliseconds : 377
Ticks : 63779086
TotalDays : 7.38183865740741E-05
TotalHours : 0.00177164127777778
TotalMinutes : 0.106298476666667
TotalSeconds : 6.3779086
TotalMilliseconds : 6377.9086
Windows Server 2012R2(3个外部交换机)
Days : 0
Hours : 0
Minutes : 0
Seconds : 1
Milliseconds : 376
Ticks : 13762494
TotalDays : 1.59288125E-05
TotalHours : 0.0003822915
TotalMinutes : 0.02293749
TotalSeconds : 1.3762494
TotalMilliseconds : 1376.2494
具有更大或相等CPU负载的Windows 2012R2快6倍。
Windows Server 2016(9个外部交换机)
Days : 0
Hours : 0
Minutes : 1
Seconds : 6
Milliseconds : 168
Ticks : 661689307
TotalDays : 0.000765844105324074
TotalHours : 0.0183802585277778
TotalMinutes : 1.10281551166667
TotalSeconds : 66.1689307
TotalMilliseconds : 66168.9307
Windows 2016变慢48倍! :)
在Windows 2016中,熔化/幽灵修复程序被禁用。
在Windows 2016中是否有提高Powershell命令性能的选项?
谢谢。
答案 0 :(得分:1)
好吧,我找到了另一个解决方案。它正在通过WMI使用瓶颈。 WMI msvm-ethernetswitchport 类可以提供所有VMSwitches元素,在这里我们已经可以获得Powershel CMD Get-VMSwitch 提供的相同信息。
https://docs.microsoft.com/en-us/windows/desktop/hyperv_v2/msvm-ethernetswitchport等
一个简单的例子:
ManagementScope scope = new ManagementScope("\\\\.\\ROOT\\virtualization\\v2");
ObjectQuery query = new ObjectQuery("SELECT * FROM Msvm_EthernetSwitchPort");
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(scope, query);
ManagementObjectCollection queryCollection = searcher.Get();
foreach (ManagementObject m in queryCollection)
{
Console.WriteLine("DeviceID : {0}", m["DeviceID"]);
Console.WriteLine("ElementName : {0}", m["ElementName"]);
}
可悲的是Windows 2016中的PowerShell运行如此缓慢...
实际上,通过WMI,有很多选择方式来获取此数据。
https://docs.microsoft.com/en-us/windows/desktop/hyperv_v2/hyper-v-networking-api