我为什么关掉了超线程


最近在一个服务的服务器进行机型置换时,又碰到了关于线程数、多核CPU、超线程的问题。

我之前已经在《线程数与多核CPU的关系》中讨论过物理核与超线程的关系,并且建议计算密集型任务,应该将线程数设置为物理核数。

但是,这次机型替换,还是出现了问题。

多核与主频

原来我们服务使用的是一款单CPU,4物理核,8逻辑核(超线程,HTT)的服务器,主频3.4G。这次替换的新机型是双CPU,每个CPU20物理核,40逻辑核(HTT),一共是80核的服务器,但是主频只有2.5G。

考虑到这个服务是一个时延敏感的服务,看到主频这里,我的心是凉的。但是网络上也有很多说法表明(主要是Intel的官方宣传文章),在更小制程更新架构的情况下,较低主频的新版CPU也可以取得打平甚至超过旧版高主频CPU的性能表现。

至于为什么多核CPU反而主频更低呢?这主要是功耗上的考虑。40个物理核密集布在一块板上,高主频会带来高功耗,散热就是一个大问题了。因此,目前市面上的这种几十核的CPU,主频基本都在2.xG左右。

第二个担忧是为了充分利用多核CPU的性能,程序的线程数需要大大提高,那这里会不会带来锁的争用从而导致性能下降?好在之前,《使用双buffer无锁化》已经解决了大部分锁的问题,现在的服务基本是一个无锁的计算密集型程序。

超线程

那么部署、测试、压测、上线。

请求量变大,新机器上的时延直接飙到原来的两倍还多。

请教了经常配置使用这种新机型的运维同学,告诉我可以尝试关闭超线程试试。果然,关闭超线程后,时延只比原来的8核机高不到10%,且随着负载增加没有明显变化,符合上游服务的时延要求。

那为什么关闭超线程有效呢?

首先,我们要了解什么是超线程。

超线程,是一种用于提升CPU计算并行度的处理器技术,用一个物理核模拟两个逻辑核。
这两个逻辑核拥有自己的中断、状态,但是共用物理核的计算资源。
超线程技术旨在提高CPU计算资源的使用率,从而提高计算并行度。  

超线程技术基于这样一个现实,那就是大多数程序运行时,CPU资源并没有得到充分的利用。比如CPU缓存未命中、分支预测错误或者等待数据时,CPU中的计算资源其实是闲置的。超线程技术,可以通过硬件指令,将这些闲置的CPU资源,调度给其他的指令,从而整体上提高CPU的资源利用率。

那么为什么我们程序关闭了超线程,反而时延性能提升了呢?

可能有以下几个方面的原因:

  • 超线程带来的效率提升绝对赶不上新增一个独立的物理核,因为超线程没有增加任何的计算资源,而是允许两个任务共享同一个物理核的现有计算资源。所以如果处理器有充足的计算资源未被充分利用时,超线程可以带来比较大的提升,另一个线程可以在某些计算资源空闲时,插入执行。这样在同一个时钟周期内,可以计算更多的任务。这里带来的性能提升,更大的是吞吐量的提升,而非单任务计算时延的提升。如果应用程序前后依赖少,可以编译成独立的指令执行,CPU层面的吞吐量提升也可以带来应用程序层面的计算时延下降;但是,满足这样要求的业务太少,大部分应用程序都是有前后依赖的。

  • 超线程的利用率是否高,和操作系统有关。如果操作系统不理解超线程(如Linux2.6之前,windows server2003等),那么就有可能将本来可以分发给两个物理核的计算任务,分发给了同一个物理核上的两个超线程。这样的话,反而会带来性能损失。

  • 有研究表明,超线程依赖于操作系统对CPU的调度。但是如果应用程序开启了CPU绑定功能,则有可能破坏这种调度的完整性,反而带来性能损失。不幸的是,由于我们应用程序内部逻辑需要,必须要开启CPU绑定功能。这里可能是个比较主要的问题。

  • 为了实现超线程技术,物理核中需要多加一个逻辑处理单元。即使没有指令给超线程出来的那个逻辑核计算时,这个新增的逻辑处理单元,也会占据一定的物理核资源,带来性能影响。

另外,超线程程序会带来耗电量的大幅提升。这在服务器程序来说,可能带来功耗的提升导致散热问题从而降频,而对于目前智能手机来说,电池续航也会是一个严重的问题。

总结

超线程技术,目前基本上是服务器CPU的标配了。但是具体能够带来多大的性能提升,还是要取决于具体的应用程序与操作系统。

如果你发现服务器性能不达标,不妨将超线程关掉试试。



推荐阅读:
使用双buffer无锁化
踩坑记:临界区内要小心
读写锁的性能一定更好吗

转载请注明出处: http://blog.guoyb.com/2018/12/01/disable-htt/

欢迎使用微信扫描下方二维码,关注我的微信公众号TechTalking,技术·生活·思考:
后端技术小黑屋

评论