当你运行Mac OS X时,你如何从命令行得知机器上有多少核?在Linux上,我使用:

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

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

非常晚的编辑:澄清一下:我问的是有多少逻辑核可用,因为这对应于我想要生成多少同步作业。jkp的回答,经过Chris Lloyd的进一步完善,正是我所需要的。YMMV。


当前回答

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时间(在顶部):

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  

其他回答

澄清

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

更新处理优胜美地的缺陷

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


这里的其他答案也一样

gives incorrect information gives no information, due to an error in the command implementation runs unbelievably slowly (taking the better part of a minute to complete), or gives too much data, and thus might be useful for interactive use, but is useless if you want to use the data programmatically (for instance, as input to a command like bundle install --jobs 3 where you want the number in place of 3 to be one less than the number of cores you've got, or at least not more than the number of cores)

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

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

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

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

brew install coreutils

如果你有脚本,你更喜欢写一次(Linux + macOS)而不是两次,或者避免有If块,你需要检测操作系统,知道是否调用nproc vs sysctl -n hw。Logicalcpu,这可能是一个更好的选择。

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时间(在顶部):

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  

执行system_profiler | grep "Cores"命令。

我有一个:

MacBook Pro Retina, 2012年年中。 处理器:2.6 GHz英特尔酷睿i7

user$ system_profiler | grep "Cores"
      Total Number of Cores: 4

user$ sysctl -n hw.ncpu
8

根据维基百科(http://en.wikipedia.org/wiki/Intel_Core#Core_i7),没有8个物理核的Core i7,所以超线程的想法肯定是这样的。忽略sysctl,使用system_profiler值以保证准确性。真正的问题是,您是否能够有效地运行具有4核的应用程序(长编译作业?)而不中断其他进程。

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

以上2个好的回复:

1)关于接受jkp: hw的回复(和意见)。Ncpu显然已被弃用,而支持hw。logicalcpu (https://ghc.haskell.org/trac/ghc/ticket/8594)

2)关于Karl Ehr的2014年更新:在我的电脑上(2.5 ghz英特尔酷睿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