优化 Ubuntu 在 amd64 架构上的性能
by Canonical on 6 February 2024
每个人都希望自己使用的 Linux 发行版运行速度快。当然,这一点不言自明:谁会希望自己的发行版运行速度慢呢?
但是,发行版运行速度快又意味着什么呢?例如,Ubuntu 21.10 将软件包的默认压缩算法改为 zstd,这使得软件包下载和解压缩速度变得更快,从而提高了 Ubuntu 上一项重要操作的性能。当然,还有诸多其他方面的性能,但本篇文章将着眼于一些完全不同的东西——Ubuntu 假定可用的处理器功能。
在本篇文章中,笔者将浅谈一下 amd64 架构的发展史,以及我们正在携手 Intel 进行的一些调研,以更好地利用新一代处理器。
背景
到目前为止,Ubuntu 最常用的架构是 amd64,在某些情况下也称为 x86-64。Ubuntu 仍是针对最早的 amd64 CPU, 即 2003 年的 AMD K8 和 2004 年的 Intel 64 位 Prescott 构建而成,使用的是最原始的指令集架构(ISA)。
多年来,Intel 和 AMD 增加了许多的 ISA 扩展,例如:
- SIMD:SSE3、SSE4、AVX、AVX512 等
- 专用的:RDRAND、AES-NI、VNNI
- 更通用的:cmpxchg16b(原子比较和交换)、vfmadd*(浮点数的融合乘加)、movbe(字节顺序转换)
如不使用这些新指令来提高整个发行版的性能,可就错失良机了。诸如 glibc 和 openssl 这样的核心软件包会在运行时进行检测,以便在新的指令可用时使用新指令,但有更多的软件包并不会这样做。
像 amd64 这样的架构与 POWER 架构之间的一个重大区别在于实现的多样性。多年来,POWER 架构已通过多种方式进行了扩展,但是可以合理假定 2018 年的处理器支持 2013 年处理器所支持的全部指令。这对于 amd64 架构而言却并非完全如此。例如,2007 年在 Penryn 微架构中引入了 SSE4.1,但直到 2012 年才发布了不支持 SSE4.1 的设计(例如,Centerton 系列 Atoms)。此外,AMD 和 Intel 都推出了对方最终实现的扩展(以及从未真正被广泛使用并最终消失的扩展,如 3DNow! 和 TSX)。
长期以来,动态加载器(glibc 的一部分)允许发行版在检测到支持新的 CPU 属性时通过搜索额外的目录来利用这些新的 CPU 属性,但是在 2.33 之前的 glibc 的 amd64 版本上,这些额外的目录系基于特定的、定义不明确的功能选择。例如,据笔者所知,自 2014 年以来,大多数 Intel 处理器上对 /lib/x86_64-linux-gnu/haswell 进行了搜索,但在 AMD 处理器上却完全没有。
2020 年,glibc 开发人员,特别是来自 Red Hat 的 Florian Weimer,受够了这种混乱现状,于是在 libc-alpha 邮件列表上提出了一个解决方案:将合理的 CPU 属性集组合到大多数连同支持的“层级”中,并让动态加载器根据这些层级名称来搜索目录。
然后是解决一些意义不大的技术问题,定义了四个层级,每个层级都包括上一层级:“V1”或基线、“v2”、“v3”、“v4”,这些定义被添加到 “psABI” 规范(大致而言,即定义 amd64 Linux 系统二进制代码的文档):
层级名称 | CPU 属性 | 示例指令 |
---|---|---|
(baseline) | CMOV | cmov |
CX8 | cmpxchg8b | |
FPU | fld | |
FXSR | fxsave | |
MMX | emms | |
OSFXSR | fxsave | |
SCE | syscall | |
SSE | cvtss2si | |
SSE2 | cvtpi2pd | |
x86-64-v2 | CMPXCHG16B | cmpxchg16b |
LAHF-SAHF | lahf | |
POPCNT | popcnt | |
SSE3 | addsubpd | |
SSE4_1 | blendpd | |
SSE4_2 | pcmpestri | |
SSSE3 | phadd | |
x86-64-v3 | AVX | vzeroall |
AVX2 | vpermd | |
BMI1 | andn | |
BMI2 | bzhi | |
F16C | vcvtph2ps | |
FMA | vfmadd132pd | |
LZCNT | lzcnt | |
MOVBE | movbe | |
OSXSAVE | xgetbv | |
x86-64-v4 | AVX512F | kmovw |
AVX512BW | vdbpsadbw | |
AVX512CD | vplzcntd | |
AVX512DQ | vpmullq | |
AVX512VL | n/a |
参考:psABI 第 14 页
如上所述,很难说特定一代的处理器支持某个特定层级,但大体上,2009 年以后的大多数处理器都支持 v2, 2015 年以后的大多数处理器都支持 v3。
V4 较为复杂:Intel 第 11 代处理器支持,但第 12 代和第 13 代处理器不支持,AMD 新推出的 Zen 4 微架构增加了 V4 支持功能。AVX512 的未来会怎样难以知晓,本文将不予赘述。
从 glibc 到工具链
虽然定义的这些层级的初衷是将动态加载器寻找共享库的过程合理化,但它们也为一组假定在发行版所有部分都可用的指令提供了一个实用标签。支持使用“x86-64-v$N”作为 -march 标记值的功能已添加至 11 版中的 GCC 和 12 版的 LLVM 中。
值得注意的是,我们在本文档中只讨论 C 和 C++ 工具链。虽然发行版显然包含了大量且不断增加的其他语言代码(Python、Go、Rust、Java、Ruby 等),但大部分代码都是 C/C++ 语言。对于部分语言生态系统,特别是 Python,许多性能敏感的代码都是用 C/C++ 语言编写的(例如 numpy)。其他静态编译工具链(如 Rust 和 Go)确实支持选择精确的目标 ISA,但在本文中,我们将只讨论 C 和 C++。
突破基线?
更改 -march 的默认值是 GCC 打包的一项细微改变,并且部分发行版已经进行了此更改——RHEL9 和 SUSE Tumbleweed(自 2022 年 11 月开始)所针对的目标都是 x86-64-v2。
这些改变虽然会产生成本,但也带来了好处:
- 对于硬件太过老旧而无法支持 v2 指令的用户而言,这些操作系统根本无法工作。
- 对于购买了更好硬件的用户而言,这些操作系统可以更好地利用这些硬件。
对于 RHEL 等商业发行版,这或许仍有一定的意义:如果花钱购买 RHEL(或 SLES,亦或者其他)许可证,则可能已经运行了最新的硬件,或者至少更新不到 10 年以内的硬件所产生的额外成本相当微不足道。值得注意的是,SUSE 推出的新款“自适应 linux 平台”产品最初所针对的目标是 v3,后来又降至 v2。
对于 Ubuntu(或 Fedora)等免费发行版,计算有所不同:允许用户通过安装免费的 linux 发行版来延长硬件寿命是开源世界的一个重要积极的方面,而且仍在Ubuntu 中使用 2008 年一代硬件的用户很有可能是最不能够升级的用户。
也就是说,硬件寿命不是永恒的。几年前,维护对 32 位 x86 电脑的全面支持的成本开始超过收益,于是我们停止构建大多数软件包。做出这样深思熟虑的决定需要以数据作为支持。具体包括:
- 使用情况——有多少 Ubuntu 用户使用的硬件只支持 v1 或 v2?
- 性能——将默认值更改为 x86-64-v2 或 x86-64-v3 会带来多少性能改进?
以上两个问题都不容易回答。
亲自尝试
我们在继续自身的性能分析和进一步评估用户需求的同时,已在社区发布了体验版 Ubuntu 23.04 服务器构建器——可使用 -march=x86-64-v3 和 -mtune=icelake-server,供用户试用。我们考虑了在系统范围内使用 v3 的潜在优点和缺点,您的反馈和观感对我们而言非常宝贵。以下是我们对自己提出的一些问题:
- 总体而言,Ubuntu 的 v3 版本是否比基线 v1 版本更快?正如上面所提到的,这可能意味着从定量基准测试到用户角度对速度更宽松、定性的感觉的诸多差别。
- 是否有某些领域的性能因 v3 而显著提高或出现了下降?
- 这些变化是否会带来破坏?
本篇文章将介绍在哪里可以找到该构建器的安装程序,该构建器不仅是使用重新构建的软件包构建而成的,而且默认安装重新构建存档中的软件包。请注意,此构建器仅用于测试。使用此安装程序安装的系统将不会收到任何安全(或任何其他)更新,并且不适合在生产中使用。
基准测试完成后,我们将发布另一篇文章介绍测试内容和测试结果。请持续关注!
订阅博客文章
查看更多内容
Canonical 参加 2025 RISC-V 中国峰会
年度盛会 RISC-V 中国峰会汇聚全球 RISC-V 社区,包括制定该架构规范的技术、行业、领域和生态系统团体。所有专家将于7月16日至18日齐聚在上海张江科学会堂,分享技术突破、行业里程碑和案例研究。Canonical 很荣幸再次赞助 RISC-V 峰会,欢迎于展期间莅临 1层 D26 展位与我们洽谈! Canonical 在 RISC-V 生态系统中的合作 Canonical 持续积极参与 RISC-V 生态系的发展,与本地与国际合作伙伴深度协作,推动开源操作系统的广泛部署与商用。通过与领先的 RISC-V 硬件合作伙伴合作,Canonical 确保开发人员能够访问安全设计、可扩展且可靠的操作系统,从而加速创新并简化开发流程。Canonical 拥有深厚的 x86 […]
Canonical 官方构建版 OpenJDK – 正式发布
长久以来,Java 在大型企业级软件开发领域占据领军地位,90% 的《财富》500 强企业将其用于后端开发,尤其在金融、医疗及政府等关键行业。 相较于大多数开发者,Java 开发者更需要承担这样的任务:在实现新功能与满足遗留应用的安全性、稳定性和性能等关键要求之间取得平衡。管理不同的 Java 版本、安全更新及部署构件,面临极大的复杂度。 基于上述原因,我们决定加强对工具链的投入,提供一套更全面的解决方案,让企业用户和社区成员都能从中受益。Canonical 的 OpenJDK 支持方案围绕以下核心原则构建: 下面我们将针对上述各要素逐步展开深入探讨。 安全增强保障:提供长效安全保障与稳定运行支持 Ubuntu Pro 订阅服务为所有 OpenJDK LTS 构建版提供 […]
Ubuntu 正式支持 NVIDIA Jetson
Ubuntu 正式支持 NVIDIA Jetson:助力边缘 AI 未来发展 Canonical 宣布推出支持 NVIDIA® Jetson Orin™ 的 Ubuntu 正式发布版本,该版本专为边缘 AI 和机器人领域打造,为全球 AI 开发者带来优化的性能、开箱即用的兼容性以及实现高性能 AI 解决方案的便捷途径。 Ubuntu 发行商 Canonical 宣布正式支持 NVIDIA Jetson 平台,标志着其与 NVIDIA 的合作迎来重要里程碑,为加速边缘 AI 领域创新再添动力。此次正式发布(GA)版本为 Ubuntu 与 NVIDIA Jetson 系统级模块解决方案的强大组合赋予了企业级的稳定性与技术支持。 为各行各业 AI 创新赋能 此次通过 Canon […]