多处理器吞吐量可伸缩性
实际工作负载并不能在 SMP 系统中极佳的伸缩。
一些禁止极佳伸缩的因素如下所述:
- 当处理器的数量增加时,总线/开关的争用也增加。
- 内存争用增加(所有内存都为所有处理器共享)
- 随着内存不断消耗,高速缓存未命中的成本增加
- 高速缓存交叉式失效和读取另一个高速缓存以保持高速缓存一致性
- 由于更高分派率而引起的增加的高速缓存未命中(更多的进程/线程需要在系统中分派)
- 增加的同步指令成本
- 由于更大的操作系统和应用程序数据结构而增加的高速缓存未命中
- 为锁定/解锁而增加的操作系统和应用程序路径长度
- 由于等待锁而增加的操作系统和应用程序路径长度
所有这些因素都对称为工作负载的可伸缩性起作用。 可伸缩性是工作负载吞吐量受益于其他处理器可用性的程度。 它通常表示为一个多处理器的工作负载吞吐量由一个相当的单处理器的吞吐量所除得到的商。 例如,如果一个单处理器在给定的工作负载下每秒获得 20 个请求,而一个四处理器的系统每秒获得 58 个请求,那么比例因子将是 2.9。 这个工作负载是高度可伸缩的。 一个专门由长期运行、计算机密集的程序组成的工作负载,如果其 I/O 或其他内核活动是可忽略的,并且没有共享数据,那么可以在一个四路系统中达到 3.2 到 3.9 的比例因子。 然而,现实中大多数工作负载不能达到这个水平。 由于可伸缩性是很难估计的,可伸缩性的假设应基于真实工作负载的评估值。
下图说明了伸缩问题。 工作负载由一系列假设的命令组成。 每条命令大约有三分之一的正常处理、三分之一的 I/O 等待和三分之一对所持有锁的处理。 在单处理器中,事实上一次只能处理一个命令,不管是不是持有锁。 在显示的时间间隔里(是命令独立执行时间的五倍),单处理器处理 7.67 个命令。

在多处理器上,两个处理器处理程序执行,但是仍然只有一个锁。 为了简单起见,显示了影响处理器 B 的所有锁定争用。 在所示时间段内,多处理器处理 14 个命令。 因此比例因子为 1.83。 我们只讨论两个处理器,因为更多处理器的情况不会有什么变化。 现在锁在 100% 的时间里都处于使用状态。 在一个四路的多处理器中,比例因子可能是 1.83 或更小。
实际程序很少会像插图中的命令那样对称。 另外,我们仅仅考虑了争用的一个尺度:锁定。 如果我们将高速缓存一致性和处理器相似性的影响包括进来,无疑比例因子几乎会更小。
该示例说明了工作负载通常不能通过简单添加处理器来使它更快运行。 确定和最小化线程之间的争用源也是必要的。
伸缩是与工作负载相关的。 一些公布的基准程序暗示高水平的可伸缩性是容易获得的。 大多数这样的基准程序是通过运行小型的 CPU 密集程序的组合而构造出来的,这些 CPU 密集程序几乎不用什么内核服务。 这些基准程序的结果代表了可伸缩性的上限,而不是现实期望。
基准程序的另一个值得注意的有趣观点是通常情况下,一个单路 SMP 的运行速度会比运行操作系统的 UP 版本的同等单处理器慢(大约 5%-15%)。