Как набор Fio Benchmark набор йодапта?

Предположим, что у вас есть следующие файлы:

$ cat file1
ZZ1 YYY XX1
ZZ2 YYY XX2
ZZ3 YYY XX3
ZZ4 YYY XX4
ZZ5 YYY XX5
ZZ6 YYY XX6
ZZ7 YYY XX7
$ cat file2
AA1 B2
AA2 B2
AA3 B3
AA4 B4

Тогда используйте этот awk:

awk 'FNR==NR{a[c++]=$0} FNR!=NR{for(i in a){print $0,a[i]}}' file1 file2
  • FNR==NR применяется только к первому файлу file1
    • a[c++]=$0 заполняет массив под названием a содержимым file1
  • FNR! =NR применяется только ко второму файлу file2
    • for(i in a) зацикливает массив a...
    • print $0,a[i] ...и выводим строку из file2 и содержимое массива.

The outout:

AA1 B2 ZZ1 YYY XX1
AA1 B2 ZZ2 YYY XX2
AA1 B2 ZZ3 YYY XX3
AA1 B2 ZZ4 YYY XX4
AA1 B2 ZZ5 YYY XX5
AA1 B2 ZZ6 YYY XX6
AA1 B2 ZZ7 YYY XX7
AA2 B2 ZZ1 YYY XX1
AA2 B2 ZZ2 YYY XX2
AA2 B2 ZZ3 YYY XX3
AA2 B2 ZZ4 YYY XX4
AA2 B2 ZZ5 YYY XX5
AA2 B2 ZZ6 YYY XX6
AA2 B2 ZZ7 YYY XX7
AA3 B3 ZZ1 YYY XX1
AA3 B3 ZZ2 YYY XX2
AA3 B3 ZZ3 YYY XX3
AA3 B3 ZZ4 YYY XX4
AA3 B3 ZZ5 YYY XX5
AA3 B3 ZZ6 YYY XX6
AA3 B3 ZZ7 YYY XX7
AA4 B4 ZZ1 YYY XX1
AA4 B4 ZZ2 YYY XX2
AA4 B4 ZZ3 YYY XX3
AA4 B4 ZZ4 YYY XX4
AA4 B4 ZZ5 YYY XX5
AA4 B4 ZZ6 YYY XX6
AA4 B4 ZZ7 YYY XX7

1
05.08.2018, 20:33
1 ответ

fio is passing this value [depth] to the operating system

и

Accordingly, fio is passing this value to the operating system. So how does FIO do this?

Здесь может быть неправильное представление :fio НЕ передает напрямую параметр глубины в операционную систему. Если возможно, fio пытается отправить ввод-вывод до iodepth, указанного с помощью данного ioengine. Если эта глубина достигнута , тогда fio будет ждать (завершения некоторого )незавершенного ввода-вывода, прежде чем попытается отправить больше операций ввода-вывода...

How does FIO benchmark set [io]depth?

Это зависит от ioengine, это зависит от параметров fio, упомянутых в Что такое iodepth в fio? ,https://serverfault.com/questions/923487/what-does-iodepth-in-fio-tests-really-mean-is-it-the-queue-depthи https://www.spinics.net/lists/fio/msg07191.html. Без небольших фиксированных примеров объяснять слишком много.

Наступает момент, когда больше нечего делать, кроме как читать и понимать код самого fio... Fio имеет основной цикл для отправки операций ввода/вывода (см.https://github.com/axboe/fio/blob/fio-3.8/backend.c#L1055):

static void do_io(struct thread_data *td, uint64_t *bytes_done)
{
    [...]
    while ((td->o.read_iolog_file && !flist_empty(&td->io_log_list)) ||
        (!flist_empty(&td->trim_list)) || !io_issue_bytes_exceeded(td) ||
        td->o.time_based) {
        [...]
        } else {
            ret = io_u_submit(td, io_u);

            if (should_check_rate(td))
                td->rate_next_io_time[ddir] = usec_for_io(td, ddir);

            if (io_queue_event(td, io_u, &ret, ddir, &bytes_issued, 0, &comp_time))
                break;

            /*
             * See if we need to complete some commands. Note that
             * we can get BUSY even without IO queued, if the
             * system is resource starved.
             */
reap:
            full = queue_full(td) ||
                (ret == FIO_Q_BUSY && td->cur_depth);
            if (full || io_in_polling(td))
                ret = wait_for_completions(td, &comp_time);
        }
        [...]
    }
    [...]
}

Подпрограмма организации очереди ioengine вызывается цепочкой вызовов из io_u_submit(). Предполагая, что ioengine является асинхронным, он может просто «поставить в очередь» операции ввода-вывода внутри fio, а затем позднее отправить всю партию за один раз (, обычно в результате того, что его функция getevents()вызывается из цепочка вызовов wait_for_completions()).Однако мы оставим трассировку кода fio в качестве упражнения для читателя.

if I want to write a benchmark program like fio, how would I control the IO queue depth?

Вам потребуется имитировать один из (асинхронных )ioengine fio и иметь цикл обработки событий, способный (асинхронно )отправлять операции ввода-вывода И проверять их завершение. Как только у вас появилась такая вещь, идея, что вы отправляете только до определенной глубины, была бы легкой -, если в какой-то момент у вас есть незавершенные незавершенные операции ввода-вывода, которые соответствуют (или превышают, если вы не проверяете один за другим )выбранной глубины, вам нужно подождать, пока что-то будет завершено, прежде чем отправлять больше.

Вы можете обнаружить, что aio -stress.c в тестовом проекте Linux легче понять и модифицировать, чем fio, если вы делаете игрушечный тест.

0
28.01.2020, 00:31

Теги

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