本页目录
性能测试只有在可重复时才有意义。本指南提供一套简明的方法,以及针对 CPU、内存、硬盘和网络的确切命令,帮助您检查新服务器、公平地对比两台机器或发现问题。我们不公布服务器的性能测试分数:您可以用这些命令自行测量。
方法:确保结果可比
- 在空闲系统上测试。停止您的应用程序,并用
top确认没有其他进程占用 CPU 或硬盘。全新安装后,请等待初始 RAID 同步完成:cat /proc/mdstat中不应显示任何正在进行的resync或recovery。 - 每项测试运行三次,取中位数。如果几次结果差异很大,请先查明原因,再采信任何数字。
- 记录测试环境:CPU 型号(
lscpu)、内核(uname -r)、操作系统版本、工具版本、文件系统、RAID 布局以及完整的命令行。 - 在相同条件下对比:两台机器使用相同的操作系统、内核、工具版本和参数。线程数、块大小或队列深度不同,两组结果就失去了可比性。
在 Ubuntu 或 Debian 上安装工具:
apt install -y sysbench p7zip-full fio iperf3在 AlmaLinux 或 Rocky Linux 上,sysbench 和 7-Zip 需从 EPEL 安装:
dnf install -y epel-release
dnf install -y sysbench p7zip-plugins fio iperf3CPU:sysbench 与 7-Zip
sysbench cpu --threads=1 --time=30 run
sysbench cpu --threads=$(nproc) --time=30 run对比 events per second。单线程结果反映单核速度,大多数游戏服务器和许多 Web 请求都依赖于此。多线程结果体现编译构建、渲染和虚拟化等任务的总吞吐量。该测试在 CPU 缓存内计算素数,因此几乎无法反映内存或实际应用的性能。
7z b
7z b -mmt17-Zip 的内置基准测试以 MIPS 为单位评估压缩和解压缩性能;请看综合两者的 Tot: 行。-mmt1 可将其限制为单线程运行。
内存:sysbench
sysbench memory --threads=1 --memory-block-size=1M --memory-total-size=100G run
sysbench memory --threads=$(nproc) --memory-block-size=1M --memory-total-size=100G run查看 MiB/sec 这一行。添加 --memory-oper=read 可测量读取速度而非写入速度。多线程带宽在很大程度上取决于内存通道数:8 通道或 12 通道的 EPYC 平台,其扩展能力远超双通道的桌面平台。
硬盘:fio
切勿对裸设备运行 fio 写入测试,无论是 /dev/nvme0n1、分区还是存有数据的 md 阵列:fio 会覆盖其内容,破坏文件系统和 RAID 元数据。请务必按照下文的方法,在已挂载且剩余空间充足的文件系统上对文件进行测试。
每条命令先预热 5 秒,再运行 60 秒,绕过页缓存(--direct=1),并使用 8 GB 的测试文件:
fio --name=seq-read --filename=/var/tmp/fio.test --size=8G --rw=read --bs=1M --ioengine=libaio --iodepth=16 --numjobs=1 --direct=1 --runtime=60 --time_based --ramp_time=5 --group_reporting
fio --name=seq-write --filename=/var/tmp/fio.test --size=8G --rw=write --bs=1M --ioengine=libaio --iodepth=16 --numjobs=1 --direct=1 --runtime=60 --time_based --ramp_time=5 --group_reporting
fio --name=rand-read --filename=/var/tmp/fio.test --size=8G --rw=randread --bs=4k --ioengine=libaio --iodepth=32 --numjobs=4 --direct=1 --runtime=60 --time_based --ramp_time=5 --group_reporting
fio --name=rand-write --filename=/var/tmp/fio.test --size=8G --rw=randwrite --bs=4k --ioengine=libaio --iodepth=32 --numjobs=4 --direct=1 --runtime=60 --time_based --ramp_time=5 --group_reporting
rm /var/tmp/fio.test- 顺序 1M 测试的结果是带宽(
BW=):这对备份、媒体和大文件至关重要。 - 随机 4k 测试的结果是
IOPS:这对数据库和虚拟机至关重要。还要查看clat percentiles:对于交互式负载,第 99 和第 99.9 百分位数比平均值更能说明问题。 - RAID 1 可同时从两块硬盘读取数据,因此并行随机读取的性能可能超过单块硬盘,而每次写入都要写入两块硬盘。
- SSD 写入缓存:许多 SSD 会先将写入数据存入高速缓存,缓存写满后速度就会下降。运行更长时间(
--runtime=300)可以测出持续写入速度。 - ZFS 会将数据缓存在内存中,可能使读取结果虚高:请使用大于内存容量的测试文件,或直接对实际应用进行性能测试。
在较新的内核上,--ioengine=io_uring 是 libaio 的理想替代方案;请在参与对比的每台机器上使用相同的引擎。
网络:iperf3
iperf3 用于测量您所控制的两台机器之间的吞吐量。在一端启动服务端,在其防火墙中为测试开放 TCP 端口 5201,测试完成后按 Ctrl+C 停止:
iperf3 -s在另一台机器上测试两个方向(-R 用于反转测试方向):
iperf3 -c 203.0.113.10 -P 4 -t 30
iperf3 -c 203.0.113.10 -P 4 -t 30 -R在标准的 1500 字节 MTU 下,1 Gbps 端口的 TCP 有效载荷最高约为 940 Mbit/s,10 Gbps 端口约为 9.4 Gbit/s;在 10 Gbps 端口上请使用更多并行流(-P 8)。结果还受对端、距离以及途经的每个网络的限制:测量端口时,请以同一区域内的服务器为对端;测量链路时,请以您的用户所在地为对端。延迟和路由检查请参阅网络测试。
解读与对比结果
- 根据负载选择测试项:游戏服务器看单线程 CPU 和延迟,数据库看随机 4k IOPS 和延迟,编译构建和虚拟化看多线程 CPU 和内存带宽。
- 最后用您自己的应用进行测试。合成测试只能单独考察某一个组件;对实际服务进行负载测试(例如对 PostgreSQL 使用
pgbench),才能回答您真正关心的问题。 - 公平对比:使用相同的命令、相同的操作系统和内核,在空闲系统上测试,每项各运行三次。各配置的硬件规格均列于对比服务器页面。
- 排查异常值。如果结果远低于同类硬件,可能意味着降频或硬件故障:请先检查硬盘健康状况和温度。
后续步骤
- 使用 mtr 和 iperf3 检查到用户的网络链路。
- 需要更多核心或更快的存储?对比高性能型和企业级服务器。
- 结果远低于硬件应有的水平?请将您的命令和输出发送给技术支持。