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