Непридуманные истории по оптимизации. История 1

13.06.19

База данных - HighLoad оптимизация

Первая статья из планируемого цикла об оптимизации приложений на базе 1С. Без теории. Одна практика.

Я решил начать цикл статей о том, как мы решаем те или иные технические проблемы связанные с 1С. В основном меня интересуют административные вопросы, то есть моя основная задача – сделать так, чтобы продуктивная система работала, несмотря на все попытки разработчиков и бизнес-аналитиков ее положить J

Говорил в предыдущих статьях, но напомню:

База ~4 Тб, 6 app серверов, 2 MS SQL сервера объединенных в AlwaysOn, сильно переписанная УТ 11.3.

 

В основном статьи будут небольшие, так как каждая будет охватывать только одну проблему. Если публике зайдет – буду писать пока будет материал. Если кого-то заинтересует сотрудничество или появятся технические вопросы – можно писать в личку.

Обращаю внимание – все нижеописанные проблемы имеют несколько решений, не всегда мое решение оптимальное, но оно точно помогло. Объективная критика приветствуется.

 

Итак, проблема этой недели. Повышенная нагрузка на ЦПУ в начале каждого часа и продолжающаяся примерно 5-10 минут.

Вот так выглядит проблема:

Вот более крупно самый большой всплеск в 21 час.

Следствием нагрузки на ЦПУ SQL сервера становится повышенный средний CALL (время вызова), а следовательно растет и время выполнения основных операций. Система «тормозит».

 

Причина всплеска на самом деле достаточно проста, у нас 3 с лишним тысячи магазинов по всей стране, в 16 часов по МСК начинают закрываться магазины. При закрытии магазина происходит много ресурсоемких операций, закрытие смены, печать документов, различные расчеты и прочее. В 21 час по МСК закрывается больше всего магазинов, поэтому и пик в это время наиболее длительный и высокий. Жалоб от пользователей не поступает, но… как то не аккуратненько.

Для решения решил посмотреть, а что за запросы массово выполняются в период с 20:55 до 21:20. Надеюсь вы собираете технологический журнал, потому что если не собираете – я не знаю, как вы анализируете ваши проблемы. Длинные call у меня собираются этим куском ТЖ:

 

<log location="D:\TJ_logs\Long_1" history="25">
     <event>
          <eq property="name" value="DBMSSQL" />
          <gt property="duration" value="10000" />
     </event>
<event>

 

Дальше у нас есть некое самописное ПО которое парсит технологический журнал и аккуратно складывает данные в базу MS SQL. Есть множество обработок на 1С делающие аналогичное, просто у нас объемы, с которыми 1С не справляется, мы используем C#, причем на создание и оптимизацию разработчик потратил пару месяцев.

 

Делаем запрос к БД и смотрим, какой контекст выполнялся за указанный период дольше всего:

 

SELECT TOP 10 Context, sum(_duration)/1000000, count(*)

  FROM [1C_Log].[dbo].[TJ_Long_1]

  WHERE _event = 'DBMSSQL'

  AND _eventDate between '2019-06-10 20:55' and '2019-06-10 21:20'

  GROUP by Context

  ORDER by sum(_duration) DESC

 

Получаем такой результат.

 

Видим, что основное время SQL сервера уходит на первые две операции. Посмотрим на первый запрос, который выполняется в это время:

 

контекст:

 

  SELECT top 1 sql

  FROM [1C_Log].[dbo].[TJ_Long_1]

  WHERE context = 'Форма.Вызов : Обработка.ЗакрытиеДня.Форма.Форма.Модуль.ЗакрытьСобытияНаСервереОбработка.ЗакрытиеДня.Форма.Форма.Форма : 659 : СистемаИнформирования.ОтметитьВыполненностьСобытийСистемыИнформирования(ЗакрываемоеПодразделение); ОбщийМодуль.СистемаИнформирования.Модуль : 507 : РезультатЗапроса = Запрос.Выполнить();'

  AND _eventDate between '2019-06-10 20:55' and '2019-06-10 21:20'

 

Результат:

 

INSERT INTO #tt390 WITH(TABLOCK) (_Q_000_F_000, _Q_000_F_001, _Q_000_F_002RRef, _Q_000_F_003RRef, _Q_000_F_004_TYPE, _Q_000_F_004_RTRef, _Q_000_F_004_RRRef) SELECTMAX(T1._Fld24158),MAX(T1._Fld24162),T1._Fld24159RRef,T1._Fld24160RRef,T1._Fld24161_TYPE,T1._Fld24161_RTRef,T1._Fld24161_RRRefFROM dbo._InfoRg24157 T1WHERE ((T1._Fld26199 = ? AND T1._Fld773 = ?)) AND ((T1._Fld24159RRef = ?))GROUP BY T1._Fld24159RRef,T1._Fld24160RRef,T1._Fld24161_TYPE,T1._Fld24161_RTRef,T1._Fld24161_RRRefp_0: 0Np_1: 0Np_2: 0x80FA5CB9019038F011E7EAD0A1C5BCF8

 

Вставка во временную таблицу. Выделяем отсюда запрос

 

SELECT

MAX(T1._Fld24158),MAX(T1._Fld24162),T1._Fld24159RRef,T1._Fld24160RRef,

T1._Fld24161_TYPE,T1._Fld24161_RTRef,T1._Fld24161_RRRef

FROM dbo._InfoRg24157 T1

WHERE ((T1._Fld26199 = 0 AND T1._Fld773 = 0))

AND ((T1._Fld24159RRef = 0x80FA5CB9019038F011E7EAD0A1C5BCF8))

GROUP BY T1._Fld24159RRef,T1._Fld24160RRef,T1._Fld24161_TYPE,T1._Fld24161_RTRef,T1._Fld24161_RRRef

 

И выполняем его.

 

Видим, что время выполнения составляет 54 секунды. Как-то многовато. А сколько в таблице записей?

 

 

Многовато. Дальнейший анализ показал, что в данный регистр сведений каждый месяц записывается порядка 50 млн записей. Заведен дефект, чтобы бизнес-аналитики проанализировали необходимость такого количества записей в регистре, а мы пока попробуем временно решить проблему, пока не будет целевого решения.

 

Посмотрим на план запроса и на индекс, который нам предложит Management Studio

 

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]

ON [dbo].[_InfoRg24157] ([_Fld24159RRef],[_Fld26199],[_Fld773])

INCLUDE ([_Fld24158],[_Fld24160RRef],[_Fld24161_TYPE],[_Fld24161_RTRef],[_Fld24161_RRRef],[_Fld24162])

 

Ну в принципе необходимость этого индекса мы могли бы предсказать и без помощи SQL, просто посмотрев на запрос и имеющиеся индексы, но так же проще J

ОК, немного упрощаем запрос, пишем:

 

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]

ON [dbo].[_InfoRg24157] ([_Fld24159RRef])

INCLUDE ([_Fld24158],[_Fld24160RRef],[_Fld24161_TYPE],[_Fld24161_RTRef],[_Fld24161_RRRef],[_Fld24162])

WITH (ONLINE = ON)

 

Два поля мы убрали из индекса так как это общие реквизиты, у нас в базе они не используются (достались от типовой) и всегда равны 0.

Ну а ONLINE = ON нужно чтобы при построении индекса пользователи могли продолжать работу.

Итак, строим индекс, время на построение на продуктивной системе ушло 2.5 часа.

Результат нагрузки на SQL.

 

 И выделим покрупней 21-ый час.

 

 

 

Видно, что нагрузка ушла. В Long данный контекст так же ушел из ТОП-10.

Задача решена.

Оптимизация Администрирование

См. также

Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    3580    spyke    28    

47

Быстродействие типовой 1С

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    5530    vasilev2015    19    

38

Анализируем SQL сервер глазами 1С-ника

HighLoad оптимизация Инструменты администратора БД Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих зааросов на sql, ожиданий, конвертация запроса в 1с и рекомендации где может тормозить

1 стартмани

15.02.2024    8265    167    ZAOSTG    73    

101

Удаление строк из таблицы значений различными способами с замером производительности

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    6544    doom2good    48    

64

Опыт оптимизации 1С на PostgreSQL

HighLoad оптимизация Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    9367    ivanov660    6    

76

ТОП проблем/задач у владельцев КОРП лицензий 1С на основе опыта РКЛ

HighLoad оптимизация Бесплатно (free)

Казалось бы, КОРП-системы должны быть устойчивы, быстры и надёжны. Но, работая в рамках РКЛ, мы видим немного другую картину. Об основных болевых точках КОРП-систем и подходах к их решению пойдет речь в статье.

15.11.2023    5342    a.doroshkevich    20    

72

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16587    skovpin_sa    14    

101
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
100. Yashazz 4722 18.06.19 13:18 Сейчас в теме
(97) А зачем превращать ИС в блог, в ЖЖ? Я ведь серьёзно, таких историй у каждого полным-полно, смысл их сюда вываливать?
+
101. VmvLer 18.06.19 13:22 Сейчас в теме
(100) ок, у каждого так у каждого.

Готов почитать вашу историю по решению неполадок на ИБ хотя бы с 2 ТБ?
Тут или на другом ресурсе, можно в ЖЖ/блоге. жду ссылку.
+
104. Yashazz 4722 18.06.19 13:32 Сейчас в теме
(101) Легко. База 1.7 ТБ на момент 2017 года. Адски пилёная УПП 1.3. Доступа к скулю - никакого, прав нет. ТЖ, если и есть, тоже не в моих руках. Итого доступен только замер производительности. По итогам замеров выясняется, что а) от параллельности не зависит, б) от загруженности оборудования и сети тоже. Внимательное чтение кода выводит на запрос, похороненный под более чем 10 перевызовами из разных обёрток, сделанных в разное время разными разрабами. Запрос также носит следы правок (комменты) в разные годы. Выясняется, что по сути речь идёт о выборке ссылок по одному из основных документов. И вот там в одном месте написано "различные". Для ссылок, ага. Я это слово стёр, и вместо 20 минут стало 3-4 минуты. Считать процент щас лень, просто факт.
Ещё накидать?))
+
105. VmvLer 18.06.19 13:36 Сейчас в теме
(104) кидайте, желательно с идентификацией модулей и пр.

чем больше бичевать разрабов, тем выше шансы, что так делать больше не будут - у меня такая детская иллюзия.

а вдруг не будут!?
+
106. Yashazz 4722 18.06.19 13:49 Сейчас в теме
(105) Хорошо. БП 2.0, база тоже под 2 ТБ, т.к. в неё накидали чудовищное множество первички. Модуль точно не вспомню, что-то связанное со спецодеждой и спецоснасткой, и там был подзапрос, который монтировался в общий здоровенный запрос одного из действий закрытия периода. Так вот, вроде всё ОК, временные таблицы, все дела. Стал замерять, выдирая кусками, через консоль и прочее, и наткнулся на "ОБЪЕДИНИТЬ" там, где оно вообще по смыслу не было нужно, не вёлся у них такой учёт и сильно вряд ли бы завёлся. Конфа с возможностью внесения изменений, поэтому пишу "ВСЕ" и вуаля, выигрыш тоже в разы и разы. Точные цифры уже подзабыл, но в 10-12 раз быстрее стало.
+
111. RustIG 1556 18.06.19 14:21 Сейчас в теме
(106) так и сейчас не идеальны все конфы, периодически на ИС об этом кто-то пишет...
+
113. Yashazz 4722 18.06.19 14:25 Сейчас в теме
(111) Это ладно, когда типовые конфы. А когда меняются РП, архитекторы, не ведётся единый учёт и контроль системы, и оно нарастает слоями у некоего заказчика нетиповой конфиги, тут совсем аллес.
+
114. RustIG 1556 18.06.19 15:55 Сейчас в теме
(113)
Это ладно, когда типовые конфы. А когда меняются РП, архитекторы, не ведётся единый учёт и контроль системы, и оно нарастает слоями у некоего заказчика нетиповой конфиги, тут совсем аллес.

главное, чтобы за такую сложность адекватно платили
+
107. Yashazz 4722 18.06.19 13:50 Сейчас в теме
(105) а вообще бичуй-не бичуй, это эффект многолетней доработки разными людьми без тотального аудита исходных и результатных конструкций. Один тут сделал, и вроде ОК, другой там - и тоже нет грубых косяков, а всё вместе - через пень-колоду, да и старые завалы никто не разбирает.
+
108. VmvLer 18.06.19 14:03 Сейчас в теме
(107) это верно подмечено. далее мой субъективный взгляд...

Я думаю, что у 1С сейчас проблемы роста и большие, которые выливаются в
нестабильный функционал типовых конфигураций.

Я не знаю как у них устроено управление проектами, но даже по коду видно,
что координация часто страдает.

Исправить ситуацию быстро не выйдет до тех пор, пока не появятся архитекторы нового поколения, которые будут чистыми глобалистами с фантастическим талантами держать под контролем сотни подсистем.
Немного пафосно, конечно, но факт - без эволюции сознания архитекторов проектов - 1С станет терять сначала качество(это уже происходит), а затем и количество в звонкой монете.

Пока что на проектах конфигураций "сидят" сотни архитекторов с узким спектром предметной области и тысячи кодеров-ботов, и хорошо если они не лебедь, рак и щука.
Yashazz; +1
110. RustIG 1556 18.06.19 14:19 Сейчас в теме
(104) да, конструкция "Различные" в запросе увеличивает время выполнения запроса - в этом случае надо логику запроса менять... вроде еще какие-то конструкции увеличивают время... где бы почитать об этом?
+
112. Yashazz 4722 18.06.19 14:22 Сейчас в теме
(110) Индексация временных таблиц зачастую увеличивает (я знаю про случаи, когда таблица полупуста или пустота "разная", или когда многотипные колонки), "Упорядочить По" увеличивает по ссылкам, гуидам, большим строкам, вроде Выразить как Строка(1000), всякие игры с иерархией увеличивают, ну а вообще Рупасов давно верно всё написал.
RustIG; +1
115. RustIG 1556 18.06.19 16:19 Сейчас в теме
116. Yashazz 4722 18.06.19 18:22 Сейчас в теме
(115) ага, и уже 28 плюсов за банальный репост. Взять что ли, пересказать синтакс-помощник, поднять на этом плюсиков)))
acanta; +1
99. Sergey.Noskov 1383 17.06.19 13:38 Сейчас в теме
(82)
Опишу пользу для себя. Исхожу из того, что даже если одному человеку было полезно, то статья того стоила, а Вы, Яков, так не считаете?
1. Показан процесс локализации и устранения проблемы. Мне интересен чужой опыт.
2. Понятен набор используемых инструментов (ТЖ, утилита парсинга ТЖ, БД данных ТЖ, Кибана). Опять таки повод сравнить "как у нас", подумать какой подход эффективнее.
3. Понятен подход к оптимизации запросов и разработке. А про создание индексов говорили даже на конференции 1С в блоке под кураторством Морозова Александра. Открыто рассказали, что для решения проблемы был создан индекс прямо в СУБД и что потом в конфигурации установили нужное индексирование и с обновлением всё вернулось в штатный режим.
4. Популяризация информации о больших БД. К сожалению владельцы крупных решений либо зашорены и бояться что либо рассказывать, либо им просто не до этого. А это плохо для развития направления.
Надеюсь Олег продолжит цикл.
Так же надеюсь на пополнение рядов авторов-практиков в теме HiLoad.
AlX0id; d4rkmesa; Aggressorak; Alien_job; artbear; mickey.1cx; Fox-trot; +7
102. Yashazz 4722 18.06.19 13:23 Сейчас в теме
(99) По пунктам:
1. ОК, согласен, но это давно описанная общая метода, которая дофига где доступна;
2. Опять же, либо это всё уже известно, либо "ваша утилита", которую вы даже сюда не выложили и её фишки не рассказали (кроме как её производительность) - вы лучше её опубликуйте или её принципы изложите;
3. Что позволено Морозову, то не позволено нам. Проверено экспериментально (((
4. Какой информации? Вы и о своей-то минимум сказали. Количество пользователей, количество сеансов, инфраструктура кластера и сети, характер бизнес-процессов, разбивка по времени суток, по регионам итд; самые "жадные" операции, порядок статистических величин по таблицам и индексам, регламентные действия (хотя б планы обслуживания в скуле) - где об этом хоть слово?
117. Sergey.Noskov 1383 19.06.19 15:14 Сейчас в теме
(102)
Вы и о своей-то минимум сказали. Количество пользователей, количество сеансов, инфраструктура кластера и сети..
представляете, есть инфо вплоть до моделей СХД, процессоров и схемы кластеров 1С, СУБД. Про регламенты задавали вопросы в комментариях, отвечал.
+
91. VmvLer 17.06.19 09:44 Сейчас в теме
Я думаю, что 1С ИБ от 4 Тб в промышленной эксплуатации не так много.
И любая информация по практике использования и решения неполадок в контексте таких ИБ
полезна безусловна.
Alien_job; Sergey.Noskov; RustIG; acanta; +4
Оставьте свое сообщение