Ситуация, когда одна и та же обработка в 1С вчера выполнялась за 8 минут, а сегодня за 40 при абсолютно идентичных вводных данных и коде, — классическая загадка для разработчика и администратора. В этой статье мы подробно разберем, какие скрытые механизмы влияют на производительность системы, и составим пошаговый план диагностики, чтобы найти «узкое место».
Первое, на что стоит обратить внимание, — это взаимодействие 1С с SQL-сервером. Даже если вы восстановили базу из вчерашнего бэкапа, окружение SQL-сервера (процедурный кэш, системные базы) осталось прежним. Одной из наиболее вероятных причин является актуальность статистики и проблема Parameter Sniffing.
Разберем подробнее: SQL Server строит план выполнения запроса на основе статистики распределения данных. Если статистика устарела или первый запуск запроса произошел с нетипичными параметрами, сервер может закешировать крайне неэффективный план. В результате вместо быстрого поиска по индексу (Index Seek) может выполняться полное сканирование таблицы (Index Scan).
Для решения этой проблемы выполним следующие действия:
Рассмотрим пример команды для SQL Server Management Studio, которая поможет обновить статистику:
-- Обновление статистики для текущей базы данных
EXEC sp_updatestats;
GO
-- Очистка кэша планов (выполнять с осторожностью на рабочем сервере!)
DBCC FREEPROCCACHE;
GO
Зачастую администраторы утверждают, что «в системе ничего не менялось», однако регламентные задания могут запускаться автоматически по расписанию ОС или SQL-сервера. Проанализируем возможные фоновые процессы:
.mdf, .ldf и папки с кэшем 1С в зону сканирования.CPU Steal Time.Чтобы не гадать, «где тормозит», воспользуемся встроенным инструментом — Замером производительности. Это позволит точно определить, на какой строке кода или на каком объекте система тратит основное время.
Выполним следующие шаги:
Если замер показывает, что основное время уходит на метод Записать() или УстановитьПометкуУдаления(), значит, проблема в блокировках или дисковой подсистеме SQL. Если же время тратится на вычисления внутри циклов — проблема в алгоритме или кэшировании данных на стороне сервера приложений.
Для долгоиграющих процессов полезно добавить в код «контрольные точки». Это позволит в будущем точно знать, на каком этапе произошло замедление, без запуска отладчика. Рассмотрим пример внедрения логирования в код обработки:
Процедура ВыполнитьОбработку()
НачалоЭтапа = ТекущаяДата();
ЗаписьЖурналаРегистрации("ОбработкаДанных.Старт", УровеньЖурналаРегистрации.Информация, , , "Запуск обработки документов");
// Цикл обработки данных
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
// Ключевая операция: проведение документа
Попытка
ДокументОбъект = СтрокаДанных.Ссылка.ПолучитьОбъект();
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ЗаписьЖурналаРегистрации("ОбработкаДанных.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
Длительность = ТекущаяДата() - НачалоЭтапа;
ЗаписьЖурналаРегистрации("ОбработкаДанных.Завершение", УровеньЖурналаРегистрации.Информация, , , "Обработка завершена за " + Длительность + " сек.");
КонецПроцедуры
Сервер 1С:Предприятия активно использует кэширование метаданных в каталоге srvinfo. Иногда в этих данных происходит сбой (так называемое «протухание» кэша), что заставляет сервер тратить лишние ресурсы на десериализацию объектов. Проанализируем возможность очистки временных файлов:
1C:Enterprise 8.3 Server Agent.snccntxt, reg_1541 (за исключением файла 1CV8Reg.lst).Local\1C и Roaming\1C).Выясним, не перешел ли сервер в режим энергосбережения. На многих серверных платформах режим Balanced может приводить к тому, что частота процессора снижается в моменты низкой активности. Когда запускается тяжелая обработка 1С, планировщик ОС может не сразу поднять частоту до максимума, или делать это рывками. Всегда устанавливайте режим «Высокая производительность» (High Performance) в настройках электропитания Windows Server и в настройках BIOS сервера.
Разница во времени выполнения с 8 до 40 минут — это слишком большой разрыв, чтобы списать его на «погрешность». Скорее всего, мы имеем дело с совокупностью факторов: неоптимальным планом SQL-запроса из-за старой статистики и фоновой нагрузкой на дисковую подсистему. Рекомендуется последовательно исключать каждый фактор, начиная с обновления статистики SQL и заканчивая проверкой режима питания сервера.