Поддержка инструмента сравнительного тестирования ввода-вывода с открытым исходным кодом, увеличивающая IOPS?

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

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

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

В основном я спрашиваю инструмент, который может сделать подобное сравнительное тестирование, требуемое для этого графика storagereview.com: a graph of latency for each random 4k read over different IOPS values

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

0
задан 9 January 2019 в 10:15

2 ответа

Вот сценарий удара, который я приготовил (fio-пандус, размещенный в 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, график журнала журнала): Graph displaying lowest average latency around 30,000 IOPS and steep increase in latency above 60,000 IOPS.

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

1
ответ дан 26 October 2019 в 14:15

fio имеет опцию, которая обнаруживает самый высокий IOPS, который может быть сделан под определенной задержкой... От раздела "I/O latency" fio документации:

latency_target=time

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

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

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

1
ответ дан 26 October 2019 в 14:15

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

Похожие вопросы: