Мониторинг производительности дисковых подсистем с помощью zabbix. Мониторятся следующие параметры.
- утилизация блочного устройства в % — удобная метрика для отслеживания общей нагрузки на устройстве;
- latency или отзывчивость — доступна как общая отзывчивость, так и отзывчивость на операциях чтения/записи;
- величина очереди (в запросах) и средний размер запроса (в секторах) — позволяет оценить характер нагрузки и степень загруженности устройства;
- текущая скорость чтения/записи на устройство в человекопонятных килобайтах;
- количество запросов чтения/записи (в секунду) объединенных при постановке в очередь на выполнение;
- iops — величина операций чтения/записи в секунду;
Для работы нам потребуется утилита iostat входящая в пакет sysstat. Устанавливаем sysstat
yum install sysstat
Создаем директорию для скриптов
mkdir /usr/libexec/zabbix-extensions/scripts/
Создаем первый скрипт для сбора метрик
vi /usr/libexec/zabbix-extensions/scripts/iostat-collect.sh
Копируем в него следующий текст
#!/usr/bin/env bash
# Description: Script for iostat monitoring
# Author: Epikhin Mikhail michael@nomanlab.org
# Revision 1: Lesovsky A.V. lesovsky@gmail.com
SECONDS=$2
TOFILE=$1
IOSTAT="/usr/bin/iostat"
[[ $# -lt 2 ]] && { echo "FATAL: some parameters not specified"; exit 1; }
DISK=$($IOSTAT -xm 1 $SECONDS | awk 'BEGIN {check=0;} {if(check==1 && $1=="avg-cpu:"){check=0}if(check==1 && $1!=""){print $0}if($1=="Device:"){check=1}}' | tr '\n' '|')
echo $DISK | sed 's/|/\n/g' > $TOFILE
echo 0
Создаем второй скрипт для парсинга
vi /usr/libexec/zabbix-extensions/scripts/iostat-parse.sh
#!/usr/bin/env bash
# Description: Script for disk monitoring
# Author: Epikhin Mikhail michael@nomanlab.org
# Revision 1: Lesovsky A.V. lesovsky@gmail.com
NUMBER=0
FROMFILE=$1
DISK=$2
METRIC=$3
[[ $# -lt 3 ]] && { echo "FATAL: some parameters not specified"; exit 1; }
[[ -f "$FROMFILE" ]] || { echo "FATAL: datafile not found"; exit 1; }
case "$3" in
"rrqm/s")
NUMBER=2
;;
"wrqm/s")
NUMBER=3
;;
"r/s")
NUMBER=4
;;
"w/s")
NUMBER=5
;;
"rkB/s")
NUMBER=6
;;
"wkB/s")
NUMBER=7
;;
"avgrq-sz")
NUMBER=8
;;
"avgqu-sz")
NUMBER=9
;;
"await")
NUMBER=10
;;
"r_await")
NUMBER=11
;;
"w_await")
NUMBER=12
;;
"svctm")
NUMBER=13
;;
"util")
NUMBER=14
;;
*) echo ZBX_NOTSUPPORTED; exit 1 ;;
esac
grep -w $DISK $FROMFILE | tail -n +2 | tr -s ' ' |awk -v N=$NUMBER 'BEGIN {sum=0.0;count=0;} {sum=sum+$N;count=count+1;} END {printf("%.2f\n", sum/count);}'
Даем права на запуск
chmod +x /usr/libexec/zabbix-extensions/scripts/iostat-collect.sh /usr/libexec/zabbix-extensions/scripts/iostat-parse.sh
Создаем файл с ключами zabbix агента
vi /etc/zabbix/zabbix_agentd.d/iostat.conf
Копируем в него следующие ключи
# Disk statistics via iostat (sysstat)
# Attention: Second parameter in iostat.collect must be less than Timeout option in zabbix_agentd.conf
UserParameter=iostat.discovery, iostat -d | awk 'BEGIN {check=0;count=0;array[0]=0;} {if(check==1 && $1 != ""){array[count]=$1;count=count+1;}if($1=="Device:"){check=1;}} END {printf("{\n\t\"data\":[\n");for(i=0;i<count;++i){printf("\t\t{\n\t\t\t\"{#HARDDISK}\":\"%s\"}", array[i]); if(i+1<count){printf(",\n");}} printf("]}\n");}'
UserParameter=iostat.collect,/usr/libexec/zabbix-extensions/scripts/iostat-collect.sh /tmp/iostat.out 8 || echo 1
UserParameter=iostat.metric[*],/usr/libexec/zabbix-extensions/scripts/iostat-parse.sh /tmp/iostat.out $1 $2
Рестартуем агента
systemctl restart zabbix-agent
Скачиваем шаблон для zabbix сервера и устанавливаем.
В итоге должны получить красивые графики, например загрузка диска
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

iostat -d | awk ‘BEGIN {check=0;count=0;array[0]=0;} {if(check==1 && $1 != «»){array[count]=$1;count=count+1;}if($1==»Device:»){check=1;}} END {printf(«{\n\t\»data\»:[\n»);for(i=0;i<count;++i){printf("\t\t{\n\t\t\t\"{#HARDDISK}\":\"%s\"}", array[i]); if(i+1<count){printf(",\n");}} printf("]}\n");}'
Эта команда (их параметра в файле iostat.conf) не отрабатывает корректно на Debian10, не выводит список дисков. Соответственно дальше тоже ничего не работает.
На предыдущих версиях всё нормально.
вопрос решен, вот ответ:
iostat -d | awk ‘BEGIN {check=0;count=0;array[0]=0;} {if(check==1 && $1!= «»){array[count]=$1;count=count+1;}if($1==»Device»){check=1;}} END {printf(«{\n\t\»data\»:[\n»);for(i=0;i<count;++i){printf("\t\t{\n\t\t\t\"{#HARDDISK}\":\"%s\"}", array[i]); if(i+1<count){printf(",\n");}} printf("]}\n");}'
ДД, под винду нет такой штуки?