从命令行中,您如何判断运行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。
- 对于Linux,我不必使用:grep ^processor /proc/cpuinfo | wc -l来添加一个。
- 请参阅stackoverflow.com/questions/6481005/…注意nproc命令。
- 抱歉,如果这是一个noob问题,但当您指的是逻辑核心时,您指的是物理核心?术语有什么不同(或没有)?只是为了更好地理解你的要求。
- 不,我不是说物理核心。物理核心是芯片上实现核心的一组晶体管。逻辑核心似乎是操作系统和用户程序的核心。在大量的案例中,这些都是相同的。然而,Intel的超线程技术(可能还有其他技术)使每个物理内核显示为两个逻辑内核。
您可以使用sysctl实用程序执行此操作:
sysctl -n hw.ncpu
- 在2011年年中1.7GHz的MacBookAir上,这个命令显示4。但是,我怀疑它实际上只有两个核心,并且系统概要分析程序sphardwaredatatype似乎同意这一点。你能解释一下这种差异吗?
- @JoshuaFlanagan机器有多少物理内核,它是什么芯片?例如,如果它是一个具有2个物理核心的核心i7,那么它将显示为4,因为该芯片支持超线程,并将自己呈现给操作系统,就好像它有4个可寻址核心一样。
- 如果你真的很在意,可以试试sysctl hw.physicalcpu或sysctl hw.logicalcpu,一般来说,sysctl hw是所有的选择。
- 编辑:请不要在我接受答案几年后再更改答案。
- 无法在2015年初运行El Capitan的Mac上工作。我得到"错误:"hw.ncpu"是一个未知的密钥"。/etc/sysctl.conf中也没有与CPU相关的条目。冰冷的火焰的回答奏效了。
- 抱歉,如果这是一个noob问题,但我如何知道这是否报告物理或虚拟信息?
- @JoshuaFlanagan苹果的i5支持超线程,尽管它不是标准的。
- @MikedeSimone你的特殊选择在很大程度上是无关紧要的。它实际上是一个服务的堆垛溢出网站,如果巨大的绿色复选标记的批准,必然是不知情的被取消。
更容易:
- 报告的数目实际上是核心数目的两倍,因为您的处理器支持超线程。
- 这给了我4个,但当我使用system_profiler SPHardwareDataType时,我相信‘型号标识符:MacBookPro9,2处理器名称:Intel Core i5处理器速度:2.5GHz处理器数量:1总核数:2`
这应该是跨平台的。至少对于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
- 你在工作中看到了超线程。这允许每个核心处理两个执行线程(不一定与操作系统线程相同,如pthreads)。因此,MacOS将每个物理核心视为两个逻辑核心。
- 你好@mikedesimone你能告诉我如何在CentOS的情况下检查工作中是否有超线程吗?
- stackoverflow.com/questions/2901694/&hellip;
- @Ciastopiekarz我相当肯定超线程是CPU架构(Intel)的一个特性,而不是操作系统所做的,我认为关键是让操作系统认为它有物理CPU:S x 2逻辑核心,而不必做任何特殊的事情来访问它们。所以如果你的CPU是Intel(所有的Mac都有Intel),那么是的,你有超线程。但是,如果你在PC上运行CentOS,你可能有一个AMD处理器。它们没有超线程,但由于它们通常以相同(或更低)的价格提供两倍多的内核,所以我不确定是否存在实际差异。
- @ERK操作系统知道区别,事实上,它知道CPU和内核以及在物理上运行的多个线程之间的区别。sysctl hw.physicalcpu将显示您可用的物理CPU核数,sysctl hw.logicalcpu将显示您可用的逻辑CPU数。操作系统就像windows/osx/linux一样,做所有的工作,让你看起来像有多个CPU(不管它是什么类型)。操作系统与Linux类似,允许您配置可以使用的CPU、内核和线程。
- @谢谢你的命令!很高兴拥有。我在回复Ciasto…试图向他们保证,如果他们有一个英特尔处理器,而没有做任何硬核配置,他们将有超线程。我希望这就是它的工作原理…或者我可以解释为什么我的电脑几年后就没电了!:d(是的,sysctl hw.logicalcpu返回我所期望的结果!)
- @erk-np,我只是说,虽然它是体系结构的,但是操作系统必须知道它,否则它不能使用这个功能。AMD在Ryzen芯片中使用SMT,这实质上做了相同的事情(英特尔只是使用超线程名称来表示SMT)历史:en.wikipedia.org/wiki/simultaneous_multiphreading
1
| $ system_profiler | grep 'Total Number Of Cores' |
- 更快:$system_profiler sphardwaredatatype grep"核心总数"
- 但如果包括键入时间,则速度较慢
- 它在一个bash脚本中;输入时间无关紧要。
- 似乎在Mac OS X 10.7上不起作用(即使是肯特更快的版本)。
- 似乎苹果改变了输出的格式。注意大写:以前是"核心总数",现在是"核心总数"…或者我以前打错了…对不起!
- 你可以用grep -i。
- 不要浪费时间,除非你知道你为什么需要这个。JKP的回答是最好的
使用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 |
- 目标是确定使用make生成多少进程,因此jkp的答案(逻辑核心的数量)最适合。
下面的命令提供了有关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 |
- 在我2008年初的Mac Pro上,这给了我4个。因为它有两个四核CPU芯片,所以实际的核心数量是8个。
- sysctl machdep.cpu也可以工作,而不是读取所有其他不必要的信息。
澄清
当被问到这个问题时,操作人员并没有说他想要的是逻辑核心的数量而不是实际的核心数量,所以这个答案在逻辑上(没有双关语)是以一种获得实际物理核心数量的方法来回答的,而不是操作系统试图通过超线程巫毒来虚拟化的数量。
更新以处理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 ' ' |
- 我刚刚在我的Mac Pro上运行了sysctl -n hw.ncpu,没有这些问题。
- 显然,我没有在所有类型的Mac上进行测试,但我相信你有时候测试是准确的。但是,sysctl在我的机器上没有给出准确的结果,其他人也报告了同样的情况。如果不能依靠它总是给出准确的结果,那么就不能认为它是可靠和准确的。
- 你也可以解释你所看到的错误行为,以及你在什么平台上看到的错误行为,因此,与用户1706991一样,sysctl的正确操作的界限更为清楚。
- 其他人认为这是由于超线程,所以您在sysctl中看到的数字是系统尝试模拟的核心数,即使实际上没有那么多核心。如果你想要准确的数字,用我的方法。如果您想知道计算机假装拥有多少核心,请使用sysctl。
- @在测试中,我发现‘核心总数’是本地化的。如果OSX设置为除英语以外的任何内容,那么您的解决方案将失败。最终使用:sysctl -n hw.physicalcpu_max。
- @好的,很高兴知道。
以上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