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

How to discover number of *logical* cores on Mac OS X?

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

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

它不完美,但很接近。这是为了给make供电,这就是为什么它给出的结果1比实际数字高的原因。我知道上面的代码可以用Perl编写得更密集,也可以用grep、wc和cut编写,但是我认为上面的代码在简洁性和可读性之间是一个很好的折衷。

非常晚的编辑:只是为了澄清:我问有多少个逻辑核心可用,因为这与我希望make生成多少个同步作业相对应。JKP的回答,由Chris Lloyd进一步完善,正是我需要的。YMMV。


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

sysctl -n hw.ncpu


更容易:

1
sysctl -n hw.ncpu


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

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

有点慢,但管用。


要在C中执行此操作,可以使用sysctl(3)系列函数:

1
2
3
4
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"的有趣值是:

1
2
3
4
5
6
7
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.


系统剖析器sphardwaredatatype显示我有1个处理器和4个核心。

[~]系统剖析器sphardwaredatatype硬件:

1
2
3
4
5
6
7
8
9
10
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不同意:

[~]系统控制-n硬件.逻辑计算八[~]系统控制-硬件物理CPU四[~]

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

PID命令%cpu4306前5.64304爪哇745.74296位置d 0.0


1
$ system_profiler | grep 'Total Number Of Cores'


使用system_profiler | grep"Cores"命令。

我有一个:

MacBook Pro Retina, Mid 2012.

Processor: 2.6 GHz Intel Core i7

1
2
user$ system_profiler | grep"Cores"
      Total Number of Cores: 4
1
2
user$ sysctl -n hw.ncpu
8

根据维基百科的说法(http://en.wikipedia.org/wiki/intel-core-core-i7),没有具有8个物理核心的核心i7,所以超线程的想法必须如此。忽略sysctl并使用system_profiler值以确保准确性。真正的问题是,您是否能够高效地运行具有4个核心的应用程序(长编译作业?)不会中断其他进程。

运行一个与4核并行的编译器似乎不会显著影响常规的操作系统操作。所以,把它当作8个核来处理并不是那么糟糕。


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

1
system_profiler SPHardwareDataType


下面的命令提供了有关CPU的所有信息

1
$ sysctl -a | sort | grep cpu


在MacBookPro运行的Mavericks上,sysctl -a | grep hw.cpu只会返回一些神秘的细节。更多详细和可访问的信息见machdep.cpu部分,即:

1
sysctl -a | grep machdep.cpu

特别是,对于具有HyperThreading的处理器,您将看到枚举的CPU总数(logical_per_package是物理核心计数(cores_per_package的两倍)。

1
sysctl -a | grep machdep.cpu  | grep per_package


澄清

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

更新以处理Yosemite中的缺陷

由于OSXyosemite中有一个奇怪的bug(可能还有更新版本,比如即将推出的ElCapitan),我做了一个小修改。(如果忽略stderr,旧版本仍然可以很好地工作,这是所有修改都对您有效。)

这里给出的其他答案也一样

  • 提供错误信息
  • 由于命令实现中的错误,不提供任何信息
  • 跑得非常慢(花了一分钟的时间完成),或者
  • 提供了太多的数据,因此可能对交互使用有用,但如果您想以编程方式使用数据(例如,作为输入到诸如bundle install --jobs 3之类的命令,在该命令中,您希望用数字代替3比所获得的核心数少一个,或者至少不超过核心数),则这是无用的。
  • 获取核心数量的方法是,可靠、正确、合理、快速,并且在答案周围没有额外的信息或甚至额外的字符,这是:

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


    以上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_包:16

    machdep.cpu.cores_per_包:8

    期望值是:

    MaCdP.Cu.CoeLe计数:4

    MaCdP.cP.线程数:8

    哪一个匹配:

    物理CPU:4

    逻辑CPU:8