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

Я работаю над имитационной моделью, где я хочу определить, когда емкость хранилища IOPS становится узким местом (например, и HDD имеет ~ 150 IOPS, а 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 для команды?

Ответ 1

Существует несколько команд времени (1) в типичной системе Linux; по умолчанию используется bash (1), который является несколько базовым. Существует также /usr/bin/time, который вы можете запустить, либо вызвав его точно так, либо указав bash (1), чтобы не использовать псевдонимы и встроенные элементы, префикс его обратным слэшем таким образом: \time. Debian имеет его в пакете "время", который установлен по умолчанию, 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, который подсчитывает количество раз, когда процесс отказывался от своего центрального процессора timeslice для ввода-вывода:

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

Обратите внимание, что первый запуск остановлен для ввода-вывода 184 раза, но второй запуск остановлен только один раз. Первая цифра заслуживает доверия, так как в моем ~/Maildir есть 124 каталога: чтение каталога и inode дает примерно два IOPS для каждого каталога, меньше, потому что некоторые иноды, вероятно, рядом друг с другом и читаются в одной операции, плюс еще один лишний раз для отображения в двоичных, разделяемых библиотеках 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

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

Ответ 2

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

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

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

Ответ 3

Вы можете использовать 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 только задачи, чье имя команды включает строку. Эта строка может быть регулярным выражением.