Коротко о себе:
В данный момент тимлид команды разработки, опыт работы в 1С большой, естественно, тема производительности всплывает в работе регулярно.
На момент начала подготовки были пройдены курсы Виктора Богачева (пару лет назад), навыки оптимизации запросов, анализа планов запросов (правда на SQL Server).
Подготовка:
Курсы УЦ 1
- "Применение методик"
- "Ремесло эксперта"
Сначала отсмотрел "Применение методик" и мне показалось, что меня обманули)
Все очень сжато, кратко, как-то не появилось ощущения, что я готов решать практические задачи. Затем посмотрел "Ремесло эксперта", и первый курс заиграл новыми красками. Что называется, "сначала не понял, а потом как понял")
Заново пересмотрел применение методик, вдумчиво, с остановками и разборами. Там реально каждая секунда несет в себе нужную информацию.
Посмотрел на youtube ролик Виктора Богачева по регулярным выражениям.
Развернул на виртуальной машине Linux, Postgres, установил 1С, развернул базу ERP с встроенной подсистемой нагрузочного тестирования. До этого с линуксами опыт был абсолютно нулевой, пришлось освоить командную строку и вот это вот все.
База есть на курсе "Ремесло эксперта". Это именно та база, которая будет на экзамене (возможно, другой релиз, но смысл тот же)
На курсе "Применение методик" есть задание, которое нужно выполнить, оно вполне себе иллюстрирует то, что будет на экзамене.
На этом контуре и проходили тренировки.
Хотя экзамен и не сдан (пока), знания получены:
- Работа с Linux(основные команды, установка)
- Работа с Postgres(принципы работы версионника, зачем нужен VACUUM, настройки конфигурации, что такое pg_stats и др. и др.)
- По SQL Server знаний также прибавилось, DMV, ожидания + в копилку
- Настройка ТЖ и расследование проблем при помощи регулярных выражений(блокировки, взаимоблокировки, длительные вызовы, запросы, контексты, планы запросов, сбор статистики и тд и тп)
- Анализ планов запросов на Postgres(основные принципы схожи с SQL Server, но немного другое пальто)
- Нагрузочное тестирование.
- ЦУП
- Подходы при оптимизации (с чего начинать оптимизацию, как оперировать APDEX)
- Кластер (назначения функциональности, отказоустойчивость, настройки)
Экзамен:
Начало в 10 МСК, должна быть веб-камера "вид сбоку", выдаются доступы и начинается экзамен.
Организацию оцениваю как не очень хорошую:
- встреча проходит в MTS Link, которого народ раньше в глаза не видел
- доступы выдаются с задержкой (мне например дали в 10:25)
- на все жалобы ответ в основном один, "приезжайте очно"
- самое главное: терминал просто дико тормозит. Когда я первый раз запустил нагрузочный тест, все просто замерло минут на 20, и невозможно было ничего делать. Я даже подумал сначала, что это часть задания, что нужно настроить счетчики и помониторить нагрузку на ресурсы, но потом таких зависаний при тесте не было. Зато были зависания при поиске использования в конфигураторе. Он просто вис наглухо. Ресурсов виртуалке выделено очень мало для нормальной работы с конфигурацией ERP.
Задание:
Нагрузочный тест должен отработать без ошибок, в ТЖ не должно быть TDEADLOCK, TTIMEOUT, EXCP. Есть код с комментариями "НЕ ИЗМЕНЯТЬ", его трогать нельзя. Тестовые обработки тоже менять запрещено.
На терминале две базы, ERP и ЦУП.
Ну раз есть ЦУП, то почему бы и не пойти по легкому пути) Запускаем, подключение уже настроено, режим мониторинга, и... отваливается с ошибкой
ОК. Раз не должно быть TDEADLOCK, TTIMEOUT, EXCP, настраиваю сбор ТЖ по этим событиям, включаю отладку на сервере(на будущее, наверняка понадобится), запускаю тест.
Все виснет часа на пол.
Тест падает с ошибкой нехватки памяти. Легкая проблема, открываем ТЖ, нахожу EXCP, контекст, процедуру. Вижу, что в ней написана явно какая-то фигня(конкатенация длинных строк), но на всякий случай запускаю поиск во всех текстах чтобы найти и проверить использование. Конфигуратор виснет, минут через 20 принимаю решение его срубить. Как это делать, на обучении я не освоил), перезапускаю службу, запускаю конфигуратор, "Найти использование". Индекс заполняется, все отрабатывает, нахожу использование процедуры, делаю расширение, проблемный код убираю.
Итого: поиск проблемы 5 минут, решение 10 минут, ожидание не меньше часа.
Появляется версия, что зависание это не баг а фича (ну то есть часть задания), иду проверить настройки постгреса, на каталог не хватает прав, sudo пользователю недоступно. Время неумолимо бежит вперед.
Настраиваю ТЖ уже на полный сбор, запускаю тест.
Как обычно, все виснет, настолько, что меня срубают(в ТЖ событие о завершении сеанса).
Запускаю снова.
Ошибка на взаимоблокировке.
Тут все просто: повышение уровня блокировки.
Примерно так:
//НЕ ИЗМЕНЯТЬ
Процедура Блокировка()
//НЕ ИЗМЕНЯТЬ
Набор = РегистрыСведений.КакойТо.СоздатьНаборЗаписей()
Набор.Отбор.Установить...
Набор.Прочитать();
Пауза();
Набор.Записать();
КонецПроцедуры
Благополучно пропускаю комментарий сверху, что процедуру нельзя изменять совсем, дорабатываю код над вторым комментарием, накладываю блокировку с максимальным уровнем
//НЕ ИЗМЕНЯТЬ
Процедура Блокировка()
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КакойТо");
ЭлементБлокировки.УстановитьЗначение("НужныйОтбор", НужныйОтбор);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
//НЕ ИЗМЕНЯТЬ
Набор = РегистрыСведений.КакойТо.СоздатьНаборЗаписей()
Набор.Отбор.Установить...
Набор.Прочитать();
Пауза();
Набор.Записать();
КонецПроцедуры
Допускаю ошибку в имени регистра, запускаю тест. Длительное ожидание, чудо, ошибка только на том, что превышено допустимое время ожидания теста.
Анализирую ТЖ по длительным вызовам, нахожу процедуру, в которой в топе процедура:
Из табличной части Контактная информация справочника Партнеры получается Значение(это JSON), парсится, затем при обходе выборки в цикле идет запрос по одному из полей jsona. Не нахожу ничего лучшего, чем засунуть ее в модуль ПовтИсп, предположив, что вызов идет по одним и тем же данным.
Сейчас уже подумал, что, наверное, надо было выполнить первый запрос, получить все Значения, из них все поля отбора и вторым запросом нужные данные.
Запускаю тест, вижу, что с исправлениями взаимоблокировки ошибся, исправляю, запускаю тест снова.
Ловлю ошибку на этот раз с блокировками, вижу, что конфликт с тем местом, где исправлял дэдлок.
Вижу верхний комментарий, понимаю, что исправил неправильно. Решаю, что исправлять надо в месте вызова, запускаю поиск использования, конфигуратор виснет.
Занавес)
Выводы:
Пока не понял.
Вроде делал все, как следует, но медленно и ошибался.
Выходит, нужно набивать руку с парсингом, наверное.
Буду ли сдавать второй раз, пока не принял решение.
Всем удачи!