Мониторинг производительности дисковых подсистем с помощью 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 сервера и устанавливаем.
В итоге должны получить красивые графики, например загрузка диска
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");}'
ДД, под винду нет такой штуки?