朋友来信,说起最近装了一台双核双CPU服务器,Linux版本用的是 RHEL 3 update 8,启动后执行 top 命令一看,居然只能看到四个CPU。照理说,每颗物理CPU有两个核(Dual core),每个核有两个超线程(Hyper thread),如此算来,2颗物理CPU * 2个核 * 2个超线程,应该能在系统里看到8个逻辑CPU才对。这儿只有4个CPU,那么另外4个难道被JS匿下了不成?大惑不解,故来信询问。
远程登录那台服务器,执行`dmesg | grep CPU`,发现启动时确实只能探测到4个CPU:
CPU0: Intel(R) Xeon(R) CPU 5110 @ 1.60GHz stepping 06 CPU1: Intel(R) Xeon(R) CPU 5110 @ 1.60GHz stepping 06 CPU2: Intel(R) Xeon(R) CPU 5110 @ 1.60GHz stepping 06 CPU3: Intel(R) Xeon(R) CPU 5110 @ 1.60GHz stepping 06 Brought up 4 CPUs
再执行`cat /proc/cpuinfo`,也同样只能看到4个CPU,并且每个CPU的信息里都有:
siblings : 2 cpu cores : 2 flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm pni monitor ds_cpl tm2 xtpr
双核CPU,支持超线程(ht),没错啊。还不放心,再执行`dmidecode | grep -A 40 Processor`,赫然显示:
Flags: HTT (Hyper-threading technology)
没天理了,现在的JS连这种双核CPU都能使猫腻,良心都被狗吃了么?且慢,为了抓个确证,再到Intel官方网站上查查这种CPU的spec: 怪了,这种CPU的 Support features 里居然没有 Hyper-Threading Technology。那么前面 cpuinfo 里看到的 "ht" 和 dmidecode 里看到的 “HTT (Hyper-threading technology)” 是怎么回事呢?
无奈只好写信给Kernel List求教,随即,著名Kernel Hacker,Arjan van de Ven(原Red Hat Linux Kernel项目负责人,去年跳槽到Intel,这个问题他最有发言权)就回信说:
the "ht" flag there ONLY means "we support reporting the number of threads/cores/etc via the MSRs". It does not mean that you actually have hyperthreading, only that your cpu knows how to report what it supports...
原来如此,这些 flag 只是说明CPU支持通过 MSRs(Model Specific Register) 报告这些东东的数量,并非说它支持 Hyper-threading ,实在是太诡异了。这么算下来,看到 2颗物理CPU * 2个核 = 4 个逻辑CPU,是正常的。
为什么双核CPU不支持超线程呢?8个逻辑CPU总比4个跑得快吧,再说超线程也是Intel比较成熟的技术了,应该不会有什么问题。于是又去查资料,发现双核技术与超线程技术之间并非 2 * 2 = 4 的关系。以前在单核CPU上跑超线程,确实可以带来并发性能的提升,但由于超线程追根究底还是跑在一个物理CPU上,因此两个超线程之间需要共享同一份资源,而对于共享资源的争用,正是超线程在高负载环境下不仅不能提升性能,反而会导致CPU性能严重下降的原因。由此才出现了双核技术,两个物理的核封装在同一个物理CPU内,各吃各碗里的,友好合作,互不争抢,和谐双赢,使得CPU性能在高负载下表现得更好。因此,双核技术是超线程技术的替代者,不用超线程,服务器跑得更快。
note: 5110的CPU是不支持超线程的,正如现在的酷睿2不支持超线程是一样的。
| |
阅读(236) | 评论(0) | 转发(0) |