跳转到内容

基准测试方法:fio 与 iperf3 ​

这篇是本章其他几篇(CPU 绑核与 NUMA、磁盘 IO 调优、网络性能、内存)反复提到的"先测量,再调优"具体怎么做。没有基线数据,任何"感觉更快了"都无法验证。

为什么需要它 ​

调优最常见的失败模式是:改了一堆参数,主观感觉快了,但从来没有量化过改动前后的差异,也不知道是不是别的因素(缓存预热、负载变化)造成的错觉。基准测试解决的就是这个问题:在同样的条件下,改动前测一次,改动后再测一次,只看数字。

基准测试结果只在你自己的环境里有意义

网上的跑分数字换一套硬件、换一种存储、换一个内核版本就可能完全不同。不要用别人的 fio/iperf3 结果决定你要不要改某个参数,自己测一遍改动前后的对比才是唯一可靠的依据。

开始之前 ​

  • 测试期间该虚拟机/宿主机上没有其他大量占用资源的任务(备份、其他基准测试)在跑,否则结果会被干扰。
  • 磁盘测试和网络测试都建议在客户机内部进行,这样测出来的数字才是应用实际能感知到的性能,而不是宿主机裸设备的理论值。
  • 测试工具本身:Debian/Ubuntu 客户机内部安装
sh
# 客户机内部
apt update
apt install -y fio iperf3

fio:磁盘性能 ​

fio 只能对着测试文件或专门腾出来的测试盘跑写测试,绝不能对着裸设备或正在用的分区跑

fio 的写测试(--rw=write、--rw=randwrite、--rw=readwrite 等)会真实写入数据。如果 --filename 指向的是一块正在使用的磁盘设备(例如 /dev/sda、/dev/sdb)或者其上的分区,这个操作等同于用随机数据覆盖这块盘,上面原有的分区表、文件系统和数据会被破坏,无法恢复。

安全的做法只有两种:

  1. 对着一个测试文件跑,放在有富余空间、可以随便读写的文件系统上,例如 --filename=/var/tmp/fio-test.img。测试结束后删掉这个文件即可,不影响其他数据。
  2. 对着一块专门腾出来、确认没有任何数据的空盘或空分区跑,跑之前用 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 -s
sh
# 客户端
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 缓存状态不一致(比如第一次是冷缓存,第二次数据已经在缓存里)。延长测试时间、确保环境干净后重测。

参考资料 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。