我们会请专家来帮助改善应用性能,他们有时会发现,性能差只是因为应用运行的CPU架构或系统不合适。引入多核和每核多硬件线程(也称为CMT,Chip Multithreading)以后,CPU架构和系统已经发生了天翻地覆的变化,因此为特定应用选择正确的平台和CPU架构就显得尤为重要了。此外,随着CPU架构的演变,评估系统性能的方法也需要与时俱进。本节将考察现代系统中几种不同的CPU架构,并提出一些选择底层系统时的注意事项,还会解释为何现代每核多线程CPU架构(例如SPARC T系列处理器)无法使用传统评估系统性能的方法。 1.3.1 选择正确的CPU架构 Oracle的SPARC T系列处理器引入了芯片多处理和芯片多线程。SPARC T系列处理器设计上的主要亮点是引入了每核多硬件线程,以应对CPU高速缓存未命中所带来的问题。第一代SPARC T系列UltraSPARC T1,每个CPU有4、6或8个核,每核有4个硬件线程。从操作系统的角度来看,8核的UltraSPARC T1处理器就像是有32个处理器的系统。即操作系统把每个核中的每个硬件线程都看成一个处理器,所以配置为8核的UltraSPARC T1系统,操作系统会把它当成32个处理器。 UltraSPARC T1的独特之处在于每个核有4个硬件线程。在一个时钟周期内,每核4个硬件线程中只有一个可以运行。发生长延迟时,例如CPU高速缓存未命中,如果同一个UltraSARC T1核中还有其他就绪的硬件线程(Runnable Hardware Thread),下一个时钟周期就会让这个硬件线程运行。相比而言,其他每核单硬件线程(即便是超线程)的CPU,就会被诸如CPU高速缓存未命中这样的长延迟事件所阻塞,从而因等待事件完成而浪费时钟周期。对于这类CPU,如果就绪的应用线程已经准备好运行却没有可用的硬件线程,运行前就必须进行线程上下文切换。线程上下文切换通常需要耗费数百个时钟周期。由于SPARC T系列处理器可以在下一时钟周期切换到同核上的另一个就绪线程,因此,对于有许多待执行线程、高度线程化的应用来说,在SPARC T系列处理器可以执行得更快。不过,这种每核多硬件线程和下一时钟周期切换的设计代价是CPU的时钟频率比较低。换句话说,像SPARC T系列这样有多硬件线程的CPU,与其他每核单硬件线程或者无法在下一周期切换的CPU相比,运行的时钟频率通常较低。 提示 Sun公司的第一代SPARC T系列处理器,从UltraSPARC T1到 UltraSPARC T2 和T3,每核的硬件线程数依次增加,每核每时钟周期内执行多个硬件线程的能力也逐步增强。此处讨论的目的是为了便于大家探讨和理解UltraSPARC T1处理器与其他现代CPU的不同,一旦弄清楚了CPU架构上的差异,也就容易将UltraSPARC T1背后的设计思路推广到UltraSPARC T2和T3处理器。 选择硬件系统时,如果预计目标应用有大量的并发线程,那么它在SPARC T系列处理器上的性能和扩展性,就要好于每核硬件线程少的处理器。与之相比,如果应用只需少量线程,特别是预计同时运行的线程数少于SPARC T系列处理器的硬件线程数,那么它在每核硬件线程数不多但时钟频率更高的处理器上的性能,就要好于时钟频率较低的SPARC T系列处理器。简言之,要想发挥SPARC T系列处理器的性能,就需要大量并发的线程,让大量硬件线程保持负荷,从而在发生例如CPU高速缓存未命中这样的事件时,发挥它在下一时钟周期切换到另一硬件线程的能力。如果没有大量的并发线程,SPARC T系列就和传统低时钟频率的处理器差不多了。需要同时用大量线程将许多SPARC T系列硬件线程跑满的观点也表明,传统判断系统性能是否合格的方法或许没有真正展现系统的性能。下一节将谈论这个主题。 1.3.2 评估系统性能 SPARC T系列处理器可以在下一时钟周期切换到同核中其他就绪的硬件线程,所以为了评估它的性能,必须加载大量的并发线程。 通常评估新系统性能的方法是将预期目标负载的一部分加载到系统上,或者执行一个或多个微基准测试,然后监控系统性能或单位时间内应用完成的运算量。然而,为了评估SPARC T系列处理器的性能,必须加载足够多的并发线程以便将众多硬件线程跑满。对于长时间延迟(如CPU高速缓存未命中)事件引起的下一周期线程切换,SPARC T系列需要足够大的负载才能从中受益。CPU高速缓存未命中引起的阻塞和等待会耗费许多CPU周期,大约要数百个时钟周期。因此,为了充分利用SPARC T系列处理器,系统需要加载足够多的并发任务,这样下个周期线程切换这种任务所带来的好处才能体现出来。 如果SPARC T系列处理器不能以目标负载的方式运行,系统性能反而不会很好,因为并非所有的硬件线程都满载。记住SPARC T系列处理器的主要设计点就是允许其他硬件线程在下一时钟周期执行,从而应对CPU的长时间延迟。对于每核单硬件线程的处理器来说,长时间延迟(例如CPU高速缓存未命中)意味着需要浪费大量的CPU时钟周期,以等待从内存获取数据。为了切换到另一个线程,必须用其他可运行线程及其状态信息替换当前的线程。这不仅需要时钟周期以便进行上下文切换,也需要CPU高速缓存为新运行的线程获取不同的状态信息。 因此,评估SPARC T系列处理器性能时,很重要的一点就是在系统上加载足够大的负载,从而充分利用更多的硬件线程,以及在下一时钟周期同一个CPU核内切换到另一个硬件线程的能力。