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

当你运行Mac OS X时,你如何从命令行得知机器上有多少核?在Linux上,我使用:

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

虽然不完美,但已经很接近了。它的目的是被传递给make,这就是为什么它给出的结果比实际数字高1。我知道上面的代码可以用Perl写得更密集,也可以用grep、wc和cut来写,但我认为上面的代码是简洁和可读性之间的一个很好的折衷。

澄清一下:我问的是有多少个逻辑核可用,因为这对应于我想要make生成多少个同时存在的作业。jkp的答案,由Chris Lloyd进一步完善,是我所需要的。YMMV。

232374 次浏览
$ system_profiler | grep 'Total Number Of Cores'

你可以使用sysctl实用程序来做到这一点:

sysctl -n hw.ncpu

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

system_profiler SPHardwareDataType

更简单:

sysctl -n hw.ncpu

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

[~] system_profiler SPHardwareDataType
Hardware:


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
[~]

但是sysctl似乎是正确的,因为当我运行一个应该占用所有CPU插槽的程序时,我看到这个程序占用了接近800%的CPU时间(在top中):

PID   COMMAND      %CPU
4306  top          5.6
4304  java         745.7
4296  locationd    0.0

使用system_profiler | grep "Cores"命令。

我有一个:

MacBook Pro Retina, 2012年年中。

处理器:2.6 GHz英特尔酷睿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)没有8个物理核心的Core i7,所以超线程的想法必须是这样的。忽略sysctl,使用system_profiler值来保证准确性。真正的问题是,您是否能够有效地运行具有4核的应用程序(长编译作业?)而不中断其他进程。

运行4核并行编译器似乎不会显著影响常规操作系统。所以,把它当作8核来处理也不是那么糟糕。

< em > < / em >澄清

当这个问题被问到时,OP并没有说他想要的是< em >逻辑< / em >核数而不是实际核数,所以这个答案在逻辑上(没有双关的意思)回答了一种获得真实物理核的实际数的方法,而不是操作系统试图通过超线程巫术虚拟化的数字。

更新处理约塞米蒂的缺陷

由于OS X Yosemite(可能还有更新的版本,比如即将到来的El Capitan)中有一个奇怪的错误,我做了一个小修改。(如果忽略STDERR,旧版本仍然工作得很好,这是所有修改为您做的。)


这里的其他答案也一样

  1. 给出不正确的信息
  2. 由于命令实现中的错误,不提供任何信息
  3. 运行速度慢得令人难以置信(需要一分钟的大部分才能完成),或者
  4. 给出了太多的数据,因此可能对交互使用有用,但如果你想以编程方式使用数据(例如,作为bundle install --jobs 3之类命令的输入,你希望3的数字比你拥有的核数少1,或至少不超过核数),则是无用的。

可靠、正确、合理、快速地获得核数的方法是这样的,而且答案周围没有额外的信息,甚至没有额外的字符:

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

要在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);

用来代替计算核数的" h.l ogicalcpu"的有趣值是(from 内核源代码中的此注释):

  • hw.ncpu:此引导可使用的最大处理器数。

    使用此值来调整每个处理器数组的静态大小;即处理器负载统计信息。

  • hw.activecpu:当前可用于执行线程的处理器数量。

    使用这个数字可以确定在支持SMP的应用程序中创建的线程数。

    当电源管理模式改变时,这个数字也会改变。

  • hw.physicalcpu:当前电源管理模式下可用的物理处理器数量。

  • hw.physicalcpu_max:本次引导可使用的最大物理处理器数。

  • hw.logicalcpu:当前电源管理模式下可用的逻辑处理器数量。

  • hw.logicalcpu_max:此引导可使用的最大逻辑处理器数。

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

sysctl -a | grep machdep.cpu

特别是,对于具有HyperThreading (HT)的处理器,您将看到枚举的总CPU计数(logical_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英特尔酷睿i7),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

这应该是跨平台的。至少在Linux和Mac OS X上是这样。

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

虽然有点慢,但还是有用的。

下面的命令提供了关于CPU的所有信息

$ sysctl -a | sort | grep cpu

这可以通过一种更便携的方式来实现:

$ nproc --all
32

兼容macOS和Linux操作系统。

在最初的问题中没有指定(尽管我在评论中看到OP post说这不是一个选项),但是macOS上的许多开发人员安装了Homebrew包管理器。

对于未来偶然遇到这个问题的开发人员,只要安装Homebrew的假设(或要求)存在(例如,在公司的工程组织中),nproc是包含在coreutils包中的常见GNU二进制文件之一。

brew install coreutils

如果你有脚本,你更喜欢写一次(Linux + macOS)而不是两次,或者避免有if块,你需要检测操作系统,知道是否调用nproc vs sysctl -n hw.logicalcpu,这个五月是一个更好的选择。

getconf在Mac OS X和Linux中都可以工作,以防你需要它与这两个系统兼容:

$ getconf _NPROCESSORS_ONLN
12