ARM VPS 与 x86 VPS 有何不同?兼容性检查
ARM VPS 通常每核心成本更低,但 x86-64 程序无法直接运行。了解 arm64、aarch64、amd64 的区别,并用命令检查 Docker 镜像和软件是否兼容。
迁移到 ARM VPS 后会有什么变化
ARM VPS 运行的 Linux 和 Nginx 与 x86 VPS 相同,而且每个核心的价格通常更低。迁移的风险在于兼容性。为 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 输出 arm64 和 amd64。这两个结果都正确。Linux 内核和 Debian 打包系统为同一指令集采用了不同名称,因此 aarch64 和 arm64 表示同一个架构,x86_64 和 amd64 表示另一个架构。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 errorexec format error 表示内核拒绝运行该文件,因为其 ELF(可执行与可链接格式)头声明的机器类型不是此 CPU 支持的类型。没有任何设置可以修复此问题。该指令集不存在于 CPU 硬件中。
部署前检查清单:
docker buildx imagetools inspect nginx:1.27输出会为清单列表中的每个镜像列出一行 Platform:,例如 linux/amd64 和 linux/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-agentapt-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] 的行会被跳过。因此,软件包看似缺失,实际原因是该 pin 配置。
哪些工作负载可以直接运行,哪些需要先检查
解释型语言和字节码运行时本身就具备可移植性。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 并读取结果,不要直接假设页面大小。页面大小并不是唯一会影响你的内核决策,因为云服务商提供的内核版本还决定了任务如何调度到各个核心上;Linux 7.2 中新增的缓存感知调度同样适用于 arm64 和 x86-64。
还有一些较小的差异也值得了解。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 月的实际情况。虚拟化平台供应商按照与 x86-64 相同的生命周期发布 arm64 版本,说明该平台确实取得了进展。首日获得支持的硬件只有两个 CPU 系列。
提交前检查清单
- 在测试实例上运行
uname -m,确认其输出aarch64。 - 对 Compose 文件中的每个镜像运行
docker buildx imagetools inspect,确认每个镜像都有一行linux/arm64平台信息。 - 在 ARM 实例上运行
apt update,并查看它输出的每条Skipping acquire警告。 - 打开所依赖的每个闭源代理的下载页面,按名称查找 arm64 或 aarch64 构建版本。
- 运行
getconf PAGESIZE,并在确定内存规格前记录其返回结果。 - 分别在待选的 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 重新构建,使一个标签同时服务于两种架构。
ARM 服务器上的 exec format error 是什么意思?
内核尝试执行一个 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 页面内核会改变包含大量小型映射的进程的内存占用。未通过这 4 项检查中任意一项,都是让该服务器继续使用 x86 的理由。