从没有超线程的计算机获取内核总数

时间:2016-09-01 14:30:06

标签: windows processor hyperthreading cpu-cores

这是一个艰难的。

我需要使用命令从我的服务器输出确切数量的内核。

我的测试:

  • X :在具有4个处理器(套接字)的Windows服务器上,每个没有HT的2个核心。
  • Y :在具有2个处理器(套接字)和6个核心的Windows服务器上,每个处理器都带有HT。

GetSystemInfo 只能获得安装的处理器数量:X为4,Y为2。

|                | X: 8 cores  | Y: 12 cores |
|                | 4x2 (no HT) | 2x6 (HT)    |
|----------------|-------------|-------------|
| Desired output | 8           | 12          |
| GetSystemInfo  | 4           | 2           | 

%NUMBER_OF_PROCESSORS%是一个很好的,但需要考虑HT。它告诉我8为X,24为Y(因为它有HT,我需要它显示12)。

|                        | X: 8 cores  | Y: 12 cores |
|                        | 4x2 (no HT) | 2x6 (HT)    |
|------------------------|-------------|-------------|
| Desired output         | 8           | 12          |
| GetSystemInfo          | 4           | 2           | 
| %NUMBER_OF_PROCESSORS% | 8           | 24          |

"wmic cpu get NumberOfCores"获取每个套接字的信息。例如:

X

>wmic cpu get NumberOfCores
NumberOfCores
2
2
2
2

Y:

>wmic cpu get NumberOfCores
NumberOfCores
6
6

含义

|                            | X: 8 cores  | Y: 12 cores |
|                            | 4x2 (no HT) | 2x6 (HT)    |
|----------------------------|-------------|-------------|
| Desired output             | 8           | 12          |
| GetSystemInfo              | 4           | 2           | 
| %NUMBER_OF_PROCESSORS%     | 8           | 24          |
| wmic cpu get NumberOfCores | 2,2,2,2     | 6,6         |

叹息。

我希望在CMD中保持简单,但我正在考虑启动一个Powershell脚本来完成所有数学和事情。

有什么想法吗?

5 个答案:

答案 0 :(得分:1)

如果我理解您的每个服务器的问题,您想要检索一个整数,即物理处理器(核心)的总数。根据超线程是否可用并启用,这可能是逻辑处理器数量的一半,但您特别想要排除这些。

Win32_Processor WMI class的实例代表单个处理器套接字。 NumberOfCores属性表示该套接字提供的物理处理器数。我们可以使用Get-CimInstance cmdlet

在PowerShell中进行查询
Get-CimInstance -ClassName 'Win32_Processor' `
    | Select-Object -Property 'DeviceID', 'Name', 'NumberOfCores';

要为每个NumberOfCores个实例添加Win32_Processor属性,我们可以使用Measure-Object cmdlet

Get-CimInstance -ClassName 'Win32_Processor' `
    | Measure-Object -Property 'NumberOfCores' -Sum;

结果输出Sum将包含物理核心总数,Count将包含套接字总数。

请注意,在旧版本的Windows / PowerShell上,您可能需要将Get-WmiObject cmdlet替换为Get-CimInstance。此外,如果您确实希望获得逻辑(超线程)处理器的数量,则可以将NumberOfLogicalProcessors属性替换为NumberOfCores

答案 1 :(得分:1)

您可以使用Get-ComputerInfo并将范围设置为所需的属性。

$processor = Get-ComputerInfo -Property CsProcessors
$processor.CsProcessors

这应该给你类似的东西

Name                      : Intel(R) Core(TM) i7-6600U CPU @ 2.60GHz
Manufacturer              : GenuineIntel
Description               : Intel64 Family 6 Model 78 Stepping 3
Architecture              : x64
AddressWidth              : 64
DataWidth                 : 64
MaxClockSpeed             : 2808
CurrentClockSpeed         : 2607
NumberOfCores             : 2 <== that one
NumberOfLogicalProcessors : 4 
…
…

然后,只需在结果中寻找NumberOfCores

答案 2 :(得分:0)

如果我理解正确的话,这个vbscript会给你们两个。 Powershell方法 - https://blogs.technet.microsoft.com/heyscriptingguy/2011/09/26/use-powershell-and-wmi-to-get-processor-information/

On Error Resume Next

Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20

Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Processor", "WQL",wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each objItem In colItems
  WScript.Echo "NumberOfCores: " & objItem.NumberOfCores
  WScript.Echo "NumberOfLogicalProcessors: " & objItem.NumberOfLogicalProcessors
Next

如果服务器包含多个物理处理器,Powershell可能会提供更好的报表布局。

Get-WmiObject –class Win32_processor | ft systemname,Name,DeviceID,NumberOfCores,NumberOfLogicalProcessors

答案 3 :(得分:0)

建议的命令在具有64个以上逻辑核心的计算机上不起作用

shape

提供逻辑核(HT核)的数量

答案 4 :(得分:0)

晚于聚会,但这将作为完整的DOS解决方案

set val=0 & for /f  "tokens=2 delims==" %d in ('wmic cpu get NumberOfCores /value ^| findstr "="') do @set /A val+=%d >NUL
  • set val=0初始化变量
  • wmic cpu get NumberOfCores /value以列表格式检索值,更易于解析。 wmic在其输出中有很多空白行。列表格式为我们提供了一个要过滤的公共字符=。因此,^| findstr "="。逃脱了管道,使其被for而不是外壳本身捕获。
  • set /A允许进行计算,这里是所有找到的值的总和。此命令还将输出其结果,从而输出NUL重定向。

因此,在X上您得到val = 8,在Y上您得到val = 12