首页 文章

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

提问于
浏览
340

当您运行Mac OS X时,如何从命令行了解机器上有多少个内核?在Linux上,我使用:

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

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

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

12 回答

  • 2

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

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

    有点慢,但有效 .

  • 8

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

    sysctl -n hw.ncpu

  • 0

    更容易:

    sysctl -n hw.ncpu
    
  • 1

    要在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”的有趣值是:

    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.
    
  • 21
    $ system_profiler | grep 'Total Number Of Cores'
    
  • 8

    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>
    

    [〜]

    但是,sysctl不同意:

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

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

    PID COMMAND%CPU
    4306排名前5.6
    4304 java 745.7 4296 locationd 0.0

  • 1

    使用 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
    

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

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

  • 17

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

    system_profiler SPHardwareDataType
    
  • 122

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

    $ sysctl -a | sort | grep cpu
    
  • 7

    CLARIFICATION

    当问到这个问题时,OP没有说他想要 LOGICAL 内核的数量而不是实际的内核数量,所以这个答案在逻辑上(没有双关语意)得到了一个方法来获得真实物理内核的实际数量,而不是操作系统尝试通过超线程伏都教虚拟化的数量 .

    UPDATE TO HANDLE FLAW IN YOSEMITE

    由于OS X Yosemite中的一个奇怪的bug(以及可能的新版本,例如即将推出的El Capitan),我做了一个小修改 . (如果您只是忽略STDERR,那么旧版本仍能很好地工作,这是所有修改都适合您 . )


    这里给出的每一个答案都是

    • 提供的信息不正确
      由于命令实现中的错误,

    • 没有提供任何信息

    • 运行速度令人难以置信(花一分钟时间完成),或者

    • 提供了太多数据,因此可能对交互式使用有用,但如果您想以编程方式使用数据(例如,作为 bundle install --jobs 3 之类的命令的输入,您希望数字代替 3 减少一个,则无用)比您拥有的核心数量,或至少不超过核心数量)

    能够可靠,正确,合理地快速获得核心数量的方法,以及没有额外信息甚至是答案的额外字符,是:

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

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

    上述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

相关问题