如何在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核心并不是那么糟糕。
在运行Mavericks的MacBook 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,那么旧版本仍然工作得很好,这是所有修改都适合你的。)
在这里给出的每一个其他答案
- 给出不正确的信息
- 由于命令实现中的错误,没有提供任何信息
- 运行速度令人难以置信的缓慢(花费更多的时间来完成),或者
- 提供了太多的数据,因此可能对交互式使用非常有用,但如果要以编程方式使用数据(例如,作为
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 ' '