Мониторинг вызовов 1С с помощью Zabbix
Практически вся работа 1С состоит из вызовов. Во время вызова происходят операции получения и записи данных. Их длительность — очень важный показатель работы системы. Возможности системы мониторинга позволяют копить и анализировать данные за разные периоды, что может быть крайне полезным при расследовании причин появления различных проблем. Одна из таких проблем, которая очень распространена и хорошо узнаваема — концентрация регламентных заданий в одно время в большом количестве баз. Этот пример наглядно демонстрирует зависимость загруженности сервера, длительности вызовов, а также снижение нагрузки и сокращение длительности после внесения в систему изменений.
С статье продемонстрирован способ мониторинга длительности вызовов и применения этих данных для решения задачи оптимизации. Все действия выполнялись на системе под управлением Debian 10, соответственно при обработке данных использованы характерные для таких систем команды, вроде awk. Для адаптации решения под Windows можно найти аналоги команд для него, либо запускать скрипт в cygwin
Вызовы 1С
Вызовы 1С состоят из частей. Часть времени уходит на обработку вызова серверной платформой 1С, часть на работу с СУБД, а часть — на ожидание блокировок 1С. Собирая информацию о длительности вызовов в системе и их составных частей, можно посмотреть и сделать вывод о распределении нагрузки и частях системы, которые замедляют ее работу при наступлении определенных условий.
Получение данных
Для получения данных незаменим ras сервер. Это консольное приложение, способное возвращать в командную строку в виде понятного вывода (в виде ключ: значение) всю информацию, которая отображается в Консоли управления кластером в Windows. Его необходимо установить вместе с платформой 1С.
После установки необходимо запустить в качестве службы файл ras из папки bin в каталоге установки 1С. Станет возможным подключаться к ras серверу с помошью клиента rac и получать информацию, аналогичную информации из консоли кластера в Windows. Для получения справки по командам можно вызвать каждую команду с ключом help. Здесь https://github.com/1oss/ras_man можно посмотреть справки из всех команд.
То, что необходимо для реализации мониторинга вызовов, возвращается командой process. За получение данных от 1С и их обработку отвечает скрипт:
#!/bin/bash
if [[ $1 == "cluster list" ]] ; then
CMD="/opt/1C/v8.3/x86_64/rac $1"
if [[ -z $2 ]] ; then
${CMD} | awk -F':' '{\
printf "{\"data\":[", "%s"; \
do{
printf "{", "%s"; \
do{
gsub(/[\t ]*/,"",$1)
gsub("-","",$1)
gsub(/[\t ]*/,"",$2)
gsub("\"","",$2)
printf "\"{#"toupper($1)"}\":\""$2"\"", "%s"; \
getline;\
if($0 != "") printf ",", "%s";\
}while($0 != "")
getline;\
printf "}", "%s"; \
if($0) printf ",", "%s";\
}while($0)
print "]}"; \
}'
else
${CMD} | awk -F':' -v PROP=$2 '{\
gsub(/[\t ]*/,"",$1)
gsub(/[\t ]*/,"",$2)
if($1 == PROP) printf $2, "%s"; \
}'
fi
exit;
fi
CMD="/opt/1C/v8.3/x86_64/rac $1 --cluster $2"
KEY=""
if [[ -n $3 ]] ; then
KEY=$3;
fi
${CMD} | awk -F':' -v mykey=$KEY '\
BEGIN{\
arr["total_count"] = 0;\
arr["total_bgjobs_count"]=0;\
arr["total_sleep_count"]=0;\
}{\
do{\
arr["total_count"]++;\
do{\
gsub(/[\t ]*/,"",$1);\
gsub(/[\t ]*/,"",$2);\
if(match($1, "app-id") && match($2, "BackgroundJob"))arr["total_bgjobs_count"]++;\
if(match($1, "hibernate") && match($2, "yes"))arr["total_sleep_count"]++;\
if(match($2, /^[0-9.]+$/)){\
key = $1;
gsub("-","_",key);\
arr["sum_"key]=arr["sum_"key] + $2;\
arr["avg_"key]=arr["sum_"key]/arr["total_count"];\
if($2 > arr["max_"key]) arr["max_"key] = $2;\
if($2 < arr["min_"key] || arr["min_"key] == "") arr["min_"key] = $2;\
}\
getline;\
}while($0 != "");\
getline;\
}while($0);\
}
END{\
if(mykey == ""){
printf "{\"data\":[", "%s"; \
printf "{", "%s"; \
for(a in arr){\
print a":"arr[a]",";\
}\
printf "total_count:"arr["total_count"];
printf "}", "%s"; \
printf "]}", "%s"; \
}else{\
for(a in arr){\
if(match(a, mykey)){printf arr[a], "%s";}\
}\
}\
}'
Первая часть отвечает за autodiscovery кластера в zabbix, возвращая данные о кластере. Вторая — непосредственно за обработку данных. Обработка крайне проста — создается ассоциативный массив, содержащий суммы значений, из которых потом выводится среднее. Это создает разные дикие данные, вроде среднего порта рабочего процесса, но достаточно универсально. Позже будет показано как этот же скрипт можно применить для обработки данных о сессиях.
Передача в Zabbix
Для того, чтобы получать данные в Zabbix, необходимо сперва настроить агента, а затем создать шаблон для мониторинга. Агент должен вызывать скрипты, возвращающие данные. Для этого в его конфигурационный файл /etc/zabbix/zabbix_agentd.conf необходимо добавить строки:
UserParameter=get_clusters, /usr/share/zabbix-agent/get-1c-stat-zabbix.sh "cluster list"
UserParameter=get_process_stats[*], /usr/share/zabbix-agent/get-1c-stat-zabbix.sh "process list" $1 $2
После добавления необходимо перезапустить службу агента чтобы изменения вступили в силу. Проверить работу можно, выполнив с Zabbix сервера команду
zabbix_get -s server1c -k get_clusters
Настройка в заббикс
Далее необходимо добавить шаблон в Zabbix и настроить получение необходимых данных. Прежде всего необходимо настроить Discovery rule с ключом get_clusters, который вернет данные для идентификации кластера.
После необходимо настроить прототипы данных и графиков:
Результат
В результате применения мониторинга вызовов в одной из систем удалось установить, что значительную нагрузку на ЦП оказывают длительные вызовы сервера 1С, которые, как оказалось, замедлялись большим количеством регламентных заданий. На иллюстрациях представлена нагрузка на процессор и график длительности вызовов 1С во время проблем с производительностью:
Из графика можно заметить, что большая часть общего времени вызовов (call time) приходится на серверный вызов 1С (server call time), а вызовы СУБД (db call time) и ожидания на блокировках (lock call time) замедляются скорее всего просто на общем фоне растущей нагрузки на систему. Следовательно, проблему следует поискать, прежде всего, на стороне сервера 1С.
Спад нагрузки на графике произошел после перезапуска службы 1С, через небольшой промежуток времени длительность сильно возрастала. Оказалось, что нагрузка создавалась скоплением регламентных заданий.
После оптимизации и разнесения выполнения регламентных заданий в базах в разные промежутки времени, нагрузка и график вызовов изменились следующим образом.
После того, как механизм отлажен, можно с его помощью обрабатывать и вытаскивать в систему мониторинга практически любые данные, присутствующие в Консоли управления кластерами 1С — статистику о рабочих процессах, сеансах, памяти, лицензиях и всем остальном. Под различные нужды можно переписать сам скрипт, так как не во всех случаях требуется агрегирование, примененное для анализа вызовов. Например, можно точно также получать информацию о сеансах, добавив в скрипт анализа вывода ras сервера строчку:
UserParameter=get_sessions_stats[*], /usr/share/zabbix-agent/get-1c-stat-zabbix.sh "session list" $1 $2
Получение данных о сессиях в Zabbix настраивается таким же образом, как и получение данных о процессах и вызовах. Модифицируя этот скрипт, настройки заббикс-агента и дополняя его команды можно получить практически любые данные о работе системы.
Также, после того, как стали известны параметры вызовов нормального режима работы системы, можно настроить триггеры, оповещающие о выходе за рамки средней длительности вызовов, потребления памяти или любого другого показателя.
Скрипт и настроенный шаблон для заббикса можно взять в репозитории 1oss