📈 给 Arch Linux 「大脑升级」到 x86-64-v3 架构,获得性能提升

x86-64-v3 是 x86-64 处理器架构的一个「微架构」,搭载于 Haswell 及其之后的处理器,其支持 AVX2 等新指令集。据传将程序编译为 x86-64-v3 架构可以获得大约 10% 的性能提升 (不确定)。

Arch Linux 支持 x86-64-v3 架构,因此将内核、编译器等软件包更换为 x86-64-v3 架构可以提升性能,虽然这是 Gentoo 偏执狂才会干的事,但我们 Arch 也可以尝试一下。

⚠️ 操作前须知

用第三方软件仓库替代官方软件仓库有风险,请谨慎执行!

本文提到的第三方软件仓库没有国内镜像源,所以速度很慢,请使用透明代理或提高 pacman.conf 中的 ParallelDownloads 值。

🔍 检查是否支持 x86-64-v3 架构

在终端中执行 /lib/ld-linux-x86-64.so.2 --help | grep "x86-64-v",如果输出中有 x86-64-v3 (supported, searched) 字样,即代表支持 x86-64-v3 架构。

🗃️ 更换 x86-64-v3 架构软件仓库

  • 从 AUR 安装 alhp-keyring alhp-mirrorlist 这两个软件包。

  • 编辑 /etc/pacman.conf,在原版软件仓库 (core、extra、community) 上方加入如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    [core-x86-64-v3]
    Include = /etc/pacman.d/alhp-mirrorlist

    [extra-x86-64-v3]
    Include = /etc/pacman.d/alhp-mirrorlist

    [community-x86-64-v3]
    Include = /etc/pacman.d/alhp-mirrorlist

ALHP 是社区发起的 x86-64-v3 软件仓库,其提供使用 x86-64-v3 架构编译,并开启了 -O3 和 lto 优化的软件包。但仍有一些软件包未被加入此仓库(比如 vim),所以不能删掉原版的仓库,而是将此仓库放在原版仓库上方。

在添加完成之后,sudo pacman -Syyu 强制刷新数据库并更新系统。此时你的内核也会被替换为 x86-64-v3 架构,所以如果你使用 nvidia,就换为 nvidia-dkms (virtualbox-host-modules-arch 也需要换为 virtualbox-host-dkms),并且还需要 重建引导配置。

🔥 (可选) 使用 CachyOS 的优化内核

CachyOS 是一个基于 Arch Linux 的发行版,其使用 x86-64-v3 架构,并且提供打了一系列补丁,开启了 -O3、thinlto 优化的内核。

  • 执行如下命令:

    1
    2
    3
    sudo pacman-key --recv-keys F3B607488DB35A47 --keyserver keyserver.ubuntu.com
    sudo pacman-key --lsign-key F3B607488DB35A47
    sudo pacman -U 'https://mirror.cachyos.org/repo/x86_64/cachyos/cachyos-keyring-2-1-any.pkg.tar.zst' 'https://mirror.cachyos.org/repo/x86_64/cachyos/cachyos-v3-mirrorlist-13-1-any.pkg.tar.zst'
  • 编辑 /etc/pacman.conf,用 Architecture = x86_64 x86_64_v3 替换掉原有的 #Architecture = auto,并在所有仓库后加入 cachyos-v3 仓库:

    1
    2
    [cachyos-v3]
    Include = /etc/pacman.d/cachyos-v3-mirrorlist
  • linux-cachyos 内核有搭载了不同调度器的不同版本,可以先 sudo pacman -Ss linux-cachyos 查看所有版本,之后选择安装。如果你选择困难症,直接安装 linux-cachyos linux-cachyos-headers 就好。

🔥 (可选) 使用 CachyOS 的优化 32 位库

CachyOS 软件仓库中,32 位库也启用了 thinlto 优化。添加 CachyOS 软件仓库的步骤参考上一节,不过把 cachyos-v3 仓库放在原版 multilib 仓库的上面。

在添加完成之后,sudo pacman -Syyu 强制刷新数据库并更新系统。

♻️ 重建引导配置注意事项

在安装 x86-64-v3 架构内核后,使用 grub-mkconfig 重建引导时会报错。

1
2
/usr/share/grub/grub-mkconfig_lib: 第 288 行:printf: “$”:无效格式字符
在

具体原因我也不是很清楚,解决办法为在命令前加入 env LANG=C 即可,比如 env LANG=C sudo grub-mkconfig -o /boot/grub/grub.cfg。


📦 如何编译出 x86-64-v3 软件包

如果使用正常的 make 编译,则需要加入 -march=x86-64-v3 -mtune=native CFLAGS。

如果使用 Arch 构建系统 makepkg 编译 (如从 AUR 安装软件包),则需要更改 makepkg 配置文件。

首先把原版 makepkg 配置文件复制到用户目录下:

1
install -D /etc/makepkg.conf ~/.config/pacman/makepkg.conf

之后编辑之:

首先将 CFLAGS 中的 -march=x86-64 -mtune=generic 改为 -march=x86-64-v3 -mtune=native。

如果有更高的性能需求,可以把 -O2 改为 -O3,不过这会导致小部分软件包无法正常编译,并且会导致更高内存占用。

然后在 CFLAGS 末尾加入 -mpclmul 参数以启用 PCLMUL 指令集。

根据 CPU 不同,还可以选择以下扩展指令集:

1
-mcx16 -msahf -mpopcnt -msse3 -msse4.1 -msse4.2 -mssse3 -mavx -mavx2 -mbmi -mbmi2 -mf16c -mfma -mlzcnt -mmovbe -mxsave

再把 OPTIONS 中的 !lto 改为 lto,加入 LTOFLAGS="-flto=thin -falign-functions=32" 以启用 thinlto 优化。

如果需要编译 Rust 软件包,则加入 RUSTFLAGS="-Copt-level=3 -Ctarget-cpu=x86-64-v3 -Clto=fat -Ccodegen-units=1 -Clinker-plugin-lto",如果需要编译 Go 软件包,则加入 GOAMD64="v3"。