超线程技术的应用场景

超线程技术不能应用在所有的场景中
对于不同的情况来说,其有可能帮助提升虚拟服务器的性能表现
但是反过来也有可能造成负面影响
而获得良好性能表现的关键就在于判断应该何时使用这种技术

超线程技术介绍

超线程是一种计算机处理器技术,能够将一个物理处理器变成两个虚拟处理器。这种方式能够提升处理器核心的指令队列工作效率,从而提高处理器的整体性能表现,此外虚拟化技术也能够受益于这种技术。这种技术允许hypervisor为虚拟机提供之前两倍的虚拟处理器数量——但是超线程技术并不是完美的。如果使用超线程技术,那么效率低下、质量不佳的代码甚至是分配不当的负载都有可能对系统性能造成负面影响。

超线程是英特尔公司的私有技术,其能够帮助提升物理处理器的资源使用效率,保证处理器一直处于繁忙状态,以便完成更多工作。

超线程技术——也被称为HTTHT——的出现是由于传统物理服务器核心在同一时间只能处理一项任务。所有负载都需要使用处理器的指令通道,但是通常指令通道的使用率并不会达到100%或者一直处于繁忙状态。造成这种现象的部分原因在于应用程序的编码和运行方式不同,此外,由于现代处理器的运行速度越来越快,已经完全超出许多应用程序的需求,因此被浪费的处理器周期越来越多。

超线程技术在处理器核心中添加了新的电路,能够提供额外的指令通道来共享物理处理器的执行资源,比如内存总线、处理器缓存以及处理器的执行引擎。增加的超线程电路能够将物理核心分割成两个逻辑核心。在启用超线程技术之后,每个逻辑处理器都相互独立,中断、停止和操作都独立于另外一个共享相同物理核心的虚拟处理器。当某个逻辑核心空闲时,另外一个逻辑核心将会得到更多的执行资源。

关于超线程技术需要记住的重要一点是在相同物理核心上启用第二个逻辑处理器并不会使得处理器的性能提升一倍。这是因为处理器的执行资源是共享的,并没有翻倍。HTT技术允许处理器在特定时间内处理更多的任务或者指令线程,但是仍然需要使用原有的物理资源完成这些任务。这是超线程架构和多核处理器——比如双核或者四核——的最大区别,多核技术拥有多个物理处理器。

而虚拟处理器的性能提升幅度取决于负载对于处理器的资源需求以及操作系统管理和规划逻辑处理器的能力。如果超线程技术不能识别操作系统,就会使用同样的方式管理所有逻辑处理器,可能会将资源需求很大的负载放在相同核心的逻辑处理器上——这样会对应用程序的性能表现造成负面影响——而同时其他核心并没有得到充分利用。与此形成对比的是,能够识别操作系统的超线程技术可以将线程分配到不同的处理器上,最大程度上提升负载的性能表现。

比如,如果某个应用程序需要使用大量处理器资源,就会一直占用指令队列,那么即便同一个物理处理器核心提供额外的逻辑处理器也无济于事——因为物理处理器已经没有额外的资源可以共享。操作系统可以将第二个线程加入到处理队列中,但是通常其性能表现会非常差,此外,由于其会占用当前运行线程的处理器周期,因此还会导致现有应用程序性能受到影响。Hypervisor或者操作系统应该能够识别HTT,并且最大程度上提升负载对于物理处理器的使用效率,这些都是分配逻辑处理器的前提。如果这个前提不能实现,那么超线程(并非虚拟化)功能应该被禁用。

从hypervisor系统角度来看,超线程并不是虚拟化技术——HTT只是一种位于处理器硬件层、以硬件为基础的虚拟化技术。而虚拟化和hypervisor能够带来哪些好处?超线程和hypervisor之间并没有直接的关联。Hypervisor能够工作在不支持超线程技术的物理处理器上,而支持超线程的处理器也可以使用非虚拟化系统。但是这两种方案可以相互补充,而像VMware vSphere这样的现代hypervisor在创建资源池并且将虚拟CPU分配给虚拟机时已经能够识别并且使用超线程技术。这种方式能够在组织和计划任务方面为hypervisor提供更多的灵活性,因此能够提升虚拟服务器的工作效率。

参考文档: 超线程技术优缺点分析


超线程在杏树林的应用

在杏树林的自有机房中, 部分服务器开启了超线程功能, 2U6核心的 R420服务器开启超线程后, 核心数量翻了一番达到了24颗核心

该服务器用在虚拟化 hypervisor 技术之上, 由于磁盘是 SAS 7.2K 的低性能硬盘, io 几乎成了该服务器的绝对瓶颈, hypervisor 中的客户机在执行频繁的 IO 操作时, 大量的 IO wait 产生, 拖慢了整个服务器的性能

超线程在这种使用场景下有着很大的优势, 因为 CPU 的时钟周期被严重拖慢, 绝大部分的 CPU 在等待 IO 操作的完成, 在使用了超线程技术之后, 每个 CPU 核心被掰成了两半儿, 一个核心可以当成两个核心来用

上学的时候, 老师反复强调, 单颗核心在同一时间只能处理一个任务. 单核心的 CPU 之所以支持多任务处理, 是因为一颗核心反复的在各个进程中切换, 为每个进程分配CPU 的计算资源. 之所以我们认为所有的进程在同时工作, 是因为 CPU 的切换速度极快, 快到人感觉不到中间的断点. 如果我们听着音乐打开了一个重 CPU 计算型的应用, 那么音乐就可能产生卡顿的现象.

上面这个故事, 如果还是一颗核心, 如果他开启了英特尔的超线程技术的话, 音乐就不会被卡顿, 因为在程序的角度来看, 看到的是两颗核心, 同时开启两个应用的话, 每个进程都会被分配一颗核心, 当重 CPU 计算型的进程被开启后, 仍然可以保证有一个虚拟的CPU 分配了一定的计算资源给音乐进程

以上是在重 CPU 计算型的场景中,突破了同一颗核心在同一时间只能处理一个任务的限制

还有一种更有价值的用法就是重 IO 操作的场景下, 极大的发挥 CPU 的性能. 拿回最开始我们机房虚拟化的例子, 磁盘频繁的出现 IO 等待, 每颗 CPU 由于同一时间只能处理一个任务, 而导致每个 CPU 核心的使用率极其低下, 但是一旦开启了超线程技术, CPU 的可利用资源立刻翻了一番, 可以抵消一些由于重 IO 操作而被影响了的其他应用性能的影响

最后我们举个反例:

假如某个应用是计算密集型应用, 只会产生较少的 IO 操作, 且这点 IO 操作被放到了内存映射出来的”磁盘”上, 实现了零 IO, 这种应用如果开启了超线程反而会极大的拖慢整个服务器的性能. 因为这种计算密集型的应用, 即使不开启超线程, 单颗核心的利用率也能达到90%以上, 而开启了超线程之后, 程序实际最大只能用到单颗核心的50%, 此时所有的虚拟核心全部被打满, 而且互相征用资源, 导致硬件和系统去维护和调和这些资源征用耗费了大量的资源, 反而拖慢了整体性能

总结

如果你不确定怎么使用超线程技术, 可以简单的用以下方式判断

在不开启超线程的情况下, 如果你的应用每颗 CPU 核心的使用率都超过了50% (或是说将近50%) 那就不要再开启超线程了