Поддерживает ли какой-либо инструмент сравнительного анализа ввода / вывода с открытым исходным кодом увеличение IOPS?

Я знаю, что я могу использовать fio для сравнения моих дисков с любой заданной статической нагрузкой. Тем не менее, поддерживает ли какой-либо высококачественный инструмент тестирования производительности с открытым исходным кодом тест, в котором я выбираю следующие параметры в качестве констант:

  • Размер тестового файла (например, 500 МБ)
  • Статическая QD (устанавливается не менее 1, 2, 4 и 8)
  • Рабочая нагрузка (например, случайное чтение 4 КБ по всему диапазону файлов)
  • Прямой доступ к вводу / выводу (аналогично libaio из fio)
  • Определите максимальную задержку в мкс

И тест должен медленно увеличивать количество операций ввода-вывода в секунду, пока задержка не превысит установленный предел, после которого тест будет выполнен. Результатом теста будет задержка для каждого значения IOPS или, что еще лучше, минимальная + средняя + максимальная задержка для каждого значения IOPS.

В основном я спрашиваю инструмент, который может сделать аналогичный бенчмаркинг, необходимый для этого графика storagereview.com:

Я знаю, что могу многократно бежать fio с различными настройками для генерации необходимых данных, но мне интересно, есть ли какой-то готовый инструмент для этой цели. Существует ли такой инструмент оценки?

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

Пример графика (латентность против IOPS на Intel SSD 910, случайное чтение 4K QD32, график log-log):

По сравнению с Diskplorer это запускает новый fio обрабатывает для каждой цели IOPS и собирает минимальную, среднюю и максимальную задержку. Я знаю bash лучше, чем python, поэтому мне было легче писать. В долгосрочной перспективе улучшение Diskplorer может быть лучше, если его лицензия является приемлемой (в настоящее время лицензия для этого проекта не определена).

fio имеет опцию, которая обнаруживает наивысшие значения IOPS, которые могут быть выполнены с определенной задержкой... Из раздела "Задержка ввода / вывода" документации fio:

latency_target = время

Если установлено, fio будет пытаться найти точку максимальной производительности, с которой будет работать заданная рабочая нагрузка, при этом задержка будет ниже этой цели. Если единица не указана, значение интерпретируется в микросекундах. Увидеть latency_window а также latency_percentile,

Пожалуйста, смотрите весь раздел о задержке ввода / вывода в справке fio, так как есть множество операций, которые взаимодействуют вместе. Вы также можете найти режим Steady State в fio и отдельный инструмент Diskplorer (который сам управляет fio) полезно. Тем не менее, я отмечаю, что вы прояснили свой вопрос, и вышеупомянутые опции / инструменты не генерируют числа задержки в заданном количестве различных точек "max IOPS" (однако Diskplorer генерирует время ожидания / IOPS против чисел глубины ввода / вывода).

Вдали от fio Вы также можете посмотреть на использование vdbench инструмент, который StorageReview на самом деле, похоже, использует в этом обзоре ( несмотря на то, что их страница утверждает, что они используют fio), но вам придется помахать libaio нравится представление - я уверен vdbench не выполняет AIO для конкретной платформы, потому что он пытается быть независимым от платформы (поэтому он может использовать только несколько потоков / процессов для увеличения глубины).

Другие вопросы по тегам