SSD Nodes Learn 🎉 VPS $5.50/月起
指南 Matt Connor作者: Matt Connor

ARM VPS 与 x86 VPS 有什么区别?兼容性检查

ARM VPS 通常每核心更便宜,但 x86-64 程序不能直接运行在 arm64。用 uname、Docker manifest 等命令检查镜像和软件兼容性。

迁移到 ARM VPS 后有哪些变化

ARM VPS 运行与 x86 VPS 相同的 Linux 和 Nginx,并且每个核心的费用通常更低。迁移的风险在于兼容性。为 x86-64 编译的程序完全无法在 arm64 上运行,因此堆栈中的每个软件都必须提供 arm64 构建版本,或者能够由您自行重新编译。

大多数现代堆栈无需额外处理即可通过兼容性检查。问题主要集中在两个方面:容器镜像过去只为一种架构构建,以及闭源软件没有提供 arm64 下载版本。下面的命令可以在您为实例付费前,帮助您针对自己的堆栈确认这两个问题。如果您还在确定需要哪种服务器,请先阅读 什么是 VPS,以及它与共享主机有何不同

arm64、aarch64、amd64:这些名称分别代表什么

在执行其他操作前,先在任意实例上运行以下命令。

uname -m
dpkg --print-architecture
lscpu | head -n 12
getconf PAGESIZE

在 ARM 机器上,uname -m 输出 aarch64;在 Intel 或 AMD 机器上,输出 x86_64。对于这两类机器,dpkg --print-architecture 分别输出 arm64amd64。这两种结果都正确。Linux 内核和 Debian 打包系统为同一指令集采用了不同的名称,因此 aarch64arm64 表示同一类架构,x86_64amd64 表示另一类架构。Docker 使用 Debian 风格的名称,所以镜像平台会显示为 linux/arm64

在 arm64 上,/proc/cpuinfo 中没有 model name 行。这里会显示一个 Features 字段,硬件加密功能会以 aes pmull sha1 sha2 等标志表示。这些功能属于 ARMv8 Cryptographic Extensions,作用类似于 Intel 和 AMD 处理器上的 AES-NI:使用硬件加速 TLS(传输层安全)和磁盘加密。检查 VPS 是否支持 AES 硬件加速介绍了如何在这两种架构上执行测试。

容器为什么会最先出问题,以及错误表现

每个 Docker 镜像清单都会记录其构建目标架构。将只有 amd64 清单的镜像拉取到 arm64 主机时,拉取操作会成功。首次启动进程时才会失败:

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
exec /usr/local/bin/docker-entrypoint.sh: exec format error

exec format error表示内核拒绝运行该文件,因为其 ELF(可执行与可链接格式)头声明的机器类型不是此 CPU 支持的类型。没有任何设置可以修复此问题。CPU 硬件中不存在这些指令。

部署前检查清单:

docker buildx imagetools inspect nginx:1.27

输出会为清单列表中的每个镜像列出一行 Platform:,例如 linux/amd64linux/arm64。如果缺少 linux/arm64,该标签就无法在 ARM VPS 上启动。docker manifest inspect --verbose nginx:1.27显示相同的信息,但 Docker 将 docker manifest 标记为实验性命令,其行为可能在不同版本之间发生变化,因此应优先使用 imagetools

对于自行构建的镜像,可使用一条命令构建两种架构,并推送清单列表:

docker buildx build --platform linux/amd64,linux/arm64 -t registry.example.com/app:1.4 --push .

在单台主机上为其他架构构建镜像,需要通过内核的 binfmt_misc 处理程序注册 QEMU 用户态模拟:

docker run --privileged --rm tonistiigi/binfmt --install all

使用模拟来构建和测试。不要使用模拟来提供网络流量。Docker 官方文档指出,使用 QEMU 进行模拟“可能比原生构建慢很多,尤其是在编译、压缩或解压缩等计算密集型任务中”。因此,在 ARM 实例上运行经过模拟的 x86 服务,会抵消促使您迁移的性能或成本收益。原生架构场景下的主机设置在两种架构上完全相同:在 VPS 上运行 Docker对此进行了说明;只要 Compose 文件中的每个镜像都有 arm64 清单,现有 Compose 文件无需修改即可使用。

arm64 上是否有我需要的软件包?

Ubuntu 和 Debian 几乎会为 arm64 构建整个软件包仓库,因此 apt install nginx postgresql redis-server 在这两种架构上的行为相同。缺口通常出现在第三方仓库中。

在 ARM 实例上直接使用 apt 查询:

apt-cache policy some-vendor-agent
apt-get install -s some-vendor-agent

如果 apt-cache policy 报告 Candidate: (none),表示已启用的仓库中没有为此架构发布该软件包构建版本的仓库。apt-get install -s 会模拟安装过程且不写入任何内容;在同样的情况下,它会以 E: Unable to locate package 结束。

然后查看 apt update 的输出,不要直接滚过这些信息。仅支持 amd64 的供应商仓库会明确说明这一点:

N: Skipping acquire of configured file 'main/binary-arm64/Packages' as repository 'https://repo.example.com/apt stable InRelease' doesn't support architecture 'arm64'

仓库已配置且可以访问,但其中没有适用于此计算机的软件包。还应检查软件源条目本身。在 arm64 主机上,带有 [arch=amd64] 固定标记的条目会被跳过,因此软件包看起来像是缺失的,实际原因是该固定配置。

哪些工作负载可以直接运行,哪些需要先检查

解释型运行时和字节码运行时在设计上具有可移植性。PHP、Python、Ruby 和 Node.js 在主流发行版中都有 arm64 软件包。Go 和 Rust 只需设置一个目标即可交叉编译为 arm64。LEMP 堆栈、Node API、Nginx 后面的 Go 二进制程序,或 Postgres 数据库,都属于 arm64 上的常规工作。

即时(JIT)编译器会在程序运行时生成机器代码,因此需要针对目标架构的代码生成器。当前版本通常都已提供该支持:OpenJDK、.NET、Node.js 内置的 V8 引擎,以及 PyPy 都支持 Linux 上的 arm64。真正的风险是固定使用的旧版本。部署脚本如果安装几年前发布的运行时,应根据该版本的发布说明检查其是否支持 aarch64,不能默认它可以运行。

包含手写 x86 汇编,或使用 SSE 和 AVX intrinsic 的库,情况相对不明显。大多数库也提供 NEON 路径(NEON 是 ARM 的向量指令集),或提供纯 C 回退实现,因此可以完成编译并运行。性能可能比 x86 构建版本更好,也可能更差。应在您的实例上进行测量,不要根据文章内容预测结果。

闭源软件才是真正的阻碍。供应商提供的监控代理、授权数据库驱动程序、商业控制面板或防病毒 daemon 都是已编译的二进制程序。如果供应商不发布 arm64 构建版本,您就无法自行解决。对于托管服务,cPanel 和 WHM 是最明显的例子:其系统要求列出 x86_64,但没有列出 ARM,因此控制面板服务器应继续使用 x86(已于 August 2026 检查,仍应重新查看供应商自己的要求页面)。如果只有这一点阻碍您迁移,可以在 VPS 上运行的 cPanel 替代方案是开始查找的地方;并应使用相同方法检查每个替代方案的架构支持情况。

内核与页面大小:ARM 实例仍存在差异的地方

x86-64 服务器基本可以互换。ARM 服务器的一致性较低,差异会影响应用下层。

页面大小是最可能在生产环境中产生影响的差异。大多数 arm64 内核使用 4 KiB 页面,与 x86-64 相同。有些内核使用 64 KiB 页面。Red Hat Enterprise Linux 8 for aarch64 默认提供 64 KiB 页面内核;RHEL 9 将默认值改回 4 KiB,同时保留单独的 kernel-64k 软件包,供需要更大页面的工作负载使用。对于包含大量小型映射的进程,64 KiB 页面大小会提高内存占用下限,因为内核能够分配的最小内存块大了 16 倍。在实例上运行 getconf PAGESIZE 并读取实际数值,不要仅凭假设判断。

还有一些较小的差异也值得了解。arm64 没有操作系统 CPU 微码软件包,因此固件更新由云服务提供商负责,而不是通过 apt 提供。ARM 服务器通过 UEFI(统一可扩展固件接口)启动,并通过 ACPI(高级配置与电源接口)描述硬件。某些 x86 功能完全没有对应的 ARM 实现,包括 AMD SEV 内存加密和 Intel GVT-g mediated GPU。

ARM 服务器平台是否已经成熟?

在软件方面,已经成熟。Debian、Ubuntu、Fedora 和 RHEL 都提供一流的 arm64 构建版本,Docker Hub 上的官方镜像也通常支持多种架构。

近期最明确的证据是 Proxmox。2026 年 8 月 5 日,Proxmox 宣布推出首个官方支持的 arm64 版 Proxmox Virtual Environment,即 9.2 版。该版本与 x86-64 版共用软件包仓库和发布周期。它基于 Debian 13.5,包含 Linux 7.0、QEMU 11.0、LXC 7.0 和 ZFS 2.4。除少量架构特定项目外,其配置和工具与 x86-64 版一致。

请阅读同一公告中的限制说明,因为这些内容表明目前获得官方支持的 ARM 服务器硬件范围仍然很窄。Proxmox 在发布首日验证了 NVIDIA Grace 和 NVIDIA Vera 系统,此前还与 NVIDIA 和 Supermicro 一起对 Grace Hopper 硬件进行了联合测试。其他基于 UEFI 的 ARMv8-A 和 ARMv9-A 硬件仅获得尽力支持。仅使用设备树的单板计算机(例如 Raspberry Pi)不受支持。虚拟机只能在自身架构对应的节点上运行,实时迁移仅支持在相同架构的节点之间进行,混合架构集群也不受官方支持。

这就是截至 2026 年 8 月的实际情况。虚拟化平台厂商让 arm64 与 x86-64 使用相同的生命周期发布,这确实表明该平台取得了进展。但首日获得支持的硬件仅包括两个 CPU 系列。

提交前检查清单

  1. 在试用实例上运行 uname -m,确认输出 aarch64
  2. 对 Compose 文件中的每个镜像运行 docker buildx imagetools inspect,确认每个镜像都有一行 linux/arm64 平台信息。
  3. 在 ARM 实例上运行 apt update,阅读其输出的每条 Skipping acquire 警告。
  4. 打开所依赖的每个闭源代理的下载页面,按名称查找 arm64 或 aarch64 构建版本。
  5. 运行 getconf PAGESIZE,并在确定内存规格前记录其结果。
  6. 在 ARM 方案和待比较的 x86 方案上分别运行自有基准测试。

本文不做什么

本文不会给出 ARM 与 x86 之间的性价比。不同提供商和套餐的每核价格各不相同,而且在他人硬件上测得的数值无法预测您的结果。请自行测试。我们的 VPS 基准测试指南介绍了可重复执行的 sysbench 和 fio 测试方法,VPS 的实际成本介绍了比较中的定价因素。存储是独立于 CPU 架构的另一项决策,VPS 上 NVMe 与 SATA SSD 的对比则专门讨论这一部分。请在两个套餐上运行相同的测试,并尽可能使用您自己的工作负载,让测试结果决定选择。

FAQ

我的 Docker 容器可以在 ARM VPS 上运行吗?

如果堆栈中的每个镜像在其清单中都有 linux/arm64 条目,就可以运行。使用 docker buildx imagetools inspect <image> 检查每个镜像,并查找 Platform: linux/arm64 行。Docker Hub 上的官方镜像通常支持多种架构。较小供应商提供的镜像,以及您在 x86 机器上自行构建的镜像,通常不支持多种架构。对于您自己的镜像,请使用 docker buildx build --platform linux/amd64,linux/arm64 ... --push 重新构建,这样一个标签即可同时用于两种架构。

exec format error 在 ARM 服务器上是什么意思?

内核尝试执行一个 ELF 头声明了其他机器类型的二进制文件,因此拒绝执行。在 arm64 主机上,这几乎总是表示二进制文件或容器镜像是 x86-64 架构。Docker 会先发出警告,说明请求的镜像平台 linux/amd64 与检测到的主机平台 linux/arm64/v8 不匹配。解决方法是为正确的架构构建。任何配置更改都无法让 x86-64 二进制文件在 ARM 上原生运行。

arm64 与 aarch64 是同一回事吗?

是。它们是 64 位 ARM 指令集的两种名称。内核通过 uname -m 报告 aarch64,而 Debian 和 Ubuntu 的软件包以及 Docker 平台字符串使用 arm64。另一侧也存在相同的名称差异:uname -m 表示 x86_64,软件包则使用 amd64。如果下载页面只提供 aarch64 文件,那么这些文件就适用于 dpkg --print-architecture 显示为 arm64 的机器。

ARM VPS 比 x86 VPS 更快吗?

这个问题没有普遍适用的答案。您读到的任何单一性能比值,都是在并非您的硬件上测得的。速度取决于具体 CPU 型号、分配给您的核心数、服务商如何处理租户之间的资源竞争,以及您的工作负载对向量指令的利用程度。请使用您实际要选择的两个方案进行基准测试。如果条件允许,请使用您自己的工作负载,然后比较测试结果。

将生产服务器迁移到 arm64 之前应检查什么?

按以下顺序进行4项检查。确认每个容器镜像都有 arm64 清单。确认每个第三方 apt 软件源都发布 binary-arm64。确认每个闭源代理都有 aarch64 下载版本。然后在目标实例上运行 getconf PAGESIZE,因为使用64 KiB 页的内核会改变包含大量小型映射的进程的内存占用。任何一项检查失败,都是继续让该服务器使用 x86 的理由。

#arm64#cpu-architecture#vps#Docker#性能