为什么服务器 CPU 的执行速度比具有相同基准测试分数的 Macbook Pro CPU 更快?

为什么服务器 CPU 的执行速度比具有相同基准测试分数的 Macbook Pro CPU 更快?

给定以下 CPU 和 GeekBench 分数:

  • Amazon EC2 z1d.large 实例:Intel Xeon Platinum 8151 4061 MHz(1 核)单核得分:1094,多核得分:1300

  • Macbook Pro 笔记本电脑:英特尔酷睿 i5-8259U 2300 MHz(4 核)单核得分:1002,多核得分:4104

Xeon 在单线程基准测试中快了 9.1%。

但是,当我在两台设备上编译 javascript 应用程序代码(单线程)时,Xeon 完成任务的速度提高了 60%。为什么?基准测试分数显示 Xeon 仅快了 9%。

它们都具有 NVME 驱动器,因此这不应该成为瓶颈。我也不认为存在 Mac 与 Linux 操作系统的问题,因为 Mac 是基于 Linux 的。

这是因为 Xeon 是服务器/台式机 CPU?并且以 100% 的速度和功率运行,而 Macbook Pro CPU 并未全功率运行并且必须等待 Intel Turbo Boost 加速?

答案1

考虑到您描述的任务、编译 Bable 项目以及所涉及的 CPU,我认为我知道性能差异的根源。我本来想早点回答,但不得不做一些研究来证实我的猜测。

首先,让我们描述一下您在系统上施加的负载。

Babel.js 是作为单线程、单进程编译器编写的,它主要利用异步 I/O 实现并行性(至少我在 Google 上搜索到的信息中没有显示它使用工作线程)。由于它是一个从磁盘编译文件的编译器,因此其执行的很大一部分涉及等待磁盘中的数据。这给我们带来了以下工作负载:

  1. 单线程,因此多核或超线程对编译没有显著影响,但有一点需要注意:

  2. Node.js 使用工作线程来处理磁盘 I/O,但除了两个或四个硬件线程之外,多核没有其他优势(参见:https://nodejs.org/en/docs/guides/dont-block-the-event-loop/

  3. 大部分并行发生在 I/O 级别。Babel 将尝试并行读取尽可能多的文件。

就第 1 点和第 2 点而言,i5 和 Xeon 都相当具有可比性。因此,让我们看看 CPU 如何处理第 3 点:服务 Babel 的并行文件读取请求。

这是两个系统之间的第一个重大区别:

  • Core i5 8259 有 16 个 PCI 通道

  • Xeon 8151 有 48 个 PCI 通道

因此,显然 Xeon 可以处理比 i5 更多的并行 I/O 操作。当 I/O 数量超过可用内存传输通道数量时,操作系统的处理方式与任务数量超过可用硬件线程数量时相同:将任务排队并强制它们轮流执行。

接下来我想知道 NVME 是否真的可以使用多个通道。这是我发现的另一个有趣的事实。NVME 标准允许一张卡使用最多 4 个 PCI 通道(物理上分配了这么多连接),但有些卡只使用 2 个,而其他卡则使用 4 个。因此并非所有 NVME 卡都是一样的。仅凭这一点,Babel 就可以将近两倍的带宽并行复制到 RAM 的文件数量翻倍。

这还取决于 NVME 插槽如何连接到 CPU。Core i5 只有 16 个 PCI 通道,毫无疑问会为 GPU 保留至少 8 个。只留下 8 个与其他设备共享。这意味着有时您的 NVME 卡必须与您的 Wifi 或其他硬件共享带宽。这会使速度变慢一些。

而且您的 NVME 甚至可能没有直接连接到 CPU 的 PCI 通道。Macbook 实际上可能会为 GPU 保留所有 16 个通道,并通过其南桥(可能有额外的 PCI 通道)连接到您的 NVME。我不知道 Macbook 是否这样做,但这再次可能会进一步降低性能。

相比之下,Xeon 拥有的大量通道让主板设计师可以更自由地创建真正快速的 I/O 平台。此外,AWS 服务器通常没有安装 GPU,因此不需要为 GPU 使用保留任何通道。同样,我个人并不了解 AWS 服务器的实际架构,但可以创建一个在编译 Babel 项目方面胜过 Macbook 的服务器。

所以最终使得 EC2 实例胜过 Macbook 的主要因素是:

  1. CPU 直接支持的 PCI 通道数

  2. NVME 驱动器支持的 PCI 通道数

  3. NVME 通道如何连接到 CPU

其他可能因素包括:

  1. I/O 总线的速度(PCI2 与 PCI3 等)

  2. RAM 速度

  3. 可用的 DMA 通道数(仅此一项就需要很长的回答,因此我略过了它,但其原因与 PCI 通道类似)

答案2

基准测试是对一些非常具体的性能特征(峰值指令率)的模糊指示,通常不考虑系统中的其他因素。

以下是一些可能对程序产生重大影响但不会对峰值教学率产生影响的因素的非详尽列表:

  • 内存。类型、带宽、通道。这些都会影响数据到达 CPU 的速度,从而使其工作。与台式机或笔记本电脑 CPU 相比,服务器通常拥有更多 RAM 通道、更高数量和更高的峰值带宽数字。如果您无法以足够快的速度将数据传送到 CPU 以达到该速率,那么拥有高单核指令速率对您来说毫无意义。
    作为一个简单的检查,我查看了一下,8180 至强(我能找到的最接近的)有 6 个内存通道,而您的笔记本电脑 CPU(希望)设置了 2 个通道(或者设计不佳,只有一个通道)。服务器的内存带宽是笔记本电脑的 3 倍。对于内存密集型任务来说,这将产生巨大的差异。
  • 硬盘。更快的硬盘、SDD 等对于将数据传送到内存以供 CPU 处理有很大影响。SSD 在寻找小块数据时要快几个数量级,批量传输也快得多。NVMe 甚至更快。服务器通常使用 RAID 进行备份,也可以设置为原始速度。虽然它们可能都是 NVMe,但服务器场可能在 RAID 0 或 01 中拥有企业级磁盘,并且比单个磁盘更快,尤其是在共享机器上,因为希望对虚拟机的影响最小。
  • 热限制。基准测试,尤其是笔记本电脑和超便携式机器的基准测试,通常只能持续足够长的时间才能看到性能的初始提升。随着时间的推移,由于风扇无法跟上热量输出,热库会变满,并且初始涡轮增压速度会下降到“正常”峰值时钟频率。这可能会扭曲基准测试结果,并使笔记本电脑看起来比在长期负载下的性能好得多。服务器往往具有过度指定(且噪音大)的冷却系统以确保性能,笔记本电脑设计用于安静的家庭舒适度,风扇功率要小得多。您在基准测试中看到的可能与您面前的热量限制不同,您的性能可能不如它,并且可能会更快受到限制。
  • 瓶颈。服务器的 I/O 将远多于笔记本电脑。更多的 PCIe 通道、更多的专用 IO 端口和更高的外围设备带宽意味着更多的数据沿着无竞争路径传输。多个 PCIe 设备在连接到 16 通道 CPU 的多路复用器上争用时间,其速度将比具有 40 多个专用通道的 CPU 慢。
  • 核心。拥有更多核心不仅会影响您在一个核心上执行的任务,还意味着任务不会争夺时间。代价是,如果更多核心争夺总线时间,则更容易达到内存带宽限制。
  • 缓存。服务器 CPU 往往具有更大的 CPU 缓存。虽然这更像是一种优化,但更大的缓存确实意味着更少的时间进入内存,并且比较小的缓存更能让 CPU 达到峰值性能。单核基准测试可能足够小,可以适应大多数缓存大小,因此无法告诉您有关系统其余部分的任何信息。
  • 图形。与 PCIe/内存总线争用相关,您的笔记本电脑将进行图形工作,很可能使用 iGPU。这意味着您的系统内存正在被使用(并且内存带宽被窃取)来驱动图形显示。服务器可能没有这些,很可能是计算集群中的无头节点。服务器的图形开销要小得多。

消费级 CPU 确实很强大,但服务器级 CPU 具有更多的逻辑、控制和带宽,可用于更广泛的系统。但一般来说,这没问题。我们不希望 15 瓦处理器的性能与价格高出 10 倍且功率预算为 140 瓦的 CPU 相同。额外的功率预算提供了更多的自由。

如果服务器 CPU 具有与台式机或笔记本电脑 CPU 相同的性能,那么两者之间就没有区别了。

只是为了进一步强调这一点:类似的单核分数只是告诉你核心在理想条件下是相当可比的。从理论上讲,它们的性能可能很接近,但这并不能说明整个系统的情况,以及 CPU 与其他组件绑定时的性能。单核速度人为地集中在系统的一个小点上,比大多数正常使用系统时遇到的要多。

要了解更多关于为什么一个系统比另一个系统“更好”的信息,你需要更多地关注所谓的“真实世界”基准,这将显示出(仍然是人为的,但)更具可比性系统性能指标,希望能给出一些瓶颈可能存在的位置。更好的方法是进行测试,以表明对于该工作负载,服务器级系统及其底层架构和组件要好得多。

答案3

补充 Mokubai 的精彩答案:

  • 指令集扩展。某些扩展(例如 AVX-512)可用于服务器处理器(例如问题中提到的 SKX 处理器),但不能(或只能在稍后)用于消费级处理器。例如,问题中的 Coffee Lake 消费级 CPU 不支持 AVX-512。我不认为编译器会受到太大影响,但如果您要执行某些数字任务,包括科学计算或机器学习,这可能会造成差异。

  • 核心互连。与单线程任务无关,但当使用多个核心时,互连类型会影响核心之间通信的“速度”。虽然消费级处理器使用环形互连,但服务器处理器是第一个使用网状互连

答案4

除了其他答案之外,我想补充一点,任何给定基准测试中使用的指令可能与编译器中使用的指令不匹配。基本上,每个处理器在某些类型的指令上可能更快,或者在某些情况下,一个处理器的性能可能比另一个处理器更好,例如分支预测失败。

一个代码不能保证能预测另一个代码的性能。这是因为它们以不同的方式做不同的事情。

例如,您可以拥有一款较新的 Core2 处理器(如 Q9550),超频 33%(相当可行),并且它在许多任务上可能会匹敌或超过频率较低的第二代 i5 处理器,尽管后者更新。

但是,如果您有一个代码序列,其中涉及大量具有高度随机性的分支指令,那么由于 Core2 处理器在分支预测失败时的性能不佳,因此 i5 的性能可能会比 Core2 好很多倍。

这种事情发生在各种微观层面,适用于各种指令和处理类型。这就是为什么一个 CPU 在 Cinebench 基准测试(视频编码)中表现更好,但在 SunSpider 基准测试(javascript)中表现更差的原因。

相关内容