ChatGPT解决这个技术问题 Extra ChatGPT

如何在 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。

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

B
Brad Solomon

您可以使用 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 的回答奏效了。
M
Matt

更容易:

sysctl -n hw.ncpu

这个报告的数字实际上是内核数量的两倍,因为您的处理器支持超线程。
这给了我 4,但是当我使用 system_profiler SPHardwareDataType 时,我可以相信`型号标识符:MacBookPro9,2 处理器名称:英特尔酷睿 i5 处理器速度:2.5 GHz 处理器数量:1 内核总数:2`
F
Frozen Flame

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

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

有点慢但有效。


a
adrin

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 的情况下是否在工作吗?
@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、内核、线程。
t
tbodt

要在 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:本次引导可用的最大逻辑处理器数。


迈克,感谢您的编辑,没有意识到 oldplen 是一个输入输出参数。
k
kent
$ system_profiler | grep 'Total Number Of Cores'

更快: $ system_profiler SPHardwareDataType | grep '核心总数'
如果你包括打字时间,速度会更慢
它在 bash 脚本中;打字时间无关紧要。
看起来 Apple 已经改变了输出的格式。注意大写:以前是“总核数”现在是“总核数”……或者我之前打错了……抱歉!
你可以使用 grep -i
P
Pere Joan Martorell

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

$ getconf _NPROCESSORS_ONLN
12

C
Community

使用 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 核还不错。


产生与逻辑内核数量相等的进程数量(如您所指出的,在超线程的情况下是物理内核数量的两倍)对我来说执行得非常好。
T
Tohid

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

system_profiler SPHardwareDataType

目标是确定使用 make 产生多少进程,因此 jkp 的答案(逻辑核心数)最适合。
a
asmaier

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

$ sysctl -a | sort | grep cpu

很好,但不是问什么。
R
Ryan Parman

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

对于偶然发现此问题的未来开发人员,只要存在安装 Homebrew 的假设(或要求)(例如,在公司的工程组织中),nproc 就是包含在coreutils 包。

brew install coreutils

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


M
Mark

对以上 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


我还得到了 6 核 2018 英特尔 Mac Mini 上 X_per_package 的看似无意义的值:machdep.cpu.logical_per_package: 16 machdep.cpu.cores_per_package: 8 machdep.cpu.core_count: 6 machdep.cpu.thread_count: 6
i
iconoclast

澄清

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

处理优胜美地漏洞的更新

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

这里给出的所有其他答案

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

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

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
n
nbro

在运行 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 也可以代替读取所有其他不必要的信息。
J
Jay Taylor

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

$ nproc --all
32

兼容 macOS 和 Linux。


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