Как измерить IOPS для команды в linux?

Я работаю над имитационной моделью, в которой я хочу определить, когда емкость IOPS хранилища становится узким местом (например, у жесткого диска ~150 операций ввода-вывода в секунду, а у SSD может быть 150 000). Поэтому я пытаюсь найти способ для сравнения IOPS в команде (git) для некоторых его различных операций (push, pull, merge, clone).

До сих пор я нашел такие инструменты, как iostat, однако я не уверен, как ограничить отчет тем, что делает одна команда.

Лучшая идея, которую я могу придумать, - это определить емкость IOPS моего жесткого диска, использовать время для фактической команды, посмотреть, как долго она длится, умножить ее на IOPS, и это мои IOPS:

HDD ->150 IOPS
time df -h

real    0m0.032s

150 * .032 = 4.8 IOPS

Но это, конечно, очень глупо, потому что продолжительность выполнения, возможно, была связана с использованием процессора, а не с использованием жесткого диска, поэтому, если использование жесткого диска не было 100% для этого времени, нет смысла измерять подобные вещи.

Итак, как я могу измерить IOPS для команды?

3 ответа

Решение

В типичной системе Linux есть несколько команд time(1); по умолчанию используется встроенная функция bash(1), которая является несколько базовой. Существует также /usr/bin/time который вы можете запустить, либо вызвав его точно так же, либо сказав bash(1) не использовать псевдонимы и встроенные функции, поставив перед ним обратную косую черту, таким образом: \time, У Debian он есть в пакете time, который установлен по умолчанию, Ubuntu, вероятно, идентичен, а другие дистрибутивы будут очень похожи.

Вызов его аналогично встроенной оболочке уже более многословен и информативен, хотя, возможно, более непрозрачен, если вы уже не знаете, что на самом деле означают цифры:

$ \time df
[output elided]
0.00user 0.00system 0:00.01elapsed 66%CPU (0avgtext+0avgdata 864maxresident)k
0inputs+0outputs (0major+261minor)pagefaults 0swaps

Тем не менее, я хотел бы обратить ваше внимание на справочную страницу, где перечислены -f возможность настроить выходной формат, и в частности %w формат, который подсчитывает, сколько раз процесс отказывался от своего временного интервала ЦП для ввода / вывода:

$ \time -f 'ios=%w' du Maildir >/dev/null
ios=184
$ \time -f 'ios=%w' du Maildir >/dev/null
ios=1

Обратите внимание, что первый запуск останавливался для ввода-вывода 184 раза, но второй запуск останавливался только один раз. Первая цифра заслуживает доверия, поскольку в моем каталоге 124 каталога. ~/Maildir: чтение каталога и inode дает примерно два IOPS на каталог, меньше, потому что некоторые inode, вероятно, находились рядом друг с другом и читались в одной операции, плюс еще несколько дополнительных для отображения в двоичных общих библиотеках du(1), и так далее.

Вторая цифра, конечно, ниже из-за дискового кэша Linux. Итак, последний этап - очистка кеша. sync(1) - знакомая команда, которая сбрасывает грязные записи на диск, но не очищает кэш чтения. Вы можете очистить это, написав 3 к /proc/sys/vm/drop_caches, (Другие значения также иногда полезны, но вам нужно 3 здесь.) Для пользователя без полномочий root самый простой способ сделать это:

echo 3 | sudo tee /proc/sys/vm/drop_caches

Объединяя это с /usr/bin/time должен позволять вам создавать скрипты, которые вам нужны для сравнения интересующих вас команд.

Кроме того, используется tee(1), потому что это не сработает:

sudo echo 3 >/proc/sys/vm/drop_caches

Причина? Хотя echo(1) запускается от имени пользователя root, перенаправление выполняется как обычная учетная запись пользователя, которая не имеет прав на запись в drop_caches, tee(1) эффективно выполняет перенаправление как root.

iotop Команда собирает информацию об использовании ввода / вывода для процессов в Linux. По умолчанию это интерактивная команда, но вы можете запустить ее в пакетном режиме с помощью -b / --batch, Кроме того, вы можете список процессов с -p / --pid, Таким образом, вы можете отслеживать активность git команда с:

$ sudo iotop -p $(pidof git) -b

Вы можете изменить задержку с -d / --delay,

Вы можете использовать pidstat:
pidstat -d 2
Более конкретно pidstat -d 2 | grep COMMAND или же pidstat -C COMMANDNAME -d 2

pidstat Команда используется для мониторинга отдельных задач, которые в настоящее время управляются ядром Linux. Он записывает в стандартные операции вывода для каждой задачи, выбранной с помощью опции -p, или для каждой задачи, управляемой ядром Linux, если была использована опция -p ALL. Не выбирать какие-либо задачи равносильно указанию -p ALL, но в отчете будут отображаться только активные задачи (задачи с ненулевыми значениями статистики). Команда pidstat также может использоваться для мониторинга дочерних процессов выбранных задач.

-C commDisplay только задачи, имя команды которых включает в себя stringcomm. Эта строка может быть регулярным выражением.

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