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


381

在运行Mac OS X时,如何从命令行知道计算机上有多少个内核?在Linux上,我使用:

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

这不是完美的,但是很接近。打算将其馈入make,这就是为什么它得出的结果比实际数字高1的原因。而且我知道上面的代码可以用Perl编写得更密集,也可以使用grep,wc和cut来编写,但是我认为上面的代码在简洁性和可读性之间取得了很好的折衷。

非常晚的编辑:只是为了澄清一下:我要问的是有多少逻辑核可用,因为这与我要make产生的并行作业数相对应。JKP的回答,由克里斯·劳埃德进一步细化,是正是我需要的。YMMV。


对于linux,我避免使用以下命令添加一个:grep ^processor /proc/cpuinfo | wc -l
courtlandj 2014年


抱歉,如果这是一个菜鸟问题,但是当您指的是逻辑核心时,您是指物理核心吗?术语有何不同(或没有不同)?只是为了了解您的要求更好。
查理·帕克

不,我不是说物理核心。物理核心是芯片上实现核心的一组晶体管。逻辑核心似乎是操作系统和用户程序的核心。在绝大多数情况下,这些都是相同的。但是,英特尔的超线程技术(可能还有其他的超线程技术)使每个物理核心看起来像是两个逻辑核心。
Mike DeSimone

Answers:


796

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

sysctl -n hw.ncpu

6
在2011年中期的1.7GHz MacBook Air上,该命令显示为4。但是,我怀疑它确实只有2个内核,system_profiler SPHardwareDataType似乎同意。你能解释这个差异吗?
约书亚·弗拉纳根

13
@JoshuaFlanagan机器有多少个物理核心,它是什么芯片?例如,如果它是具有2个物理核心的i7核心,则它将显示为4,因为该芯片支持超线程,并像具有4个可寻址核心一样将自己呈现给OS。
jkp 2011年

142
如果您真的很在意,请尝试sysctl hw.physicalcpusysctl hw.logicalcpu,通常sysctl hw选择所有选项。
可变长度编码器

23
编辑:请在我接受答案后的几年内不要更改答案。
Mike DeSimone 2014年

2
无法在运行El Capitan的2015年初Mac上运行。我收到“错误:“ hw.ncpu”是未知密钥”。/etc/sysctl.conf中也没有与cpu相关的条目。冰封烈焰的答案奏效了。
TheGT

130

更简单:

sysctl -n hw.ncpu

2
由此报告的数量实际上是处理器支持超线程的内核数量的两倍。
mikeazo 2014年

3
这给了我4,但是当我使用时system_profiler SPHardwareDataType,我可以相信`型号标识符:MacBookPro9,2处理器名称:Intel Core i5处理器速度:2.5 GHz处理器数量:1内核总数:2`
Ciasto piekarz

31

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

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

有点慢,但可以。


18

为此,您可以使用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.

Mike,感谢您的编辑,没有意识到oldplen是一个in-out参数。
2015年

14

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  

3
您会看到超线程在起作用。这使每个内核可以处理两个执行线程(不一定与OS线程相同,例如pthread)。结果,MacOS将每个物理核心视为两个逻辑核心。
Mike DeSimone 2013年

您好@MikeDeSimone您能告诉我如何在CentOS情况下检查超线程是否在工作吗?
Ciasto piekarz 2014年


@Ciastopiekarz我相当确定超线程是CPU体系结构(英特尔)的功能,而不是OS的功能,我认为重点是使OS认为它具有物理cpu:sx 2个逻辑核心,而无需执行任何操作特殊访问它们。因此,如果您的CPU是Intel(所有Mac都随附Intel),那么可以,您就拥有超线程。但是,如果您在PC上运行CentOS,则可能有AMD处理器。它们没有超线程,但是由于它们通常以相同(或更低)的价格提供两倍的内核,因此我不确定是否存在实际差异。
Erk 2016年

@Erk操作系统知道差异,实际上,它知道CPU与核心之间的差异以及物理上运行的多个线程。 sysctl hw.physicalcpu将显示您有多少物理CPU内核,sysctl hw.logicalcpu将显示有多少逻辑CPU。像Windows / OSX / Linux这样的OS都可以使您看起来好像拥有多个CPU(不管它是什么类型)都可以完成所有工作。像linux这样的OS允许您配置可以使用的cpu,内核,线程。
拉希

10
$ system_profiler | grep 'Total Number Of Cores'

2
更快:$ system_profiler SPHardwareDataType | grep的“总核心数”
肯特

6
但是,如果您加上打字时间,则速度会变慢
High Performance Mark

2
它在bash脚本中;打字时间无关紧要。
Mike DeSimone

3
苹果似乎已经更改了输出格式。请注意大写:以前是“内核总数”,现在是“内核总数”……或者是我以前打错了……对此感到抱歉!
肯特,

3
您可以使用grep -i
Skylar Saveland 2013年

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

根据Wikipedia(http://en.wikipedia.org/wiki/Intel_Core#Core_i7)的介绍,不存在具有8个物理内核的Core i7,因此必须采用超线程思想。忽略sysctl并使用system_profiler值以确保准确性。真正的问题是,您是否可以在不中断其他进程的情况下高效地运行具有4个内核的应用程序(长时间编译作业?)。

运行与4个内核并行的编译器似乎不会显着影响常规OS的运行。因此,也许将其视为8核还不错。


1
对我来说,产生与逻辑核心数量相等的进程数量(在HyperThreading中,物理核心数量是两倍)是非常不错的。
Mike DeSimone 2013年

7

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

system_profiler SPHardwareDataType

目的是确定要使用多少个进程make,因此jkp的答案(逻辑核心数)最合适。
Mike DeSimone


1

澄清说明

当问到这个问题时,OP并没有说他希望使用LOGICAL核的数量,而不是实际的核数,因此该回答在逻辑上(无双关)是通过一种方法来获取实际物理核的实际数量,而不是操作系统尝试通过超线程伏都教进行虚拟化的数量。

更新约塞米蒂的跳蚤

由于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 ' '

3
我只是sysctl -n hw.ncpu在Mac Pro上运行,却没有任何问题。
Mike DeSimone 2014年

我显然没有在所有类型的Mac上进行过测试,但是我相信您有时它是准确的。但是,sysctl在我的机器上没有给出准确的结果,其他人也报告了同样的情况。如果不能始终依靠它来给出准确的结果,那么就不能认为它是可靠和准确的。
iconoclast 2014年

您还可以解释所看到的错误行为以及在其上看到的平台,因此sysctl,如user1706991一样,更好地了解的正确操作范围。
Mike DeSimone 2014年

其他人则认为这是由于超线程导致的,因此,即使实际上实际上没有那么多内核,使用sysctl看到的数字就是系统尝试模拟的内核数。如果您想要准确的数字,请使用我的方法。如果您想知道计算机假装有多少个内核,请使用sysctl。
iconoclast 2014年

@iconoclast在测试中发现“内核总数”已本地化。如果OS X设置为除英语以外的任何语言,则解决方案将失败。最终使用:sysctl -n hw.physicalcpu_max
CO

1

运行MavericksMacBook 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

在我的2008早期Mac Pro上,我得到4。由于它有两个四核CPU芯片,所以实际的内核数是8。
Mike DeSimone 2014年

sysctl machdep.cpu也可以代替读取所有其他不必要的信息。
hsn19年

1

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

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

brew install coreutils

如果您的脚本希望编写一次(对于Linux + macOS)而不是编写两次,或者避免if在需要检测操作系统以知道是否调用nprocvs的地方出现块sysctl -n hw.logicalcpu,这可能是一个更好的选择。


0

以上2条好评的评论:

1)重新接受jkp接受的回复(和评论):hw.ncpu显然已被hw.ologiccpu弃用(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


0

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

$ nproc --all
32

与macOS和Linux兼容。


2
nproc在macOS Mojave上似乎不可用。
Mike DeSimone

谢谢你让我知道,迈克。 nproc是通过自制程序进行的简单安装。
杰伊·泰勒

我正在运行的系统已断开与互联网的连接,因此自制软件无济于事。不能使用任何需要“卷曲站点| sudo bash”的东西
Mike DeSimone19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.