是否有任何开源 I/O 基准测试工具支持提高 IOPS?

是否有任何开源 I/O 基准测试工具支持提高 IOPS?

我知道我能用来fio对我的磁盘进行基准测试对于任何给定的静态工作负载。但是,是否有任何开源高质量基准测试工具支持进行以下测试:

  • 测试文件大小(例如 500 MB)
  • 静态 QD(至少可设置为 1、2、4 和 8)
  • 工作负载(例如,对整个文件范围进行随机 4k 读取)
  • 直接 I/O 访问(libaio类似于fio
  • 定义最大延迟(单位:µs)

基准测试应缓慢增加 IOPS,直到延迟超过设定的限制,之后基准测试完成。测试结果将是每个 IOPS 值的延迟,或者更好的是,每个 IOPS 值的最小+平均+最大延迟。

基本上,我要求一个可以进行类似基准测试的工具此 storagereview.com 图表不同 IOPS 值下每次随机 4k 读取的延迟图

我知道我可以反复运行fio不同的设置来生成所需的数据,但我想知道是否有一些预制的工具可用于此目的。是否存在这样的基准测试工具?

答案1

fio有一个选项可以发现在一定延迟下可以完成的最高IOPS...从fio 文档的“I/O 延迟”部分

延迟目标=时间

如果设置,fio将尝试找到给定工作负载将运行的最大性能点,同时保持低于此目标的延迟。当省略单位时,该值以微秒为单位解释。请参阅latency_windowlatency_percentile

请查看全文fio 帮助中的 I/O 延迟部分因为有很多操作是相互交互的。你还可能会发现fio 的稳定状态模式和单独的工具磁盘探查器(它本身会驱动fio)很有用。但是,我注意到您已经澄清了您的问题,并且上述选项/工具不会在一组不同的“最大 IOPS”点处生成延迟数字(但是 Diskplorer根据 I/O 深度数字生成延迟/IOPS)。

除此之外fio,您还可以考虑使用vdbenchStorageReview 自己似乎也在这篇评论中使用这个工具(尽管他们的页面声称他们使用 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,对数-对数图): 图表显示最低平均延迟约为 30,000 IOPS,而延迟在 60,000 IOPS 以上急剧增加。

相比磁盘探查器这将为fio每个 IOPS 目标运行一个新进程,并收集最小、平均和最大延迟。我比 python 更了解 bash,所以这对我来说更容易编写。从长远来看,如果其许可证可以接受,改进 Diskplorer 可能会更好(目前该项目尚未定义许可证)。

相关内容