0

我在 TechNet 论坛上问了这个问题,没有任何运气(链接),所以我想看看这里是否有人可能有答案:

在我们公司,我们有一个 VMM 服务器 (SCVMM 2012) 控制两个物理 Hyper-V 主机(我们称它们为 HOST01 和 HOST02)。我试图通过 VMM 服务器上的 PowerShell 查询获取有关 HOST01 的一些信息:

Get-VMHost -ComputerName HOST01

..其中包括返回一些 CPU 信息:

...
LogicalProcessorCount = 12
PhysicalCPUCount = 1
CoresPerCPU = 12
L2CacheSize = 2048
L3CacheSize = 20480
BusSpeed = 100
ProcessorSpeed = 2294
ProcessorModel = Xeon
ProcessorManufacturer = Intel
ProcessorArchitecture = 9
ProcessorFamily = 179
CpuUtilization = 33
...

现在,我碰巧知道 HOST01 运行在具有超线程 *) 的 6 核 CPU 上,所以LogicalProcessorCount = 12是正确的,但我希望看到CoresPerCPU = 6(不是 12)。为什么 VMM 不显示正确的物理内核数?我找错地方了吗?

或者,有没有办法查看主机上是否激活了超线程,所以我可以除以 2 作为最后的手段?

* ) HOST01 是我们自己的测试服务器,所以我已经通过 WMI 单独查询它以获取 CPU 数据,但是在生产环境中,我们不能依赖访问任何东西,除了 VMM 服务器。

4

1 回答 1

3

启用超线程后,每个内核可以获得 2 个逻辑处理器。由于 VMM 只关心逻辑处理器的数量,我怀疑您是否能够从中获取“较低级别”的 CPU 信息。要获取每个 CPU 的实际内核数,您必须通过 WMI 查询处理器信息:

Get-WmiObject Win32_Processor -Computer HOST01 |
    select Name, NumberOfCores, NumberOfLogicalProcessors

编辑:在用户和主机根本无法访问管理程序的情况下,我认为您将无法获得该信息。并非没有对基础架构进行一些更改,也就是说。如果您有人可以为您在 VMM 主机上进行设置,以下可能会提供一种可行的方法。

  1. 通过在 VMM 主机上运行以下脚本的计划任务定期从管理程序收集信息:

    $datafile = 'C:\path\to\data.csv'
    $hypervisors = Get-SCVMHost | select -Expand Name
    Get-WmiObject Win32_Processor -Computer $hypervisors |
        select Name, NumberOfCores | Export-Csv $datafile -NoType -Encoding ASCII
    
  2. 使用 VMM 主机上的自定义 Web 服务器发布数据文件的内容:

    $port       = 8000
    $datafile   = 'C:\path\to\data.csv'
    $lastUpdate = Get-Date 0
    $data       = ''
    
    function Get-Data {
      $filedate = (Get-Item $datafile).LastWriteTime
      if ($filedate -gt $lastUpdate) {
        $script:data = Import-Csv 'C:\Temp\text.csv' | ConvertTo-Json
        $script:lastUpdate = $filedate
      }
      $script:data
    }
    
    If (-not (Test-Path -LiteralPath $datafile)) {
      New-Item -ItemType File -Path $datafile | Out-Null
    }
    
    $listener = New-Object Net.HttpListener
    $listener.Prefixes.Add("http://+:$port/")
    $listener.Start()
    while ($listener.IsListening) {
      $response = $listener.GetContext().Response
      $response.Headers.Add('Content-Type', 'text/plain')
      $buffer = [Text.Encoding]::ASCII.GetBytes((Get-Data))
      $response.ContentLength64 = $buffer.Length
      $response.OutputStream.Write($buffer, 0, $buffer.Length)
      $response.Close()
    }
    $listener.Stop()
    

    如果在 VMM 主机上启用了 Windows 防火墙,则需要在其中打开侦听器端口。

有了它,您可以像这样从服务器或工作站访问数据:

Invoke-WebRequest 'http://vmmserver:8000/' | select -Expand Content |
    ConvertFrom-Json
于 2014-09-22T08:05:40.907 回答