如何在Mac OS X上发现* logical *核心的数量?

时间:2009-11-11 14:38:57

标签: macos makefile

如何在运行Mac OS X时从命令行了解机器上有多少个核心?在Linux上,我使用:

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

它并不完美,但它很接近。这是为了获取make,这就是为什么它给出比实际数字高1的结果。我知道上面的代码可以用Perl编写,也可以用grep,wc和cut编写,但我认为上面的内容在简洁性和可读性之间是一个很好的权衡。

非常晚编辑:只是为了澄清:我问有多少逻辑核心可用,因为这与我想要的同时工作数相对应{{1} } 产卵。 jkp的答案,由Chris Lloyd进一步完善,完全我需要的东西。 YMMV。

15 个答案:

答案 0 :(得分:752)

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

sysctl -n hw.ncpu

答案 1 :(得分:127)

更容易:

sysctl -n hw.ncpu

答案 2 :(得分:24)

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

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

有点慢,但有效。

答案 3 :(得分:18)

要在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.

答案 4 :(得分:9)

$ system_profiler | grep 'Total Number Of Cores'

答案 5 :(得分:9)

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

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

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

答案 6 :(得分:8)

使用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核并不是那么糟糕。

答案 7 :(得分:7)

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

system_profiler SPHardwareDataType

答案 8 :(得分:4)

原始问题中没有指定它(尽管我在OP的评论中看到这不是一个选择),但是macOS上的许多开发人员都安装了Homebrew软件包管理器。

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

brew install coreutils

如果您有脚本,则希望编写一次(对于Linux + macOS)而不是编写两次,或者避免在需要检测操作系统以知道是否调用{{ 1}}与if,这是一个更好的选择。

答案 9 :(得分:3)

以下命令为您提供有关CPU的所有信息

$ sysctl -a | sort | grep cpu

答案 10 :(得分:1)

<强> 澄清

当问到这个问题时,OP没有说他想要 LOGICAL 核心的数量,而不是实际的核心数量,所以这个答案在逻辑上(没有双关语意)得到了实际物理核心的实际数量的答案,而不是操作系统试图通过超线程伏都教虚拟化的数量。

更新以处理YOSEMITE中的瑕疵

由于OS X Yosemite中的一个奇怪的bug(以及可能的新版本,例如即将推出的El Capitan),我做了一个小修改。 (如果您只是忽略STDERR,那么旧版本仍能很好地工作,这是所有修改都适合您。)


此处给出的其他答案

  1. 提供的信息不正确
  2. 由于命令实现中的错误,
  3. 没有提供任何信息
  4. 运行速度令人难以置信(完成分钟的更好部分)或
  5. 提供了太多数据,因此可能对交互式使用有用,但如果您想以编程方式使用数据(例如,作为bundle install --jobs 3之类的命令的输入,您希望编号到位,则无用3比你所拥有的核心数少一个,或者至少不超过核心数量
  6. 获得核心数量的方法,可靠,正确,合理地快速,并且没有额外的信息甚至是答案的额外字符,是:

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

答案 11 :(得分:1)

在运行Mavericks的 MacBook Pro 上,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

答案 12 :(得分:0)

以上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返回不同的数字:

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

答案 13 :(得分:0)

这可以通过更便携的方式完成:

$ nproc --all
32

与macOS和Linux兼容。

答案 14 :(得分:0)

6.59 ms ± 152 µs per loop 在Mac OS X和Linux中均可使用,以防万一您需要与两个系统兼容的情况:

getconf