代码之家  ›  专栏  ›  技术社区  ›  Mike DeSimone

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

  •  345
  • Mike DeSimone  · 技术社区  · 15 年前

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

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

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

    非常晚编辑: 只是想澄清一下:我在问有多少人 符合逻辑的 核心可用,因为这与我需要的同时作业数相对应。 制作 产卵JKP的回答由Chris Lloyd进一步完善,是 确切地 我需要什么。YMMV。

    12 回复  |  直到 6 年前
        1
  •  725
  •   Ahmed Younes    6 年前

    您可以使用 sysctl 效用:

    sysctl -n hw.ncpu

        2
  •  125
  •   Matt user129975    9 年前

    更容易:

    sysctl -n hw.ncpu
    
        3
  •  23
  •   Frozen Flame Mark Byers    9 年前

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

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

    有点慢,但管用。

        4
  •  18
  •   alfwatt    8 年前

    要在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.
    
        5
  •  9
  •   kent    15 年前
    $ system_profiler | grep 'Total Number Of Cores'
    
        6
  •  8
  •   user1706991    11 年前

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

    [~]系统剖析器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不同意:

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

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

    PID命令%cpu
    4306前5.6
    4304爪哇745.7 4296位置d 0.0

        7
  •  8
  •   nbro kai    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
    

    user$ sysctl -n hw.ncpu
    8
    

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

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

        8
  •  7
  •   Tohid    13 年前

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

    system_profiler SPHardwareDataType
    
        9
  •  3
  •   asmaier    7 年前

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

    $ sysctl -a | sort | grep cpu
    
        10
  •  1
  •   iconoclast    9 年前

    澄清

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

    更新以处理Yosemite中的缺陷

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


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

    1. 提供错误信息
    2. 由于命令实现中的错误,不提供任何信息
    3. 跑得太慢了 分钟 完成),或
    4. 提供了太多的数据,因此可能对交互式使用有用,但如果希望以编程方式使用数据(例如,作为命令的输入,如 bundle install --jobs 3 你想让号码代替 3 比你拥有的核心数量少一个,或者至少不超过核心数量)

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

    system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '
    
        11
  •  1
  •   nbro kai    8 年前

    在一 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
    
        12
  •  0
  •   Mark    10 年前

    以上2个好回复的评论:

    1)JKP接受的回复(及意见)回复:hw.ncpu明显被否决,赞成hw.logicalcpu。( https://ghc.haskell.org/trac/ghc/ticket/8594 )

    2)更新2014年卡尔EHR:在我的电脑(2.5 GHz Intel Core i7)上, sysctl -a | grep machdep.cpu | grep per_package 返回不同的数字:

    machdep.cpu.logical_per_包:16

    machdep.cpu.cores_per_包:8

    所需值为:

    machdep.cpu.core_计数:4

    machdep.cpu.thread_计数:8

    哪一个匹配:

    硬件物理CPU:4

    硬件逻辑CPU:8