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

Mik*_*one 368 macos makefile

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

x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo)
Run Code Online (Sandbox Code Playgroud)

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

非常晚编辑:只是为了澄清:我问有多少逻辑核可用,因为这与我想要make产生多少个同时工作相对应.jkp的答案,由Chris Lloyd进一步完善,正是我所需要的.因人而异.

jkp*_*jkp 772

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

__CODE__

  • 如果你真的关心,尝试`sysctl的hw.physicalcpu`或`sysctl的hw.logicalcpu`,和一般的sysctl`为hw`所有的选项. (138认同)
  • 编者:请在接受之后多年不要改变答案. (21认同)
  • @JoshuaFlanagan机器有多少个物理核心,它是什么芯片?例如,如果它是具有2个物理内核的核心i7,它将显示为4,因为该芯片支持超线程并且将自身呈现给操作系统,就像它具有4个可寻址内核一样. (12认同)
  • 在2011年中期的1.7GHz MacBook Air上,这个命令说明了4.然而,我怀疑它实际上只有2个内核,而system_profiler SPHardwareDataType似乎同意.你能解释一下这个差异吗? (6认同)
  • 无法在运行El Capitan的2015年初Mac上运行。我收到“错误:“ hw.ncpu”是未知密钥”。/etc/sysctl.conf中也没有与cpu相关的条目。冰封烈焰的答案奏效了。 (2认同)

mlb*_*ght 129

更简单:

sysctl -n hw.ncpu
Run Code Online (Sandbox Code Playgroud)

  • 这给了我4,但是当我使用`system_profiler SPHardwareDataType`我可以相信`模型标识符:MacBookPro9,2处理器名称:Intel Core i5处理器速度:2.5 GHz处理器数量:1总核心数:2 (3认同)
  • 报告的数字实际上是处理器支持超线程的核心数量的两倍. (2认同)

Fro*_*ame 30

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

python -c 'import multiprocessing as mp; print(mp.cpu_count())'
Run Code Online (Sandbox Code Playgroud)

有点慢,但有效.


Per*_*ell 24

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

$ getconf _NPROCESSORS_ONLN
12
Run Code Online (Sandbox Code Playgroud)

  • 这应该是最重要的答案 - 既可以工作又可以便携。 (5认同)

alf*_*att 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);
Run Code Online (Sandbox Code Playgroud)

用于代替核心的"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.
Run Code Online (Sandbox Code Playgroud)


use*_*991 11

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>
Run Code Online (Sandbox Code Playgroud)

[〜]

但是,sysctl不同意:

[〜] sysctl -n hw.logicalcpu 8 [〜] sysctl -n hw.physicalcpu 4 [〜]

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

PID命令%CPU
4306顶部5.6
4304 java 745.7 4296位置0.0

  • 你看到超线程在工作.这使得每个核心可以处理两个执行线程(不一定与OS线程相同,例如pthread).因此,MacOS将每个物理核心视为两个逻辑核心. (3认同)

ken*_*ent 9

$ system_profiler | grep 'Total Number Of Cores'
Run Code Online (Sandbox Code Playgroud)

  • 如果你包括打字时间,那就慢了 (6认同)
  • 似乎Apple已经改变了输出的格式.注意大写:以前是'核心总数'现在是'核心总数'...或者我之前输错了...对不起! (3认同)
  • 你可以使用`grep -i` (3认同)
  • 更快:$ system_profiler SPHardwareDataType | grep'核心总数' (2认同)
  • 它是一个bash脚本; 打字时间无关紧要. (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)
user$ sysctl -n hw.ncpu
8
Run Code Online (Sandbox Code Playgroud)

根据维基百科(http://en.wikipedia.org/wiki/Intel_Core#Core_i7),没有Core i7具有8个物理内核,因此超线程理念必须如此.忽略sysctl并使用该system_profiler值进行准确性.真正的问题是,您是否可以在不中断其他进程的情况下高效运行具有4个内核(长编译作业?)的应用程序.

运行与4个内核并行化的编译器似乎不会显着影响常规操作系统操作.所以将其视为8核并不是那么糟糕.


Toh*_*hid 7

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

system_profiler SPHardwareDataType
Run Code Online (Sandbox Code Playgroud)


Rya*_*man 7

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

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

brew install coreutils
Run Code Online (Sandbox Code Playgroud)

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


asm*_*ier 5

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

$ sysctl -a | sort | grep cpu
Run Code Online (Sandbox Code Playgroud)