如何在Mac OS X上发现*逻辑*内核的数量?

从命令行可以看出,当你运行Mac OS X时,机器上有多less核心? 在Linux上,我使用:

x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo) 

这不是完美的,但它很接近。 这是为了得到喂养,这就是为什么它给出了比实际数字高1的结果。 而且我知道上面的代码可以在Perl中写得更密,也可以使用grep,wc和cut来编写,但是我认为上述代码在简洁性和可读性之间是一个很好的折衷。

非常晚的编辑:只是为了澄清:我问有多less逻辑核心可用,因为这对应于我想要产生多less个同时工作。 jkp的答案,由克里斯·劳埃德进一步完善, 正是我所需要的。 因人而异。

您可以使用sysctl实用程序来执行此操作:

sysctl -n hw.ncpu

更简单:

 sysctl -n hw.ncpu 

要在C中执行此操作,可以使用sysctl(3)系列函数:

 int count; size_t count_len = sizeof(count); sysctlbyname("hw.logicalcpu", &count, &count_len, NULL, 0); fprintf(stderr,"you have %i cpu cores", count); 

有趣的值来代替核心​​“hw.logicalcpu”,是:

 hw.physicalcpu - The number of physical processors available in the current power management mode. hw.physicalcpu_max - The maximum number of physical processors that could be available this boot. hw.logicalcpu - The number of logical processors available in the current power management mode. hw.logicalcpu_max - The maximum number of logical processors that could be available this boot. 

这应该是跨平台的。 至less对于Linux和Mac OS X.

 python -c 'import multiprocessing as mp; print(mp.cpu_count())' 

有点慢,但工作。

 $ system_profiler | grep 'Total Number Of Cores' 

system_profiler SPHardwareDataType显示我有1个处理器和4个内核。

[〜] system_profiler SPHardwareDataType硬件:

 Hardware Overview: Model Name: MacBook Pro Model Identifier: MacBookPro9,1 Processor Name: Intel Core i7 Processor Speed: 2.6 GHz Number of Processors: 1 Total Number of Cores: 4 <snip> 

[〜]

但是,sysctl不同意:

[〜] sysctl -n hw.logicalcpu 8 [〜] sysctl -n hw.physicalcpu 4 [〜]

但是,当我运行一个应占用所有CPU插槽的程序时,sysctl看起来是正确的,我看到这个程序接近CPU时间的800%(在上面):

PID命令%CPU
4306顶部5.6
4304 java 745.7 4296定位0.0

正如jkp在评论中所说的那样,并不显示物理内核的实际数量。 要获取物理内核的数量,可以使用以下命令:

 system_profiler SPHardwareDataType 

使用system_profiler | grep "Cores" system_profiler | grep "Cores"命令。

我有一个:

MacBook Pro Retina,2012年中。

处理器:2.6 GHz Intel Core i7

 user$ system_profiler | grep "Cores" Total Number of Cores: 4 

 user$ sysctl -n hw.ncpu 8 

根据维基百科( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 )的说法,Core i7没有8个物理内核,所以超线程的想法一定是这样。 忽略sysctl并使用system_profiler值来确保准确性。 真正的问题是,是否可以在不中断其他进程的情况下有效地运行4核(长编译作业?)的应用程序。

运行一个与4核并行的编译器似乎不会显着影响正常的操作系统操作。 所以也许把它当作8核心并不是那么糟糕。

运行MavericksMacBook Pro上sysctl -a | grep hw.cpu sysctl -a | grep hw.cpu只会返回一些神秘的细节。 machdep.cpu部分显示了更详细和可访问的信息,即:

 sysctl -a | grep machdep.cpu 

特别是对于具有HyperThreading (HT)的处理器,您会看到枚举的CPU总数( logical_per_package )是物理核心数( cores_per_package )的cores_per_package

 sysctl -a | grep machdep.cpu | grep per_package 

上面2条好评如下:

1)重新接受jkp:hw.ncpu的答复(和评论)显然是弃用hw.logicalcpu( https://ghc.haskell.org/trac/ghc/ticket/8594

2)Karl Ehr的2014年更新:在我的电脑(2.5 GHz intel Core i7)上, sysctl -a | grep machdep.cpu | grep per_package sysctl -a | grep machdep.cpu | grep per_package sysctl -a | grep machdep.cpu | grep per_package返回不同的数字:

machdep.cpu.logical_per_package:16

machdep.cpu.cores_per_package:8

期望的值是:

machdep.cpu.core_count:4

machdep.cpu.thread_count:8

哪匹配:

hw.physicalcpu:4

hw.logicalcpu:8

澄清

当询问这个问题时,OP没有说他想要的是LOGICAL核心的数量而不是实际的核心数量,所以这个逻辑上的回答(没有双关语意思)用一种方法来获得实际物理核心的实际数量,而不是操作系统试图通过超线程巫术虚拟化的数量。

更新处理YOSEMITE中的漏洞

由于OS X优胜美地(以及可能更新的版本,如即将到来的埃尔卡皮坦)奇怪的错误 ,我做了一个小的修改。 (如果你忽略了STDERR,那么旧版本仍然工作得很好,这是所有修改都适合你的。)


在这里给出的每一个其他答案

  1. 给出不正确的信息
  2. 由于命令实现中的错误,没有提供任何信息
  3. 运行速度令人难以置信的缓慢(花费更多的时间来完成),或者
  4. 提供了太多的数据,因此可能对交互式使用非常有用,但如果要以编程方式使用数据(例如,作为bundle install --jobs 3命令的inputbundle install --jobs 3 ,而您希望数字代替3比你拥有的核心数less一个,或者至less不超过核心数)

只有核心数量可靠,正确,合理快速地得到,而且没有额外的信息甚至额外的答案,这个方法是这样的:

 system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '