Мониторинг производительности виртуальных машин

Статья была написана 17 февраля 2011 г. Перенесена из старого блога.

Мониторинг производительности виртуальных машинНа сегоднешний день, в качестве хостов виртуализации используются высокопроизводительные сервера позволяющие запускать десятки виртуальных машин с различным ресурсопотреблением.
На одном хосте, бок о бок могут нормально работать совершенно не ресурсоемкий контроллер домена и значительно более нагруженный почтовый сервер.
При распределении ресурсов между различными ВМ, выполняющими различные функции необходимо учитывать возможные максимальные нагрузки, или отсутствие таковых.
Даже при грамотном распределении ресурсов между ВМ, необходимо вести мониторинг производительности и иметь статистические данные о минимальных и максимальных порогах ресурсопотребления за различные промежутки времени. Такая статистика поможет своевременно выявить узкие места в производительности ВМ или хоста в целом.

Системы мониторинга производительности ВМ и сбора статистики, присутствуют по умолчанию в платформах виртуализации таких гигантов как VMware, Microsoft, Red Hat а так же в ряде других малоизвестных но зато открытых проэктах как Karesansui Project, Archipel Project.
Мониторинг производительности виртуальных машин
Рис. 1. Графики производительности ESX-хоста. Платформа VMware  *.
Мониторинг производительности виртуальных машинРис. 2. Графики производительности открытого проекта Karesansui.
Мониторинг производительности виртуальных машинРис 3. Archipel project. Еще на стадии беты но очень многообещающе.

Учитывая, что коммерческие продукты меня не интересуют в принципе, а открытые аналоги еще слишком зелены для использования на продакшен серверах, я отправился на поиски…

Collectd + RRDTools + Самописный скрипт

Мониторинг производительности виртуальных машин
Рис. 4. Использование виртуального процессора одной из ВМ.
Мониторинг производительности виртуальных машинРис. 5. Обращение ВМ к своему виртуальному диску
Мониторинг производительности виртуальных машин
Рис. 6. Потребление памяти виртуальной машиной

Я не буду рассказывать о всех своих экспериментах, а лишь поведаю на чем и почему я остановился.
Collectd — Система мониторинга производительности и сбора статистики с различного оборудования а так же с огромного количества всевозможных служб таких как bind, apache, openvpn, mysql и многих, многих других. Является промышленным стандартом! В системе представлен в виде одной единственной службы с небольшим конфигурационным файлом.

Устанавливается из репозиториев, настраивается за несколько минут и работает тихо и безотказно, собирая статистику с заданного вами оборудования или служб. В основе collectd лежат плагины. Тоесть если нам нужно мониторить libvirt а точнее ВМ работающие под управлением libvirt, то мы ставим из тех же репозиториев плагин для libvirt. Вобщем, любовь к collectd у меня появилась с первых секунд).

Учитывая что collectd будет собирать данные с указанных источников(а таковых может быть много) практически ежесекундно и может делать это на протяжении дней, месяцев и более. Классические базы данных для хранения данных, нам не подходят, т.к занимаемый ими объем будет сильно увеличиваться со временем.

Для таких случаев были придуманы специальные базы данных RRD (Robin Ring Database).
Принципиальное отличие RRD баз от обычных заключается в том, что структура RRD состоит из постоянного набора измерений, значения которых динамически меняются во времени. На основе этих изменений и строится статистика за любой период времени. При этом размер RRD баз практически не изменяется со временем.

Именно в RRD базы collectd будет писать свои данные. В этом нам поможет один из многочисленных плагинов collectd.

Таким образом, результатом работы collectd будут файлы с расширением rrd содержащие все необходимые нам данные о производительности.
Естественным желанием, будет, увидеть собранные данные о производительности в наглядном виде. В этом нам поможет RRDTools — набор утилит предназначенный для работы с RRD базами. С помощью RRDTools и RRD баз созданных collectd мы сможем рисовать графики на любой вкус и цвет в формате png. Графики за конкретный период можно сформировать в любое время в ручную а можно создать скрипт который будет делать это регулярно, за разные периоды(час, день, неделя, месяц и т.д) и складывать их в определенный каталог. Если этого не достаточно, и хочется навести красоту, то можно написать простенькую HTML страничку которая будет показывать ранее нарисованные скриптом картинки и поместить эту страничку на веб-сервер.
В общем вариантов масса, главное, что мы будем в курсе кто и когда тянет на себя одеяло)

Технические детали

Итак в качестве хоста виртуализации используется CentOS 5.5 x86-64 в минимальной комплектации с KVM и Libvirt на борту.
Для реализации системы мониторинга на выше описанной платформе, необходимы следующие пакеты из стандартных репозиториев:
collectd-4.10.0-4.el5 — Собственно ядро системы мониторинга и входящий в состав минимальный набор плагинов для мониторинга cpu, memory и т.д.
collectd-rrdtool-4.10.0-4.el5 — Плагин для collectd позволяющий писать данные в RRD базы.
collectd-virt-4.10.0-4.el5 — Плагин для мониторинга гостевых систем под управлением libvirt.
rrdtool-1.2.27-3.el.x86_64 — Утилиты для рисования графиков.

Все пакеты ставятся командой:

#yum -y install collectd collectd-rrdtool collectd-virt rrdtool

В различных системах, имена пакетов и тем более версии могут отличаться!
После установки пакетов, collectd в системе представлен в виде одноименной службы, запуск и остановка а так же автозагрузка которой производится стандартными средствами service <имяСлужбы> start|stop|restart, chkconfig <имяСлужбы> on|off.

Настройка службы мониторинга collectd.

Основной конфигурационный файл collectd — collectd.conf расположен в /etc/collectd/.
В файле конфигурации перечисляются огромное количество поддерживаемых collectd плагинов и соответствующие каждому плагину настройки. Правда, такие плагины как cpu, memory, uptime, load и некоторые другие настроек не имеют, их можно либо включить/загрузить раскоментировав соответствующую строку или выключить/выгрузить поставив в начале строки символ комментария «#».

Для экономии места я приведу описание лишь некоторых секций конфигурационного файла, которые представляют наибольший интерес и в которые необходимо внести изменения.

#Секция глобальных настроек демона
##############################################################################
# Global
#—————————————————————————-

##############################################################################

#Hostname «localhost»
FQDNLookup true
#BaseDir «/var/lib/collectd» #Базовый каталог демона
#PIDFile «/var/run/collectd.pid» #Файл, содержащий в себе номер/идентификатор процесса демона
#PluginDir «/usr/lib/collectd» #Каталог с плагинами
#Interval 10 #Интервал сбора статистики
#ReadThreads 5 #Количество одновременных потоков
#Далее перечисляются всевозможные плагины collectd.
#Удаление символа # в начале строки, активирует плагин. Это означает что при загрузке collectd #будет искать соответствующий плагин в каталоге с плагинами. А Это означает что перед #включением какого либо плагина необходимо установить соответствующий плагину пакет!

#Перечень всех необходимых нам плагинов

LoadPlugin syslog  #Пишет все события в системный журнал.
LoadPlugin cpu  #Загрузка процесора.
LoadPlugin disk  #Использование диска.
LoadPlugin interface  #Активность сетвевых интерфейсов.
LoadPlugin libvirt  # Статистика ресурсопотребления ВМ
LoadPlugin load #Общая нагрузка на систему.
LoadPlugin memory #Потребление памяти.
LoadPlugin rrdtool #Пишет данные в rrd базы.
LoadPlugin uptime  #Время работы системы.

##############################################################################
# Plugin configuration #
#—————————————————————————-
#Последующая часть конфигурационного файла содержит настройки кождого нуждающегося в #настройке плагина. Конфигурация наших плагинов приведенна ниже, в большинстве случаем #изминение настроек не потребуется.
##############################################################################

#Секция настройки мониторинга дисков.
#В конфигурации по умолчанию мониторятся все диски как физические так и логические.
#<Plugin disk>
# Disk «/^[hs]d[a-f][0-9]?$/»
# IgnoreSelected false
#</Plugin>

#Настройка мониторинга сетевых интерфейсов. Если в системе установлен только один #интерфейс то скорее всего менять нечего не придется. В противном случае необходимо #добавить подобную секцию с измененным именем интерфейса.
#<Plugin interface>
# Interface «eth0»
# IgnoreSelected false
#</Plugin>

#Настройка подключения к гипервизору.
<Plugin libvirt>
Connection «qemu:///system»
RefreshInterval 60
# Domain «name»
# BlockDevice «name:device»
# InterfaceDevice «name:device»
IgnoreSelected false
HostnameFormat name
</Plugin>

#<Plugin rrdcached>
# DaemonAddress «unix:/tmp/rrdcached.sock»
# DataDir «/usr/var/lib/collectd/rrd»
# CreateFiles true
# CollectStatistics true
#</Plugin>

#Настройка RRD баз. Здесь можно указать каталог в который будет писать collectd.
#<Plugin rrdtool>
# DataDir «/usr/var/lib/collectd/rrd»
# CacheTimeout 120
# CacheFlush 900
#</Plugin>

После активации необходимых плагинов а так же внесения изменений в настройки выбранных плагинов, collectd может быть запущен и добавлен в автозагрузку.

#service collectd start или #/etc/init.d/collectd start
#chkconfig collectd on

При запуске службы collectd, на экране могут и не появится сообщения об ошибках при этом некоторые плагины могут быть не загружены в случае отсутствия в системе самого плагина или из за некорректной конфигурации плагина . Для того чтобы увидеть возможно возникшие ошибки при запуске службы необходимо заглянуть в системный журнал.

#сat /var/log/messages | grep collectd

После успешного(без ошибок в журнале) запуска collectd, мы получаем полноценную систему мониторинга ресурсопотребления, которая регулярно собирает статистику с указанных нами объектов хоста и пишет ее в RRD-файлы расположенные в /var/lib/collectd/<имяМашины>. Причем статистика по каждому процессорному ядру или сетевому интерфейсу пишется в отдельные RRD-файлы понятно разложенные по соответствующим каталогам.

Теперь когда наши RRD-файлы наполняются данными, настало время описать процесс извлечения и представления этих самых данных в наглядном для человека виде.

Описание скрипта.

Ниже представлен самописный скрипт с подробными комментариями, который может читая RRD-файлы по расписанию(если добавить в cron) рисовать красивые графики и класть их в указанный каталог. В скрипте используются утилиты из пакета rrdtool.

Скрипт универсален. Все что необходимо сделать перед использованием скрипта, это изменить несколько параметров в соответствии с вашей конфигурацией.

#!/bin/bash
#Параметры скрипта редактируются путем изменения значения соответствующих переменных.
#*****#*****#*****#*****#*****#*****#*****#*****#*****#*****#*****#
#*************************Главные параметры**********************************

#Базовый путь к RRD-файлам
DATA_BASE_DIR=/var/lib/collectd/
#Каталог в который класть графики в формате png
GRAF_DIR=/home/ruden/
#Полное имя виртуальной машины. Убедитесь в правильности!
HOSTNAME=»WindowsServer-2003-Standart-1C-SQL»
#************************Описание виртуальных устройств***********************
#Здесь просто для наглядности можно указать версию виртуального процессора или #используемый контроллер виртуальных дисков. Данное описание будет присутствовать на #графиках для информативности.
LABEL_CPU=»QEMU Virtual CPU»
LABEL_DISK=»Format — qcow2 | Bus — ide»
LABEL_NETWORK=’KB/s’
#************************Имена устройств*************************************
#Сдесь необходимо указать имена ваших виртуальных сетевых интерфейсов и дисков.
TYPE_DISK_0=’hda’
TYPE_DISK_1=»
TYPE_NET_0=’vnet0′
TYPE_NET_1=»
#************************Параметры графиков*********************************
#Здесь указываются периоды за которые будут создаваться графики и их размер в пикселях. С #текущими параметрами, будут созданы графики со статистикой за последний час, день, #неделю, месяц и год размером 640×140 пикселей.
END=’now’
STEP=’1′
START_0=’end — 1 hours’
START_1=’end — 1 day’
START_2=’end — 7 day’
START_3=’end — 30 day’
START_4=’end — 365 day’
SUFIX=»
W_SIZE=’640′
H_SIZE=’140′
#**************************Тело скрипта**************************************
#Дальше менять нечего не стоит. Все параметры задаются в секциях выше!
#*****#*****#*****#*****#*****#*****#*****#*****#*****#*****#*****#
mkdir -p «$GRAF_DIR$HOSTNAME»
mkdir «$GRAF_DIR$HOSTNAME»/cpu
mkdir «$GRAF_DIR$HOSTNAME»/network
mkdir «$GRAF_DIR$HOSTNAME»/disk

for START in «$START_0» «$START_1» «$START_2» «$START_3» «$START_4» ; do
case «$START» in
$START_0 ) SUFIX=’hour’ ;;
$START_1 ) SUFIX=’day’ ;;
$START_2 ) SUFIX=’week’ ;;
$START_3 ) SUFIX=’month’ ;;
$START_4 ) SUFIX=’year’ ;;
esac

#***********************************
# CPU
#***********************************

/usr/bin/rrdtool graph «$GRAF_DIR$HOSTNAME/cpu/cpu-$SUFIX.png»
—start «$START»
—end $END
—step $STEP
—title «$HOSTNAME | CPU USAGE on $SUFIX»
—vertical-label «$LABEL_CPU»
—imgformat PNG
—slope-mode
—color FONT#CCCCCC
—color SHADEA#999999
—color SHADEB#999999
—color GRID#666666
—color MGRID#CCCCCC
—color BACK#000000
—color CANVAS#333333
—color ARROW#CCCCCC
—width $W_SIZE
—height $H_SIZE
—interlaced
DEF_a0=$DATA_BASE_DIR/$HOSTNAME/libvirt/virt_cpu_total.rrd:ns:MAX
AREA:a0#FF0000:»Total CPU»

#***********************************
# DISK
#***********************************

/usr/bin/rrdtool graph «$GRAF_DIR$HOSTNAME/disk/disk-hda-otcets-$SUFIX.png»
—start «$START»
—end $END
—step $STEP
—title «$HOSTNAME | Disk — HDA otcets on $SUFIX»
—vertical-label «$LABEL_DISK»
—imgformat PNG
—slope-mode
—color FONT#CCCCCC
—color SHADEA#999999
—color SHADEB#999999
—color GRID#666666
—color MGRID#CCCCCC
—color BACK#000000
—color CANVAS#333333
—color ARROW#CCCCCC
—width $W_SIZE
—height $H_SIZE
—interlaced
DEF_a0=$DATA_BASE_DIR/$HOSTNAME/libvirt/disk_octets-$TYPE_DISK_0.rrd:read:MAX
DEF_a1=$DATA_BASE_DIR/$HOSTNAME/libvirt/disk_octets-$TYPE_DISK_0.rrd:write:MAX
LINE1:a0#FF0000:»MAX Read»
LINE2:a1#FF9900:»MAX Write»

/usr/bin/rrdtool graph «$GRAF_DIR$HOSTNAME/disk/disk-hda-ops-$SUFIX.png»
—start «$START»
—end $END
—step $STEP
—title «$HOSTNAME | Disk — HDA ops on $SUFIX»
—vertical-label «$LABEL_CPU»
—imgformat PNG
—slope-mode
—color FONT#CCCCCC
—color SHADEA#999999
—color SHADEB#999999
—color GRID#666666
—color MGRID#CCCCCC
—color BACK#000000
—color CANVAS#333333
—color ARROW#CCCCCC
—width $W_SIZE
—height $H_SIZE
—interlaced
DEF_a0=$DATA_BASE_DIR/$HOSTNAME/libvirt/disk_ops-$TYPE_DISK_0.rrd:read:MAX
DEF_a1=$DATA_BASE_DIR/$HOSTNAME/libvirt/disk_ops-$TYPE_DISK_0.rrd:write:MAX
LINE1:a0#FF0000:»MAX Read»
LINE2:a1#FF9900:»MAX Write»
#**********************************
# NETWORK
#**********************************

/usr/bin/rrdtool graph «$GRAF_DIR$HOSTNAME/network/network-$SUFIX.png»
—start «$START»
—end $END
—step $STEP
—title «$HOSTNAME | NETWORK-eth1 on $SUFIX»
—vertical-label $LABEL_NETWORK
—imgformat PNG
—slope-mode
—color FONT#CCCCCC
—color SHADEA#999999
—color SHADEB#999999
—color GRID#666666
—color MGRID#CCCCCC
—color BACK#000000
—color CANVAS#333333
—color ARROW#CCCCCC
—width $W_SIZE
—height $H_SIZE
—interlaced
DEF_a0=$DATA_BASE_DIR/$HOSTNAME/libvirt/if_octets-$TYPE_NET_0.rrd:tx:MAX
DEF_a1=$DATA_BASE_DIR/$HOSTNAME/libvirt/if_octets-$TYPE_NET_0.rrd:rx:MAX
DEF_a2=$DATA_BASE_DIR/$HOSTNAME/libvirt/if_errors-$TYPE_NET_0.rrd:tx:MAX
LINE1:a0#0000FF:TX
LINE2:a1#00FF00:RX
LINE3:a2#FF0000:Errors

done

В результате, такой скрипт настраивается для каждой виртуальной машины и помещается в cron. Cron в свою очередь запускает скрипты, например каждые 30 минут, что позволит нам в любой момент времени получить актуальные сведения о ресурсопотреблении за последний час, месяц или год.

Помогла ли вам статья?

Рейтинг
( Пока оценок нет )
iVirt-it.ru
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: