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

Posted

技术标签:

【中文标题】如何在 Mac OS X 上发现*逻辑*核心的数量?【英文标题】:How to discover number of *logical* cores on Mac OS X? 【发布时间】:2010-12-15 11:51:06 【问题描述】:

当您运行 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。

【问题讨论】:

对于 linux,我避免通过使用添加一个:grep ^processor /proc/cpuinfo | wc -l 参见***.com/questions/6481005/… 注意nproc 命令。 很抱歉,如果这是一个菜鸟问题,但是当您指的是逻辑核心时,您是指物理核心吗?这些术语有何不同(或不同)?只是为了更好地了解您的要求。 不,我指的不是物理内核。物理内核是芯片上实现内核的一组晶体管。逻辑核心似乎是操作系统和用户程序的核心。在绝大多数情况下,这些都是相同的。但是,英特尔的超线程技术(可能还有其他技术)使每个物理内核都显示为两个逻辑内核。 作为一个仅供参考,现在在 Linux 上,nproc 实用程序是查找此信息的首选方法,而不是尝试计算处理器信息。 nproc 可让您找出总内核数和进程允许生成的最大值。有时这是一个重要的区别。 【参考方案1】:

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

sysctl -n hw.ncpu

【讨论】:

在 2011 年中的 1.7GHz MacBook Air 上,此命令显示 4。但是,我怀疑它真的只有 2 个内核,并且 system_profiler SPHardwareDataType 似乎同意。你能解释一下差异吗? @JoshuaFlanagan 这台机器有多少物理内核,是什么芯片?例如,如果它是具有 2 个物理内核的 i7 内核,它将显示为 4,因为该芯片支持超线程并将其自身呈现给操作系统,就好像它具有 4 个可寻址内核一样。 如果您真的在乎,请尝试sysctl hw.physicalcpusysctl hw.logicalcpu,一般情况下sysctl hw 可以选择所有选项。 编辑:请不要在我接受答案多年后更改答案。 不适用于运行 El Capitan 的 2015 年初 Mac。我收到“错误:“hw.ncpu”是未知密钥”。 /etc/sysctl.conf 中也没有与 cpu 相关的条目。 Frozen Flame 的回答奏效了。【参考方案2】:

更简单:

sysctl -n hw.ncpu

【讨论】:

这个报告的数字实际上是核心数的两倍是你的处理器支持超线程。 这给了我 4,但是当我使用 system_profiler SPHardwareDataType 时,我可以相信` 型号标识符:MacBookPro9,2 处理器名称:英特尔酷睿 i5 处理器速度:2.5 GHz 处理器数量:1 总数核心:2`【参考方案3】:

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

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

有点慢,但可以。

【讨论】:

【参考方案4】:

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  

【讨论】:

您正在看到超线程在起作用。这让每个内核处理两个执行线程(不一定与操作系统线程相同,例如 pthreads)。因此,MacOS 将每个物理核心视为两个逻辑核心。 你好@MikeDeSimone,你能告诉我如何检查 CentOS 的超线程是否在工作吗? ***.com/questions/2901694/… @Ciastopiekarz 我相当肯定超线程是 CPU 架构(英特尔)的一个特性,而不是操作系统所做的,我认为重点是让操作系统认为它具有物理 cpu:sx 2 个逻辑核心,无需执行任何特殊操作即可访问它们。因此,如果您的 CPU 是 Intel(所有 Mac 都配备 Intel),那么是的,您拥有超线程。但是,如果您在 PC 上运行 CentOS,您可能拥有 AMD 处理器。它们没有超线程,但由于它们通常以相同(或更低)的价格提供两倍的内核,我不确定是否存在实际差异。 @Erk 操作系统知道区别,实际上,它知道 CPU 和内核之间的区别以及在物理上运行的多个线程。 sysctl hw.physicalcpu 将显示有多少物理 cpu 内核可供您使用,sysctl hw.logicalcpu 将显示有多少逻辑 cpu 可供您使用。像 Windows/OSX/Linux 这样的操作系统所做的所有工作都是让你看起来有多个 CPU(不管它是什么类型的)。像 linux 这样的操作系统允许您配置可以使用的 cpu、内核、线程。【参考方案5】:

要在 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”的有趣值是(来自this comment in the kernel source):

hw.ncpu:本次引导可用的最大处理器数。

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

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

使用此数字确定要在 SMP 感知应用程序中创建的线程数。

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

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

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

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

hw.logicalcpu_max:本次引导可用的最大逻辑处理器数。

【讨论】:

Mike,感谢您的编辑,没有意识到 oldplen 是一个输入输出参数。【参考方案6】:
$ system_profiler | grep 'Total Number Of Cores'

【讨论】:

更快:$ system_profiler SPHardwareDataType | grep '核心总数' 如果包括打字时间会变慢 在 bash 脚本中;打字时间无关紧要。 苹果似乎改变了输出的格式。注意大写:以前是“总核数”现在是“总核数”……或者我之前打错了……抱歉! 你可以使用grep -i【参考方案7】:

使用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 个内核的并行编译器似乎不会显着影响常规操作系统操作。所以也许把它当成 8 个核心来处理也不错。

【讨论】:

产生的进程数量等于 逻辑 核心的数量(如您所见,在超线程的情况下是物理核心数量的两倍)对我来说执行得很好.【参考方案8】:

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

system_profiler SPHardwareDataType

【讨论】:

目标是确定使用make 生成多少进程,因此 jkp 的答案(逻辑核心数)最适合。【参考方案9】:

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

$ sysctl -a | sort | grep cpu

【讨论】:

很好,但不是问的。【参考方案10】:

getconf 适用于 Mac OS X 和 Linux,以防万一您需要它与这两个系统兼容:

$ getconf _NPROCESSORS_ONLN
12

【讨论】:

【参考方案11】:

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

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

brew install coreutils

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

【讨论】:

【参考方案12】:

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

$ nproc --all
32

兼容 macOS 和 Linux。

【讨论】:

nproc 在 macOS Mojave 上似乎不可用。 感谢您让我知道,迈克。 nproc 是通过自制软件进行的简单安装。 我运行的系统与互联网断开连接,所以自制软件没有帮助。不能使用任何需要“curl site | sudo bash”的东西【参考方案13】:

澄清

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

更新以处理 YOSEMITE 中的缺陷

由于 OS X Yosemite(以及可能更新的版本,例如即将推出的 El Capitan)中有一个奇怪的 bug,我做了一个小的修改。 (如果您忽略 STDERR,旧版本仍然可以正常工作,这就是您所做的所有修改。)


这里给出的所有其他答案都是

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

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

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

【讨论】:

我刚刚在我的 Mac Pro 上运行了 sysctl -n hw.ncpu 并且没有这些问题。 我显然没有在所有类型的 Mac 上进行测试,但我相信它有时是准确的。但是,sysctl 在我的机器上没有给出准确的结果,其他人也报告了同样的事情。如果不能依赖它总是给出准确的结果,那么它就不能被认为是可靠和准确的。 您还可以解释您看到的错误行为,以及您在哪个平台上看到它,因此sysctl 正确操作的范围更广为人知,就像 user1706991 所做的那样。跨度> 其他人认为这是由于超线程造成的,因此您使用 sysctl 看到的数字是系统试图模拟的内核数,即使它实际上并没有那么多。如果您想要准确的数字,请使用我的方法。如果您想知道计算机假装有多少个内核,请使用 sysctl。 @iconoclast 在测试中我发现“核心总数”已本地化。如果 OS X 设置为除英语以外的任何内容,则您的解决方案将失败。最终使用:sysctl -n hw.physicalcpu_max【参考方案14】:

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

【讨论】:

在我 2008 年初的 Mac Pro 上,这给了我 4 个。实际的内核数是 8,因为它有两个四核 CPU 芯片。 sysctl machdep.cpu 也可以代替读取所有其他不必要的信息。【参考方案15】:

评论以上 2 条好评:

1) 重新接受 jkp 的回复(和 cmets):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

【讨论】:

以上是关于如何在 Mac OS X 上发现*逻辑*核心的数量?的主要内容,如果未能解决你的问题,请参考以下文章

如何允许 Python.app 在 Mac OS X 上设置防火墙?

如何在 Mac OS X 上安装 mod_jk

如何在Mac OS X上安装 Ruby运行环境

如何在Mac OS X上安装 Ruby运行环境

如何在Mac OS X Yosemite上安装 jdk 1.6 开发环境

如何 在Mac OS X 上的 Appium 上 Run *.app 文件