发布于 ,更新于 

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

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

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

在本文编写时期,Arch Linux 还没有支持 x86-64-v4 架构,因此下文全部使用 v3。如果你的 CPU 支持 x86-64-v4,就把所有 v3 替换为 v4 即可。

⚠️ 操作前须知

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

本文提到的第三方软件仓库没有国内镜像源,所以速度很慢,请使用透明代理或提高 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 架构。v4 架构同理。

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

CachyOS

CachyOS 是一个基于 Arch Linux 的发行版,其使用 x86-64-v3 架构,并且提供开启了 -O3thinlto 优化的软件包。

  • 执行如下命令:

    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-mirrorlist-17-1-any.pkg.tar.zst' 'https://mirror.cachyos.org/repo/x86_64/cachyos/cachyos-v3-mirrorlist-17-1-any.pkg.tar.zst' 'https://mirror.cachyos.org/repo/x86_64/cachyos/cachyos-v4-mirrorlist-5-1-any.pkg.tar.zst' 'https://mirror.cachyos.org/repo/x86_64/cachyos/pacman-6.0.2-10-x86_64.pkg.tar.zst'
  • 编辑 /etc/pacman.conf,用 Architecture = x86_64 x86_64_v3 替换掉原有的 #Architecture = auto,并在原版软件仓库 (core、extra、community) 上方加入 cachyos-v3 仓库:

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

    [cachyos-extra-v3]
    Include = /etc/pacman.d/cachyos-v3-mirrorlist

    [cachyos-v3]
    Include = /etc/pacman.d/cachyos-v3-mirrorlist

ALHP

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

  • 从 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

仓库的有些重要软件包(比如 icu openssl)可能会更新不及时,请把 CachyOS 放在 ALHP 上方。

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

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

  • linux-cachyos 内核有搭载了不同调度器的不同版本,可以先 sudo pacman -Ss linux-cachyos 查看所有版本,之后选择安装。如果你选择困难症,直接安装 linux-cachyos linux-cachyos-headers 就好。

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

CachyOS 软件仓库中,32 位库也启用了 thinlto 优化。确保 cachyos-v3multilib 上方即可。


📦 如何编译出 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",如果需要编译 Go 软件包,则加入 GOAMD64="v3"