В продолжение статьи про наше использование 1С Fresh мы расскажем как учимся следить за производительностью и скоростью работы нашей инсталляции.
Введение
В любой компании, которая выпускает какой-нибудь продукт, существует отдел контроля качества. Обычно этот отдел проверяет продукцию на выходе, именно то, что попадает потребителю в руки. Если компания предоставляет услуги, то существуют специальные люди, которые обзванивают клиентов и узнают, все ли им понравилось. После этого, исходя из собранной статистики, вносятся какие-либо изменения в процесс и все повторяется по кругу. Хорошо, конечно, если такие отделы и люди существуют в компании. В нашем мире чаще всего либо ты пользуешься тем, что есть, либо ищешь другие компании и никто за это не переживает.
У нас в Кнопке пользователями продукта 1C Fresh в первую очередь являются наши бухгалтеры. Чем выше стабильность и скорость работы 1С, тем выше скорость работы бухгалтера. А это значит, что клиенты, которые обслуживаются в Кнопке будут быстрее получать расчеты по налогам, авансу, зарплате и т.д.
Существует много различных вариантов оценки производительности (или качества) IT — систем и софта. Для оценки производительности нашего 1С Fresh мы используем многим известную методику APDEX.
Apdex. Справка
Apdex (Application Performance Index) — индекс производительности приложений. Открытый международный стандарт, разработанный с целью формирования объективной оценки показателей производительности корпоративных информационных систем.
Apdex служит для измерения пользовательской удовлетворенности работой системы. Этот опыт может быть представлен по шкале от отлично до неудовлетворительно.
Методика состоит из следующих этапов:
— получение списка ключевых операций;
— определение приоритета каждой операции;
— определение целевого времени для каждой операции;
— сбор информации о времени выполнения каждой ключевой операции;
— получение оценки на основе собранной информации.
По завершению всех перечисленных этапов становится возможным интерпретировать полученный результат в терминах качественной оценки. Про Apdex есть информация на сайте 1С, откуда мы собственно и черпали знания.
Реализация. Теория
Первым этапом при замере производительности по методике Apdex, является выделение списка ключевых операций. Проведя некоторую аналитику совместно с нашими бухгалтерами, мы выделили ряд операций, которые чаще остальных используются в работе с 1С.
Второй этап — определение приоритета каждой операции. Чем выше приоритет, тем важнее производительность операции. Правильно расставленные приоритеты позволят в дальнейшем оценить серьезность проблем с производительностью в системе, и правильно определить приоритеты работ по оптимизации.
Следующий этап самый интересный: определение целевого времени для каждой операции. Т.е. необходимо подобрать такое время выполнения указанной операции в секундах (Т), которое удовлетворит клиента, т.е. нашего бухгалтера. По каждой операции мы субъективно выделили Т и записали в нашу таблицу.
Операция | Приоритет | Т |
Проведение поступление товаров и услуг | 3 | 1 |
Общее время запуска приложения | 2 | 3 |
Формирование отчёта «карточка счёта» | 6 | 4 |
Формирование ОСВ | 4 | 3 |
Формирование ОСВ по счёту | 5 | 3 |
Проведение реализация товаров и услуг | 1 | 3 |
Следующий этап, это сбор информации о времени выполнения каждой операции. 1С позаботились об этом и учли такой функционал в своих продуктах. Замеры мы снимали с конфигурации Бухгалтерия Предприятия 3.0. Для того, чтобы 1с начала замерять время выполнения операций, необходимо установить константу «Выполнять замеры производительности». Проделать это нужно для каждой ИБ, работающей в модели сервиса.
После этого все замеры времени выполнения пользовательских операций будут записываться в регистр сведений «Замеры времени», откуда эту информацию можно получать различными способами.
И, наконец, пятый этап, получение оценки APDEX на основании собранных результатов.
Формула для вычисления APDEX: APDEX = (NS + NT/2)/N
где:
N — общее количество выполнений данной операции;
NS — количество выполнений с временем отклика от 0 до Т;
NT — количество выполнений с временем отклика от T до 4T.
Результаты расчетов добавим в таблицу:
Операция | Приоритет | Т | N | NS | NT | APDEX |
Проведение поступление товаров и услуг | 3 | 3 | 387 | 320 | 34 | 0,67 |
Общее время запуска приложения |
2 | 5 | 357 | 185 | 164 | 0,68 |
Формирование отчёта «карточка счёта» |
6 | 4 | 99 | 94 | 5 | 0,84 |
Формирование ОСВ | 4 | 4 | 224 | 190 | 31 | 0,95 |
Формирование ОСВ по счёту |
5 | 4 | 732 | 559 | 158 | 0,88 |
Проведение реализация товаров и услуг | 1 | 4 | 387 | 353 | 34 | 0,67 |
Методика APDEX позволяет интерпретировать полученные числовые значения коэффициента в терминах качественных оценок. Для этого предусмотрена Шкала APDEX, которая содержит следующие диапазоны значений:
- От 0.00 до 0.50 — неприемлемо
- От 0.50 до 0.70 — неудовлетворительно
- От 0.70 до 0.85 — удовлетворительно
- От 0.85 до 0.94 — хорошо
- От 0.94 до 1.00 — отлично
Интерпретировав значения, получим следующую таблицу:
Операция | Apdex |
Проведение реализация товаров и услуг | неудовлетворительно |
Общее время запуска приложения | неудовлетворительно |
Формирование отчёта «карточка счёта» | удовлетворительно |
Формирование осв | отлично |
Формирование осв по счёту | хорошо |
Проведение реализация товаров и услуг | неудовлетворительно |
Реализация. Практика
Для мониторинга производительности и доступности сервисов, мы используем Zabbix и надстройку Grafana. Для всех наших сервисов, в том числе 1C Fresh, мониторятся следующие показатели: нагрузка на CPU каждого сервера, количество свободной оперативной памяти, глубина очереди дисковой подсистемы (нагрузка операциями дискового ввода/вывода), количество свободного места на дисках, количество операций INSERT, UPDATE, DELETE в секунду на сервере СУБД.
Для отслеживания оценки Apdex мы не стали придумывать ничего нового и добавили отображение оценки в Zabbix. Для того, чтобы Zabbix получал данные по времени выполнения операций из 1с, их нужно сначала куда-то выгрузить. Для этого мы используем промежуточную базу PostgreSQL. Выгружать данные из 1С в базу можно несколькими способами. Мы реализовали этот механизм через регламентные задания.
Каждое регламентное задание можно запускать по расписанию:
В процессе запуска регламентное задание порождает фоновое задание, которое и выполняет реальную обработку. Регламентное задание может выполняться от имени заданного пользователя и имеет возможность перезапуска (например, в случае непредвиденного завершения работы).
Для выгрузки мы будем использовать следующие значения регистра:
1. Наименование базы прикладной конфигурации. Поскольку в технологии 1C Fresh предполагается использование большого количества баз и прикладных решений, нам необходимо различать замеры для каждой из них
2. Наименование операции.
3. Время начала операции
4. Время выполнения операции
5. Область данных, в которой выполнялась операция
6. Пользователь, выполнивший операцию
Фоновое задание представляет собой процедуру:
Процедура ПриОткрытииНаСервере()
ДатаВремя = ТекущаяДата() - 1800 - 18000;
ИмяСервера = "server";
ИмяБазы = "apdex";
ИмяПользователя = "username";
Пароль = "pswd";
ИмяТаблицы = "perfomance";
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
ПозицияРеф = СтрНайти(СтрокаСоединения, "Ref=");
СтрокаБазы = Сред(СтрокаСоединения, ПозицияРеф + 4);
СтрокаБазы = СтрЗаменить(СтрокаБазы, """", "");
СтрокаБазы = Стрзаменить(СтрокаБазы, ";", "");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЗамерыВремени.КлючеваяОперация КАК Операция,
| ЗамерыВремени.ДатаНачалаЗамера КАК ДатаНачала,
| ЗамерыВремени.ВремяВыполнения КАК ВремяВыполнения,
| ЗамерыВремени.Пользователь КАК Пользователь
|ИЗ
| РегистрСведений.ЗамерыВремени КАК ЗамерыВремени
|ГДЕ
| ЗамерыВремени.ДатаЗаписи >= &Дата";
Запрос.Параметры.Вставить("Дата", ДатаВремя);
ВыборкаЗамеров = Запрос.Выполнить().Выбрать();
Сообщить(ВыборкаЗамеров.Количество());
стрПодключения = "Driver={PostgreSQL Unicode};
|data source=PostgreSQL35W;
|Server=" + ИмяСервера + ";
|Port=5433;
|Database=" + ИмяБазы + ";
|Uid="+ИмяПользователя+";
|Pwd="+Пароль+";
|STMT=utf8";
АДОДБКоннект = Новый COMОбъект("ADODB.Connection");
АДОДБКоннект.Provider = "MSDASQL.1";
АДОДБКоннект.ConnectionString = стрПодключения;
АДОДБКоннект.Open();
Пока ВыборкаЗамеров.Следующий() Цикл
АДОНаборЗаписей = Новый COMОбъект("ADODB.RecordSet");
АДОКоманда = Новый COMОбъект("ADODB.Command");
АДОКоманда.ActiveConnection = АДОДБКоннект;
Операция = ВыборкаЗамеров.Операция;
ДатаНачала = ВыборкаЗамеров.ДатаНачала;
ДатаНачала = Дата(1,1,1,0,0,0) + ЦЕЛ(ДатаНачала/1000);
ВремяВыполнения = СтрЗаменить(ВыборкаЗамеров.ВремяВыполнения, ",", ".");
ВремяВыполнения = СтрЗаменить(СтрЗаменить(ВремяВыполнения,Символы.НПП,"")," ","");
Пользователь = ВыборкаЗамеров.Пользователь;
Буфер = стрЗаменить(Пользователь,";",Символы.ПС);
Пользователь = стрПолучитьСтроку(Буфер,1);
ФИО = стрПолучитьСтроку(Буфер,2);
АДОКоманда.CommandText = "Insert into " + ИмяТаблицы +
" (basename,operation,startdate,operationtime,username, name) values ("+"'" + СтрокаБазы + "','" + Операция + "','" + ДатаНачала + "','" + ВремяВыполнения + "','" + Пользователь + "','" + ФИО + "'"+")";
АДОНаборЗаписей = АДОКоманда.Execute();
КонецЦикла;
АДОДБКоннект.Close();
КонецПроцедуры
Выгружая таким образом данные из 1С, нам теперь не составит труда обрабатывать это в Zabbix’e. На примере операции “Общее время запуска приложения” в ИБ ea_01 сформируем sql-запрос к базе:
select (
(
(
select count(*) as cnt from perfomance
where operation='Общее время запуска приложения' and
basename = 'ea_01' and
startdate > (NOW() - INTERVAL 2 hour ) and
operationtime < 3
)
+
(
select count(*) as cnt from perfomance
where operation='Общее время запуска приложения' and
basename = 'ea_01' and
startdate >= (NOW() - INTERVAL 2 hour ) and
operationtime > 3 and operationtime < 4*3)/2)::real
/
Nullif
(
(
select count(*) from perfomance
where operation='Общее время запуска приложения' and
basename = 'ea_01' and
startdate >= (NOW() - INTERVAL 2 hour )
),0)::real)
На первом шаге создадим конфигурационный файл для агента, который будет выполняться на сервере СУБД где хранятся данные замеров.
UserParameter=apdex.operation.openapp[*],psql -U postgres -p 5433 -d apdex -t -c "select (((select count(*) as cnt from perfomance where operation='$3' and basename = '$1' and startdate > (NOW() - INTERVAL '$2 hour' ) and operationtime < $4) + (select count(*) as cnt from perfomance where operation='$3' and basename = '$1' and startdate >= (NOW() - INTERVAL '$2 hour' ) and operationtime > $4 and operationtime < 4*$4)/2)::real / nullif((select count(*) from perfomance where operation='$3' and basename = '$1' and startdate >= (NOW() - INTERVAL '$2 hour' )),0)::real)
Использование параметров даст нам возможность использовать этот конфигурационный файл для различных информационных баз и замеряемых операций.
На втором шаге мы создадим шаблон в Zabbix, где будем описывать необходимые нам макросы:
Затем привязываем этот шаблон к нужному узлу сети и переопределяем индивидуальные параметры для макросов.
Повторяя эти действия для каждого измеряемого параметра, мы получим постоянный мониторинг производительности по методике APDEX.
Теперь, почти в режиме реального времени, мы видим оценку Apdex по нашим базам 1cFresh. Но мы пошли дальше.
Настройка реакции на падение производительности
Кроме автоматического мониторинга показателей мы настроили также автоматическую реакцию на падение производительности по какому-либо параметру. Zabbix предоставляет большой простор для реализации различных реакций через скриптовые инструменты.
Мы будем реагировать на падение производительности включением технологического журнала «1С: Предприятие».
Сценарий достаточно прост:
Производительность операции падает → срабатывает триггер на падение → запускается действие, которое редактирует файл настроек технологического журнала.
После разбора проблемы, либо восстановления производительности, проводятся обратные действия.
Производительность выходит на нормальный уровень → срабатывает триггер → удаляется блок настроек технического журнала.
Создадим триггер, в котором прописываем условия срабатывания. В нашем случае это падение оценки Apdex ниже 0.6
Затем создаем действие, на срабатывание триггера
В этом действии задаем команду
По собранному ТЖ можно анализировать, что послужило падению производительности, какие были ошибки, что делал пользователь в данный момент, какой пользователь и т.д. Сопоставляя данные ТЖ и мониторинга Zabbix можно делать выводы и разрабатывать планы по устранению проблем, оптимизации железа, оптимизации работы пользователя.
Благодаря мониторингу и оценке производительности, мы смогли выйти на показатель 99% доступности нашей инсталляции 1C Fresh. Наши показатели оценки Apdex пока еще не достигли 1.0, но мы уже над этим работаем :)
Автор: ZverG