воскресенье, 28 мая 2017 г.

Статистика ввода-вывода iostat во FreeBSD через Zabbix

Для оценки производительности дисковой подсистемы FreeBSD можно воспользоваться утилитой iostat. Однако полную картину нагрузки на дисковую подсистему можно получить только собирая статистику за достаточно долгий срок. Как минимум это сутки, а лучше всего собрать статистику за неделю. По недельной статистике можно легко найти периоды максимальной нагрузки и связать их с периодически выполняющимися в системе задачами. Имея статистику за неделю, можно подобрать оптимальное время запуска процедуры резервного копирования. В этой статье речь пойдёт о том, как собирать статистику от утилиты iostat в Zabbix.

Для начала изучим документацию на саму команду iostat из состава FreeBSD. Простой вызов команды iostat отображает статистику дисковых устройств вместе со статистикой процессора и терминала. К счастью, у команды iostat имеется несколько опций, полезных для наших целей:
  • -d - отображать только статистику по дисковым устройствам,
  • -x - отобразить расширенную статистику,
  • -I - отображать счётчики нарастающим итогом, а не среднюю статистику за период времени.
Последняя опция - самая полезная. В интернете можно встретить шаблоны, в которых для сбора статистики команда iostat запускается на определённый интервал времени. У такого подхода есть как минимум два недостатка. Во-первых, в промежутках между запусками iostat статистика не собирается. Во-вторых, из-за того, что команда выполняется долго, используют промежуточный файл, в который периодически сохраняют собранную статистику, а потом извлекают из этого файла с помощью команд grep или awk. В общем, увидев в какой-нибудь очередной статье в интернете такой способ съёма статистики, я морщусь и перехожу к другой статье.

Команда iostat, вызванная со всеми этими опциями, выведет примерно такой результат:
# iostat -dxI
extended device statistics  
device     r/i   w/i    kr/i    kw/i wait svc_t  %b  
mfid0    6994332913.0 13128877288.0 544161035422.5 493573917948.0    0   5.1  18
Смысл столбцов такой:
  • device - имя файла устройства в файловой системе /dev,
  • r/i - количество операций чтения за период времени,
  • w/i - количество операций записи за период времени,
  • kr/i - прочитано килобайт за период времени,
  • kw/i - записано килобайт за период времени,
  • wait - длина очереди транзакций,
  • svc_t - средняя длительность транзакций в миллисекундах,
  • %b - процент времени, когда на устройстве была одна или более невыполненных транзакций.
Несмотря на то, что указана опция -I, предписывающая выводить накопленные значения счётчиков, числа в последних трёх колонках являются текущими средними значениями. Если судить по страницам руководства на официальном сайте, эти колонки стали показывать накопленные значения счётчиков только начиная с FreeBSD 10: FreeBSD 10.0-RELEASE iostat(8). У меня FreeBSD 10 пока нигде нет, поэтому отладить шаблон для соответствующих версий iostat пока возможности не было.

Добавим в файл конфигурации Zabbix-агента /usr/local/etc/zabbix24/zabbix_agentd.conf следующие строки:
UserParameter=iostat.discovery,iostat -dxI | awk 'BEGIN { printf "{\"data\":["; } { if (NR > 3) printf ","; if (NR > 2) printf "{\"{#DEVNAME}\":\"" $1 "\"}"; } END { printf "]}"; }'
UserParameter=iostat.read.ops[*],/usr/sbin/iostat -dxI | awk '$$1 == "$1" { print $$2; }'
UserParameter=iostat.write.ops[*],/usr/sbin/iostat -dxI | awk '$$1 == "$1" { print $$3; }'
UserParameter=iostat.read.bytes[*],/usr/sbin/iostat -dxI | awk '$$1 == "$1" { print 1024 * $$4; }'
UserParameter=iostat.write.bytes[*],/usr/sbin/iostat -dxI | awk '$$1 == "$1" { print 1024 * $$5; }'
UserParameter=iostat.queue.length[*],/usr/sbin/iostat -dxI | awk '$$1 == "$1" { print $$6; }'
UserParameter=iostat.transactions.duration[*],/usr/sbin/iostat -dxI | awk '$$1 == "$1" { print $$7; }'
UserParameter=iostat.busy.duration[*],/usr/sbin/iostat -dxI | awk '$$1 == "$1" { print $$8; }'
После внесения изменений в файл конфигурации Zabbix-агента, не забудьте его перезапустить:
# /usr/local/etc/rc.d/zabbix_agentd restart
Я подготовил два варианта шаблона:
В шаблоне имеется правило низкоуровневого обнаружения, которое находит все дисковые устройства, статистику по которым выдаёт iostat:

Для каждого найденного устройства создаётся семь элементов данных, соответствующих колонкам из вывода iostat:

Страница последних данных для одного из дисков выглядят следующим образом:

Элемент данных с названием "Загрузка диска" показывает процент времени, в течение которого диск занимается обработкой хотя бы одной транзакции.

Комментариев нет: