![是否有任何开源 I/O 基准测试工具支持提高 IOPS?](https://linux22.com/image/1162345/%E6%98%AF%E5%90%A6%E6%9C%89%E4%BB%BB%E4%BD%95%E5%BC%80%E6%BA%90%20I%2FO%20%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7%E6%94%AF%E6%8C%81%E6%8F%90%E9%AB%98%20IOPS%EF%BC%9F.png)
我知道我能用来fio
对我的磁盘进行基准测试对于任何给定的静态工作负载。但是,是否有任何开源高质量基准测试工具支持进行以下测试:
- 测试文件大小(例如 500 MB)
- 静态 QD(至少可设置为 1、2、4 和 8)
- 工作负载(例如,对整个文件范围进行随机 4k 读取)
- 直接 I/O 访问(
libaio
类似于fio
) - 定义最大延迟(单位:µs)
基准测试应缓慢增加 IOPS,直到延迟超过设定的限制,之后基准测试完成。测试结果将是每个 IOPS 值的延迟,或者更好的是,每个 IOPS 值的最小+平均+最大延迟。
基本上,我要求一个可以进行类似基准测试的工具此 storagereview.com 图表:
我知道我可以反复运行fio
不同的设置来生成所需的数据,但我想知道是否有一些预制的工具可用于此目的。是否存在这样的基准测试工具?
答案1
fio
有一个选项可以发现在一定延迟下可以完成的最高IOPS...从fio 文档的“I/O 延迟”部分:
延迟目标=时间
如果设置,
fio
将尝试找到给定工作负载将运行的最大性能点,同时保持低于此目标的延迟。当省略单位时,该值以微秒为单位解释。请参阅latency_window
和latency_percentile
。
请查看全文fio 帮助中的 I/O 延迟部分因为有很多操作是相互交互的。你还可能会发现fio 的稳定状态模式和单独的工具磁盘探查器(它本身会驱动fio
)很有用。但是,我注意到您已经澄清了您的问题,并且上述选项/工具不会在一组不同的“最大 IOPS”点处生成延迟数字(但是 Diskplorer做根据 I/O 深度数字生成延迟/IOPS)。
除此之外fio
,您还可以考虑使用vdbench
StorageReview 自己似乎也在这篇评论中使用这个工具(尽管他们的页面声称他们使用 fio),但你必须向libaio
类似的提交挥手告别——我相当确定vdbench
它不会执行特定于平台的 AIO,因为它试图与平台无关(因此它只能使用多个线程/进程来增加深度)。
答案2
下面是我编写的 Bash 脚本(fio-ramp 托管于 github):
#!/bin/bash
# Copyright 2019 Mikko Rantalainen
# License: MIT X License
#
# Debian/Ubuntu requirements:
# sudo apt install fio jq
#
# See also: https://fio.readthedocs.io/en/latest/fio_doc.html
#
set -e
if test -z "$1"
then
echo "usage: $(basename $0) <result.csv> [fio options]" 1>&2
echo "<result.csv> will contain CSV with µs latency for different IOPS" 1>&2
echo " For example, " 1>&2
echo " $(basename $0) output.csv --blocksize=8k --rw=randwrite --iodepth=4" 1>&2
echo " will compute IOPS latency values for 8K random write QD4." 1>&2
# Note: if --numjobs=4 then actual IOPS will be 4x the amount targeted because targeted is per job - prefer increasing iodepth instead!
fi
resultfile="$1";
shift; # remove filename from parameters, left rest for fio
log10_series()
{
count=1
step=1
echo 1
while (( $step < 1000000 ))
do
for (( i=1; i < 10; i++ ))
do
count=$(( $count + $step ))
echo $count
done
step=$(( 10 * $step ))
done
}
echo "Writing output to '$resultfile' ..."
# Note: "| while read ..." loop causes shell to create subshell, we have to share data via actual file because variables do not work over subshell boundaries :-/
best_actual_iops_file=$(mktemp --tmpdir fio-ramp-best-actual-iops.XXXXXXXX.tmp)
echo 0 > "$best_actual_iops_file"
trap "rm '$best_actual_iops_file'" EXIT
echo '"Target IO/s", "Actual IO/s", "Min latency (µs)", "Avg latency (µs)", "Max latency (µs)"' | tee "$resultfile"
log10_series | while read iops
do
LC_ALL=C fio --name TEST --filename=fio-ramp.benchmark.temp --rw=randread \
--size=500m --io_size=10g --blocksize=4k \
--ioengine=libaio --direct=1 --numjobs=1 --iodepth=1 \
--ramp_time=1 --runtime=5 --end_fsync=1 --group_reporting \
--rate_iops=$iops --rate_iops_min=1 --max_latency=1s \
--warnings-fatal --output-format=json "$@" \
| jq '.jobs[] | (.read.iops, .read.lat.min, .read.lat.mean, .read.lat.max)' \
| xargs -r printf "%s %s %s %s\n" | while read actual_iops min avg max
do
printf "% 13s, % 13s, % 18s, % 18s, % 18s\n" "$iops" "$actual_iops" "$min" "$avg" "$max" | tee -a "$resultfile"
if [ "$(echo "$(cat "$best_actual_iops_file") <= $actual_iops" | bc -l)" == "1" ]; then
echo "$actual_iops" > "$best_actual_iops_file"
else
echo "Actual IOPS dropped when target IOPS was increased, aborting." 1>&2
exit 1
fi
done
done
示例图(英特尔 SSD 910 上的延迟与 IOPS,随机 4K 读取 QD32,对数-对数图):
相比磁盘探查器这将为fio
每个 IOPS 目标运行一个新进程,并收集最小、平均和最大延迟。我比 python 更了解 bash,所以这对我来说更容易编写。从长远来看,如果其许可证可以接受,改进 Diskplorer 可能会更好(目前该项目尚未定义许可证)。