用 sysbench 和 fio 做服务器基准性能测试的完整步骤
服务器基准性能测试的核心目的是用可重复的命令,把 CPU、内存、磁盘、网络的真实能力量化成数字,方便验收新机器、排查瓶颈或对比不同配置。
下面这套流程在主流 Linux 发行版上都能跑通,重点是每步都要有明确的输入和可核对的结果。
测试前要确认的环境和工具
开始之前,先确认你有一台可以随意读写磁盘的测试机。不要在正在跑业务的服务器上做写测试,因为 fio 的写入会覆盖或占满磁盘空间。
- 系统:CentOS 7/8、Ubuntu 20.04/22.04、Debian 11 等常见版本均可。
- 权限:需要 root 或 sudo 权限来安装软件和调整参数。
- 空闲磁盘空间:建议至少 10 GB,用于 fio 测试文件。
- 测试期间尽量关闭其他占用资源的服务,否则数据会失真。
安装工具包。
CentOS 系列执行:
yum install -y sysbench fio iperf3
Ubuntu/Debian 系列执行:
apt update && apt install -y sysbench fio iperf3
安装完成后用 sysbench --version、fio --version 验证,能输出版本号就说明可用。
如果提示找不到包,可以先执行 yum install -y epel-release 再重试,这是 CentOS 上常见的源问题。
CPU 与内存:用 sysbench 跑出可对比的分数
CPU 测试先看每秒能完成多少事件。
执行:
sysbench cpu --cpu-max-prime=20000 --threads=4 --time=30 run
参数含义:--cpu-max-prime 是计算质数的上限,数值越大负载越重;--threads 设为 CPU 核心数;--time=30 表示持续 30 秒。
结果里重点看 events per second,这个值越高越好。
跑两次取较高值,能减少冷启动带来的偏差。
内存测试换成 memory 模式:
sysbench memory --memory-block-size=1M --memory-total-size=10G --threads=4 run
输出中的 transferred 表示总传输量,Operations per second 反映内存吞吐。
内存测试对虚拟化环境比较敏感,同一台机器多次结果浮动超过 10% 时,要检查是否有其他进程在抢资源。
磁盘 IO:fio 测试要区分顺序和随机
磁盘是服务器基准性能测试里最容易出问题的一环。
先用顺序写测带宽:
fio --name=seqwrite --ioengine=libaio --direct=1 --rw=write --bs=1M --size=2G --numjobs=1 --runtime=60 --group_reporting
再测随机读,模拟数据库场景:
fio --name=randread --ioengine=libaio --direct=1 --rw=randread --bs=4k --size=2G --numjobs=4 --iodepth=32 --runtime=60 --group_reporting
关键参数解释:--direct=1 绕过系统缓存,测的是真实磁盘;--bs=4k 是块大小,4k 随机读写贴近数据库负载;--iodepth=32 是队列深度,SSD 需要较高深度才能跑满。
结果看 bw(带宽)和 iops。
机械硬盘的 4k 随机写 IOPS 通常在几百量级,SSD 则可达数万,差距非常明显。
测试文件默认写在当前目录,如果不希望污染系统盘,可以加 --directory=/data/fio 指定路径。
测试结束后记得手动删除生成的测试文件,否则会一直占着空间。
网络带宽:iperf3 需要两台机器配合
网络测试至少要两台机器,一台做服务端,一台做客户端。
服务端执行:
iperf3 -s
客户端执行(把 IP 换成服务端地址):
iperf3 -c 192.168.1.100 -t 30 -P 4
-t 30 表示测试 30 秒,-P 4 表示开 4 条并发连接。
结果看 sender 和 receiver 两行的 Mbits/sec。
如果带宽远低于预期,先检查是不是走了公网、中间有防火墙限速,或者网卡协商速率只有 100Mbps。
用 ethtool eth0 可以查看当前协商速率,千兆网卡应显示 1000Mb/s。
常见坑和结果验证
缓存没关:sysbench 和 fio 如果不加 --direct=1,测出来的可能是内存速度而不是磁盘速度,数值会虚高。
测试文件太小:fio 的 --size 小于内存容量时,数据可能全落在缓存里。
建议测试文件至少是内存的 1.5 倍。
并发数拍脑袋:--threads 和 --numjobs 不是越大越好,超过 CPU 核心数或磁盘队列能力后,结果反而下降。
先从等于核心数开始调。
只看单次结果:磁盘和网络受邻居影响大,建议同一命令连跑三次,记录中位数,而不是取第一次或最好的一次。
验证是否跑成功,可以看命令退出码,echo $? 返回 0 表示正常结束。
如果中途报错,优先检查磁盘空间、权限和内核参数,例如 ulimit -n 是否限制了并发文件数。
几个实际会被问到的问题
测试结果和厂商宣传差距很大正常吗? 厂商数据多在理想环境下测得,实际受虚拟化、磁盘阵列、网络拓扑影响,有差距是正常的。
重点看同一台机器多次测试是否稳定,而不是和宣传值较劲。
云服务器能做磁盘写测试吗? 可以,但要注意云盘有 IOPS 上限,测出来的是被限制后的值。
部分云厂商对持续高负载有额外限制,测试前最好确认计费规则。
为什么内存测试比 CPU 测试更波动? 内存性能受 NUMA 架构和虚拟机内存超分影响明显。
物理机结果通常更稳定,虚拟机环境建议多测几轮再下结论。
跑完这四类测试,你手里就有了一组可以横向对比的数字。
下次换机器或调整配置时,用同样的命令再跑一遍,就能判断改动是否真的带来了提升。
如果只想快速摸底,优先跑 CPU 和磁盘随机读这两项,它们对大多数业务的体验影响最直接。