SCVMM 2012下的Hyper-V主机的CPU核心数

时间:2013-11-28 12:36:40

标签: powershell hyper-v system-center

我在TechNet论坛上问了这个问题没有任何运气(link),所以我想我会看到周围的人是否有答案:

在我们公司,我们有一台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服务器之外的任何东西。

1 个答案:

答案 0 :(得分:2)

启用Hyper-Threading后,每个核心可获得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防火墙,则需要在其中打开侦听器端口。

  3. 有了这些,您可以从服务器或工作站访问数据,如下所示:

    Invoke-WebRequest 'http://vmmserver:8000/' | select -Expand Content |
        ConvertFrom-Json