0

私は TechNet フォーラムでこの質問をしましたが、うまくいきませんでした (リンク)。

当社には、2 つの物理 Hyper-V ホスト (HOST01 および HOST02 と呼びましょう) を制御する VMM サーバー (SCVMM 2012) があります。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。VMM で物理コアの正しい数が表示されないのはなぜですか? 私は間違った場所を探していますか?

または、ホストでハイパースレッディングがアクティブになっているかどうかを確認する方法はありますか?最後の手段として 2 で割ることができますか?

* ) HOST01 は独自のテスト サーバーであるため、WMI を介して個別にクエリを実行して CPU データを取得しましたが、運用環境では、VMM サーバー以外へのアクセスに依存することはできません。

4

1 に答える 1

3

ハイパー スレッディングを有効にすると、コアごとに 2 つの論理プロセッサを取得できます。VMM は論理プロセッサの数しか気にしないので、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 に答える