Небольшая предыстория: пользователи жалуются на тормоза 1с — сделаю изменения, проверю своим скриптом время до и после, а пользователи все жалуются и жалуются…
В итоге сделал следующий комплекс:
- Компонента которая используется в 1с для "экранирования" замеряемых участков кода
- SQL таблица, в которую отправляются полученные замеры всеми пользователями
- Служба, которая получает данные из таблицы и отправляет в zabbix. (до версии 1.0.1.0 отправлялись усредненные значения)
Что делать в 1с:
Создать константу ZabbixСтатистикаВыполнения
в глобальном модуле описать
Перем глСтатистикаВыполнения Экспорт; //:Addin.ZabbixStatistics
Перем глОтправлятьСтатистикуВыполнения Экспорт;
в глобальном модуле в процедуре ПриНачалеРаботыСистемы()
глОтправлятьСтатистикуВыполнения=0;
Если Константа.ZabbixСтатистикаВыполнения=1 Тогда
Попытка
глСтатистикаВыполнения = СоздатьОбъект("Addin.ZabbixStatistics");
глСтатистикаВыполнения.НазваниеБазы = ТекущаяИбКод();
глСтатистикаВыполнения.Инициализация();
глОтправлятьСтатистикуВыполнения=1;
Исключение
КонецПопытки;
КонецЕсли;
Также в глобальном модуле добавить процедуры
//-->> Статистика выполнения кода
Процедура глСтатистикаВыполнения_Начать(Параметр,ЗначениеПриОшибке=-1) Экспорт
Если глОтправлятьСтатистикуВыполнения=1 Тогда
глСтатистикаВыполнения.Начать(Параметр,ЗначениеПриОшибке);
КонецЕсли;
КонецПроцедуры
Процедура глСтатистикаВыполнения_Отменить() Экспорт
Если глОтправлятьСтатистикуВыполнения=1 Тогда
глСтатистикаВыполнения.Отменить();
КонецЕсли;
КонецПроцедуры
Процедура глСтатистикаВыполнения_Закончить() Экспорт
Если глОтправлятьСтатистикуВыполнения=1 Тогда
глСтатистикаВыполнения.Закончить();
КонецЕсли;
КонецПроцедуры
//<<--
Теперь в требуемом месте "экранировать" замеряемый участок
глСтатистикаВыполнения_Начать("Documents.Provedenie.RN",-1000);
//ВАШ КОД
//
//глСтатистикаВыполнения_Отменить(); Возврат; //Или иной выход из замеряемого участка кода
//
//ВАШ КОД
глСтатистикаВыполнения_Закончить();
Инструкция установка компоненты, службы, zabbix есть в описании на github, а также в скачиваемом архиве
Исходный код gihub
02.02.2025 Версия 1.0.1.0
- При начале нового замера проверяется завершенность предыдущего.
- Добавлен метод Отменить(), который требуется выполнять при выходе из замера принудительно (Прервать, возврат, и т.д.), чтобы он не считался некорректно завершенным
- Служба теперь отправляет все значения(а не усредняет).
тормозит — понятие субъективное…
да, надо четкое определение — сколько сек… МиллиСек…
среднее у Вас на рисунке 106 мс = это 1/10 секунды… это для пользователя — мгновенно…
но есть пики почти до 1,2 сек… что тоже очень быстро, но все-таки это в 12 раз больше среднего…
или вы не там меряете… или проблема в «умах»…
возможно «пики» — из-за блокировок…
грузят например платёжки… блокируются реализации (регистр взаиморасчетов),
или проводятся перемещения большие — так же реализации блокируются (регистр остатки товаров на складах) — таких пиков на рисунке несколько в 11-05 максимум…
кроме того «психологически» долго — по одной из рекомендуемых 1С методике APDEX -это
время, которое превышает среднее (хорошее) в 4 раза -и это уже для клиента «долго» и «неприемлимо»…
и, возможно, тормозит не само проведение… а «возврат» в список документов
новое отображение (особенно если есть расцветка… доп.обработка или у пользователя — свои поля настроены криво через 2-3 подзапроса)
p.s.
спасибо за обработки… zabbix как раз хотел «покопать»… посмотрю на досуге
А как насчет многопоточности и/или вложенности замеров?
А «SQL таблица, в которую отправляются полученные замеры» сама создается или надо самому делать?
К сожалению 1с не многопоточна. Также вложенность замеров изначально не думал делать(но можно) ввиду того, что дополнительный код только увеличивает время выполнения.
В sql желательно создать отдельную базу, отдельного пользователя, в которую создать таблицу скриптом в архиве(есть и в исходниках).
Я именно так и делал, создавал отдельно базу, отдельного пользователя с доступом только в эту базу, ну и таблицу скриптом.
При первом запуске советую уровень Info изменить на Debug, тогда увидите результаты отправки в заббикс.
Небольшие ньюансы по работе компоненты:
Не отправляется статистика отмененного кода(например была ошибка транзакции). Скоро реализую в новой версии.
Отправка компонентой в sql идет в другом потоке, чтобы не тормозить код 1с, поэтому есть задержка указываемая в конфиге(изначально равна 10) с которой данные отправляются пока создан объект. Отсюда вывод, можно поймать ситуацию когда данные не успеют отправиться, а 1с будет закрыта
Можно не использовать службу, а только компоненту, просто через некоторое время выгрузить в эксель и сделать график по нужным данным, причем в этом варианте не будет усредненных вариантов и пики тормозов вы увидите сразу, просто в варианте с заббиксом это попросту не возможно, т к. отправляются данные в реальном времени.
Пишите вопросы, пожелания и замечания, буду рад ответить помочь,а также прислушаться к конструктивным замечаниям.
По поводу вложенности, можно сделать, но не буду ввиду несовместимости с алгоритмом по отправке статистики прерванного кода.
Дело в том что если начать замер, но не окончен, но начат другой замер этой же компонентой, то можно считать что первый был некорректно завершен и нужно отправлять -1, чтобы однозначно выделить такую ситуацию, как в таблице так и в заббиксе.
Я подумаю еще насчет вложенности, в принципе можно передать вторым параметром уровень текущей вложенности. В общем подумаю…
Вроде же zabbix умеет читать apdex, почему так сделано ?
(7) в 7.7 нет Apdex, но спасибо за комментарий, было полезно про него прочитать, а также наткнулся на статью отправки данных zabbix агентом из sql в zabbix (что собственно и делает моя служба)
(8)Пардоньте. Не обратил внимание что под 77
Тогда конечно заслуженный +
Спасибо комментирующим! Узнал что все таки возможно отправлять замеры за прошедшее время и не требуется их усреднять. (Есть с версии 1.0.1.0)
Пока все, что планировал, сделал, вторую неделю обкатывается на работе. Если что-либо новое запланирую, напишу комментарием.
Я буду рад новым комментариям!
Ну вот и первые плоды пошли(см. вложение)