当您运行 Mac OS X 时,如何从命令行判断机器上有多少内核?在 Linux 上,我使用:
x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo)
它并不完美,但很接近。这旨在馈送到 make
,这就是它给出的结果 1 高于实际数字的原因。而且我知道上面的代码可以用 Perl 写得更密集,也可以用 grep、wc 和 cut 来写,但我认为上面的代码是简洁性和可读性之间的一个很好的折衷。
非常晚的编辑: 澄清一下:我问的是有多少 逻辑 内核可用,因为这与我希望 make
产生多少并发作业相对应。 jkp 的答案,由 Chris Lloyd 进一步完善,正是我所需要的。 YMMV。
grep ^processor /proc/cpuinfo | wc -l
nproc
命令。
更容易:
sysctl -n hw.ncpu
system_profiler SPHardwareDataType
时,我可以相信`型号标识符:MacBookPro9,2 处理器名称:英特尔酷睿 i5 处理器速度:2.5 GHz 处理器数量:1 内核总数:2`
这应该是跨平台的。至少对于 Linux 和 Mac OS X。
python -c 'import multiprocessing as mp; print(mp.cpu_count())'
有点慢但有效。
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 时间(在 top
中):
PID COMMAND %CPU
4306 top 5.6
4304 java 745.7
4296 locationd 0.0
sysctl hw.physicalcpu
将显示有多少物理 cpu 内核可供您使用,sysctl hw.logicalcpu
将显示有多少逻辑 cpu 可供您使用。像 Windows/OSX/Linux 这样的操作系统所做的所有工作都是让你看起来有多个 CPU(不管它是什么类型的)。像 linux 这样的操作系统允许您配置可以使用的 cpu、内核、线程。
要在 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”的有趣值是(来自 this comment in the kernel source):
hw.ncpu:此引导可用的最大处理器数。使用此值来确定每个处理器阵列的静态大小;即处理器负载统计。
hw.activecpu:当前可用于执行线程的处理器数量。使用此数字来确定要在 SMP 感知应用程序中创建的线程数。当电源管理模式改变时,这个数字可能会改变。
hw.physicalcpu:当前电源管理模式下可用的物理处理器数量。
hw.physicalcpu_max:本次引导可用的最大物理处理器数。
hw.logicalcpu:当前电源管理模式下可用的逻辑处理器数量。
hw.logicalcpu_max:本次引导可用的最大逻辑处理器数。
$ system_profiler | grep 'Total Number Of Cores'
grep -i
getconf
适用于 Mac OS X 和 Linux,以防万一您需要它与这两个系统兼容:
$ getconf _NPROCESSORS_ONLN
12
使用 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
根据 Wikipedia,(http://en.wikipedia.org/wiki/Intel_Core#Core_i7) 没有具有 8 个物理内核的 Core i7,因此 超线程 的想法必须是这种情况。忽略 sysctl
并使用 system_profiler
值来确保准确性。真正的问题是您是否可以在不中断其他进程的情况下有效地运行具有 4 个内核的应用程序(长时间编译作业?)。
运行与 4 核并行的编译器似乎不会显着影响常规操作系统操作。因此,也许将其视为 8 核还不错。
正如 jkp 在评论中所说,这并没有显示物理核心的实际数量。要获取物理内核的数量,您可以使用以下命令:
system_profiler SPHardwareDataType
make
产生多少进程,因此 jkp 的答案(逻辑核心数)最适合。
以下命令为您提供有关 CPU 的所有信息
$ sysctl -a | sort | grep cpu
原始问题中没有指定(尽管我在评论中看到 OP 帖子说这不是一个选项),但是 macOS 上的许多开发人员都安装了 Homebrew 包管理器。
对于偶然发现此问题的未来开发人员,只要存在安装 Homebrew 的假设(或要求)(例如,在公司的工程组织中),nproc
就是包含在coreutils
包。
brew install coreutils
如果您希望编写一次脚本(对于 Linux + macOS)而不是两次,或者避免在需要检测操作系统以了解是否调用 nproc
与 sysctl -n hw.logicalcpu
的地方出现 if
块,这可能是一个更好的选择。
对以上 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
澄清
当被问到这个问题时,OP 并没有说他想要 LOGICAL 核心的数量而不是实际的核心数量,所以这个答案在逻辑上(没有双关语)回答了一种获得实际物理核心数量的方法,而不是操作系统尝试通过超线程 voodoo 虚拟化的数字。
处理优胜美地漏洞的更新
由于 OS X Yosemite(可能还有更新的版本,例如即将推出的 El Capitan)中有一个奇怪的 bug,我做了一个小的修改。 (如果您忽略 STDERR,旧版本仍然可以很好地工作,这就是您所做的所有修改。)
这里给出的所有其他答案
提供不正确的信息 不提供任何信息,因为命令执行中的错误运行速度非常慢(需要一分钟的大部分时间才能完成),或者提供的数据过多,因此可能对交互式使用有用,但如果你想要以编程方式使用数据(例如,作为 bundle install --jobs 3 之类的命令的输入,您希望代替 3 的数字比您拥有的内核数少一,或者至少不多比核心数)
获得核心数量的方法是可靠、正确、合理地快速,并且没有额外信息甚至答案周围的额外字符,是这样的:
system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '
sysctl -n hw.ncpu
并且没有这些问题。
sysctl
在我的机器上没有给出准确的结果,其他人也报告了同样的事情。如果不能依赖它总是给出准确的结果,那么它就不能被认为是可靠和准确的。
sysctl
正确操作的范围,就像 user1706991 所做的那样。
sysctl -n hw.physicalcpu_max
在运行 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
这可以以更便携的方式完成:
$ nproc --all
32
兼容 macOS 和 Linux。
nproc
在 macOS Mojave 上似乎不可用。
nproc
是通过自制软件进行的简单安装。
sysctl hw.physicalcpu
或sysctl hw.logicalcpu
,一般情况下,sysctl hw
可用于所有选项。