Всё то, что я писал относительно FreeBSD, справедливо и для Linux: полную картину нагрузки на дисковую подсистему можно получить только собирая статистику за достаточно долгий срок. Имея полную статистику за неделю, можно найти периоды максимальной нагрузки и связать их с периодически выполняющимися в системе задачами, что позволит, например, подобрать оптимальное время запуска процедуры резервного копирования.
В этой статье речь пойдёт о том, как собирать статистику из файла /proc/diskstats в Zabbix. Этот метод я считаю более правильным, чем встречающиеся в интернете шаблоны, использующие для сбора статистики программу iostat, работающую некоторое время. Как я уже говорил, во-первых, такой способ не позволяет собрать статистику в промежутках между запусками команды, а во-вторых, приводит к необходимости использовать промежуточный файл, чтобы не ждать сбора статистики при запросе значения каждого отдельного счётчика.
Прежде чем что-то делать, ознакомимся с краткой документацией на этот файл по ссылке
https://www.kernel.org/doc/Documentation/ABI/testing/procfs-diskstats. Значения столбцов этого файла таковы:
- старший номер устройства (номер драйвера),
- младший номер устройства (порядковый номер устройства, управляемого этим драйвером),
- имя устройства в файловой системе /dev,
- количество успешно выполненных операций чтения,
- количество объединённых операций чтения,
- количество прочитанных секторов,
- время, потраченное на чтение, в миллисекундах,
- количество успешно выполненных операций записи,
- количество объединённых операций записи,
- количество записанных секторов,
- время, потраченное на запись, в миллисекундах,
- количество активных операций ввода-вывода (фактически - длина очереди транзакций),
- время, потраченное на выполнение операций ввода-вывода, в миллисекундах,
- взвешенное время выполнения операций ввода-вывода, в миллисекундах.
- старший номер устройства (номер драйвера),
- младший номер устройства (порядковый номер устройства, управляемого этим драйвером),
- имя устройства в файловой системе /dev,
- количество выполненных операций чтения - общее количество успешно завершённых операций чтения,
- количество объединённых операций чтения - операции чтения соседних областей могут быть объединены друг с другом для повышения эффективности. Две операции чтения 4 килобайт можно объединить в одну операцию чтения 8 килобайт, прежде чем команда будет передана на диск. Такая операция будет поставлена в очередь и выполнена как одна операция. Это поле позволяет узнать, как часто происходит объединение операций,
- количество прочитанных секторов - общее количество успешно прочитанных секторов,
- время, потраченное на чтение, в миллисекундах - общее количество миллисекунд, потраченных всеми операциями чтения (замеренное между __make_request() и end_that_request_last()),
- количество выполненных операций записи - общее количество успешно завершённых операций записи,
- количество объединённых операций записи - см. описание поля 5,
- количество записанных секторов - общее количество успешно записанных секторов,
- время, потраченное на запись, в миллисекундах - общее количество миллисекунд, потраченных всеми операциями записи (замеренное между __make_request() и end_that_request_last()),
- количество активных операций ввода-вывода - единственное поле, которое сбрасывается в ноль. Увеличивается на единицу, когда запрос попадает в соответствующую структуру request_queue и уменьшается на единицу, когда этот запрос завершается,
- время, потраченное на выполнение операций ввода-вывода, в миллисекундах - это поле увеличивается, пока поле 12 отличается от нуля,
- взвешенное время выполнения операций ввода-вывода, в миллисекундах - это поле увеличивается с началом каждой операции ввода-вывода, завершением операции ввода-вывода, объединением операций ввода-вывода или при чтении этой статистики. Количество активных операций ввода-вывода (поле 12), помноженное на количество миллисекунд, потраченных на ввод-вывод с момента последнего обновления этого поля. Это поле позволяет легко оценить как время завершения ввода-вывода, так и время ожидания операции ввода-вывода в очереди.
- поле 12 не является накопительным и содержит текущее значение количества операций в очереди,
- точный смысл поля 14 понять не удалось, будем считать что там находится некое "взвешенное" значение, по смыслу аналогичное полю 13,
- размер сектора в полях 6 и 10 не известен.
Теперь приступим к настройке Zabbix-агента. Для этого впишем в его файл конфигурации /etc/zabbix/zabbix_agentd.conf следующие строки:
UserParameter=diskstats.discovery,/usr/bin/awk 'BEGIN { printf "{\"data\":["; } { if (NR > 1) printf ","; printf "{\"{#DEVNAME}\":\"" $3 "\"}"; } END { printf "]}"; }' /proc/diskstats UserParameter=diskstats.read.ops[*],/usr/bin/awk '$$3 == "$1" { print $$4; }' /proc/diskstats UserParameter=diskstats.read.merged[*],/usr/bin/awk '$$3 == "$1" { print $$5; }' /proc/diskstats UserParameter=diskstats.read.bytes[*],/usr/bin/awk '$$3 == "$1" { print 512 * $$6; }' /proc/diskstats UserParameter=diskstats.read.duration[*],/usr/bin/awk '$$3 == "$1" { print $$7; }' /proc/diskstats UserParameter=diskstats.write.ops[*],/usr/bin/awk '$$3 == "$1" { print $$8; }' /proc/diskstats UserParameter=diskstats.write.merged[*],/usr/bin/awk '$$3 == "$1" { print $$9; }' /proc/diskstats UserParameter=diskstats.write.bytes[*],/usr/bin/awk '$$3 == "$1" { print 512 * $$10; }' /proc/diskstats UserParameter=diskstats.write.duration[*],/usr/bin/awk '$$3 == "$1" { print $$11; }' /proc/diskstats UserParameter=diskstats.queue.length[*],/usr/bin/awk '$$3 == "$1" { print $$12; }' /proc/diskstats UserParameter=diskstats.busy.duration[*],/usr/bin/awk '$$3 == "$1" { print $$13; }' /proc/diskstats UserParameter=diskstats.transactions.duration[*],/usr/bin/awk '$$3 == "$1" { print $$14; }' /proc/diskstatsПосле внесения изменений в файл конфигурации Zabbix-агента, не забудьте его перезапустить:
# /etc/init.d/zabbix-agent restartЯ подготовил два варианта шаблона:
- Template_App_diskstats_Linux.xml - шаблон с элементами данных типа "Zabbix-агент"
- Template_App_diskstats_Linux_Active.xml - шаблон с элементами данных типа "Zabbix-агент (активный)"
Если часть устройств кажутся вам лишними, в настройках правила обнаружения на вкладке "Фильтр" можно задать регулярное выражение, которое будет совпадать только с интересующими вас файлами дисковых устройств.
Для каждого найденного устройства создаются одиннадцать элементов данных, соответствующих колонкам производительности диска из файла diskstats:
Страница последних данных для одного из дисков выглядят следующим образом:
Элемент данных с названием "Загрузка диска" показывает процент времени, в течение которого диск занимается обработкой хотя бы одной транзакции.
2 комментария:
А, diskstats.read.bytes и diskstats.write.bytes в шаблоне есть..
Откуда берутся ?
Александр, поправил статью.
Отправить комментарий