外观
基准测试方法:fio 与 iperf3
这篇是本章其他几篇(CPU 绑核与 NUMA、磁盘 IO 调优、网络性能、内存)反复提到的"先测量,再调优"具体怎么做。没有基线数据,任何"感觉更快了"都无法验证。
为什么需要它
调优最常见的失败模式是:改了一堆参数,主观感觉快了,但从来没有量化过改动前后的差异,也不知道是不是别的因素(缓存预热、负载变化)造成的错觉。基准测试解决的就是这个问题:在同样的条件下,改动前测一次,改动后再测一次,只看数字。
基准测试结果只在你自己的环境里有意义
网上的跑分数字换一套硬件、换一种存储、换一个内核版本就可能完全不同。不要用别人的 fio/iperf3 结果决定你要不要改某个参数,自己测一遍改动前后的对比才是唯一可靠的依据。
开始之前
- 测试期间该虚拟机/宿主机上没有其他大量占用资源的任务(备份、其他基准测试)在跑,否则结果会被干扰。
- 磁盘测试和网络测试都建议在客户机内部进行,这样测出来的数字才是应用实际能感知到的性能,而不是宿主机裸设备的理论值。
- 测试工具本身:Debian/Ubuntu 客户机内部安装
sh
# 客户机内部
apt update
apt install -y fio iperf3fio:磁盘性能
fio 只能对着测试文件或专门腾出来的测试盘跑写测试,绝不能对着裸设备或正在用的分区跑
fio 的写测试(--rw=write、--rw=randwrite、--rw=readwrite 等)会真实写入数据。如果 --filename 指向的是一块正在使用的磁盘设备(例如 /dev/sda、/dev/sdb)或者其上的分区,这个操作等同于用随机数据覆盖这块盘,上面原有的分区表、文件系统和数据会被破坏,无法恢复。
安全的做法只有两种:
- 对着一个测试文件跑,放在有富余空间、可以随便读写的文件系统上,例如
--filename=/var/tmp/fio-test.img。测试结束后删掉这个文件即可,不影响其他数据。 - 对着一块专门腾出来、确认没有任何数据的空盘或空分区跑,跑之前用
lsblk -o NAME,SIZE,MODEL,SERIAL,MOUNTPOINT按容量、型号、序列号三重确认目标,并确认它没有挂载、不在任何卷组或 ZFS 池里。
只读测试(--rw=read、--rw=randread)本身不会写入数据,相对安全,但仍然建议只在测试文件或测试盘上进行,避免手滑改错参数。
测试写入吞吐与延迟
客户机内部,对着一个测试文件跑:
sh
# 客户机内部,测试文件路径按实际情况改,确保所在分区有至少 5GB 空闲
fio --name=write-test \
--filename=/var/tmp/fio-test.img \
--size=4G \
--rw=randwrite \
--bs=4k \
--iodepth=32 \
--ioengine=libaio \
--direct=1 \
--numjobs=1 \
--runtime=60 \
--group_reporting| 参数 | 说明 |
|---|---|
--rw | 测试模式:randwrite(随机写,更接近数据库/虚拟机负载)、randread(随机读)、read/write(顺序读写,更接近备份/大文件场景) |
--bs | 块大小,4k 接近数据库/文件系统元数据操作,1M 接近大文件顺序读写 |
--iodepth | 队列深度,模拟并发 IO 请求数量 |
--direct=1 | 绕过客户机自身的页缓存,测的是真实到磁盘的 IO,不是缓存命中 |
--runtime | 测试时长(秒),太短的测试容易被缓存和突发写入影响,建议不少于 60 秒 |
测完记得删除测试文件:
sh
rm /var/tmp/fio-test.img关注哪几个数字
IOPS:每秒完成的 IO 操作数,随机小块读写场景看这个。BW(带宽):每秒吞吐量,顺序大块读写场景看这个。lat(延迟,尤其是99th分位):平均延迟好看不代表体验好,尾延迟(p99/p999)更能反映卡顿。
iperf3:网络吞吐
iperf3 是纯内存到内存的网络吞吐测试,不涉及磁盘,没有 fio 那样的数据风险。需要两台机器(或两台虚拟机),一台做服务端,一台做客户端。
sh
# 服务端(例如另一台虚拟机或宿主机)
iperf3 -ssh
# 客户端
iperf3 -c <服务端地址> -t 30| 参数 | 说明 |
|---|---|
-t | 测试时长(秒) |
-P | 并行连接数,测试多队列/multiqueue 效果时可以设成大于 1,观察吞吐是否随并行数上升 |
-R | 反向测试(服务端向客户端发送),用来分别测上行和下行 |
用 iperf3 验证 multiqueue 是否真的有用
按网络性能里的方法开启 multiqueue 前后,分别用 iperf3 -P 4(4 条并行连接)跑一次,对比吞吐变化,同时用 top 观察宿主机和客户机的 CPU 占用有没有明显上升。只有吞吐提升明显超过 CPU 开销的增长,这项改动才算值得。
检查结果
一次完整的基准测试记录至少应该包含:
- 测试时间、测试对象(哪台虚拟机、哪个磁盘/哪条网络路径)
- 改动前后各一组数据(同样的参数、同样的时长)
- 测试期间是否有其他任务在跑(会污染结果)
把这几项存成一个简单的表格或文本文件,方便下次调整参数时对比,而不是每次都凭记忆判断"好像比上次快"。
常见问题
fio 报错找不到设备或权限不足。 检查 --filename 路径是否存在、当前用户是否有读写权限;不要因为报错就改用裸设备路径图省事。
iperf3 测出来的吞吐远低于网卡标称速度。 先确认双方虚拟机网卡都是 VirtIO 而不是模拟网卡;再检查 CPU 是否被测试进程或其他任务占满(单线程 iperf3 可能打不满多核网卡的实际能力,用 -P 加并行连接数再测一次)。
同样的参数,两次测试结果差异很大。 常见原因是测试时长太短、后台有其他 IO/网络活动,或者存储/ARC 缓存状态不一致(比如第一次是冷缓存,第二次数据已经在缓存里)。延长测试时间、确保环境干净后重测。