Непридуманные истории по оптимизации. История 1
База данных - HighLoad оптимизация
Я решил начать цикл статей о том, как мы решаем те или иные технические проблемы связанные с 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.
Задача решена.
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
HighLoad оптимизация Разработчик 1С 8.3 1С:ERP Управление предприятием 2 Бесплатно (free)
Использование оператора «В» для полей или данных составного типа (например, Регистратор) может приводить к неочевидным проблемам.
10.11.2025 15885 ivanov660 48
HighLoad оптимизация Разработчик 1С:Предприятие 8 1C:ERP Бесплатно (free)
Приведем примеры использования различных в динамических списках и посмотрим, почему это плохо.
18.02.2025 16491 ivanov660 39
HighLoad оптимизация Системный администратор Разработчик 1C:ERP Бесплатно (free)
Не всегда индексирование с дополнительным упорядочиванием полезно.
04.02.2025 15134 ivanov660 21
HighLoad оптимизация Разработчик Россия Бесплатно (free)
А вы знали, что сервер 1С при соединении с базой на сервере PostgreSQL самостоятельно устанавливает некоторые параметры? Это важно знать при настройке сервера и отладке долгих запросов. Предлагаю разобраться.
27.08.2024 10402 soulner 10
HighLoad оптимизация Технологический журнал Системный администратор Разработчик Бесплатно (free)
Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.
24.06.2024 19126 ivanov660 13
HighLoad оптимизация Разработчик 1С:Предприятие 8 Бесплатно (free)
Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.
06.06.2024 24976 Evg-Lylyk 73
HighLoad оптимизация Механизмы платформы 1С Системный администратор Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Сравним «Регистры сведений» с «Сервисами интеграции» и узнаем, кто быстрее!
28.03.2024 14632 dsdred 27
HighLoad оптимизация Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.
13.03.2024 14616 spyke 29
Вы упомянули о собственном парсере технологического журнала на C#, было бы интересно посмотреть.
Если есть возможность включите это в следующую статью.
ЗЫ: да и зная 1С и ее тормознутость обращать внимание на этот пункт вообще смысла не имеет, ибо одна реструктуризация чуть-немного-большой таблички средствами платформы (такими, как запрос в цикле, результатом которого и является эта процедура реструктуризации) занимает бесконечное время процессора (квадриллионы инструкций).
ЗЫ: ну и выпилить из самого запроса эти нулевые поля.
Учитывая тормознутость современных типовых решений, боюсь даже представить себе цены на железо и лицензии, чтоб типовая конфигурация УТ 11.4 работала с приемлемой скоростью, хотя бы в части выписки и печати первички.
Я это очень хорошо изучил и могу привести ещё десятка два подобных примеров из УТ 11, но в этом нет никакого смысла. Мы отказались от внедрения УТ 11.4 в пользу УТ 10.3. При всем уважении, толстый клиент 10.3 кратно производительнее тонкого 11.4. Уверен, 11.4 - это тупик.
Отключить можно в переопределяемом модуле как я написал выше.
ПродажиСервер.ПолучитьОтветственногоПоСкладу() - вызывается при инициализации реализации и заполняет необязательный реквизит Отпустил и ОтпустилДолжность примерными значениями.
ВЫБРАТЬ ПЕРВЫЕ 1
РеализацияТоваровУслуг.Отпустил,
РеализацияТоваровУслуг.ОтпустилДолжность
ИЗ
Документ.РеализацияТоваровУслуг
...
...
УПОРЯДОЧИТЬ ПО
РеализацияТоваровУслуг.МоментВремени УБЫВ
ПоказатьКак вы думаете, что будет если у вас хотя бы 250 тыс. реализаций в год?
Можно пример самописной толковой конфигурации по функциональности сопоставимой с УТ 11?
Сколько видел "сейчас мы сами напишем", выглядело это ещё хуже чем дописанная УТ11. И по функциональности как то проигрывало.
В конце карьеры можно найти массу более полезных способов потратить время и накопленный опыт, чем написание статей за стартмани.
у каждого своя наработанная компетенция. значит, нет опыта в других областях 1С.
лично про меня - я не знаю мобильную платформу, json, многие типовые конфигурации не внедрял, разработкой на УФ не занимался...
у меня мотивация - не оставить свой опыт внутри себя - написать обработку за 5 тыс. рублей и понять, что она может пригодиться еще кому-то, поделиться ею.
плюс, порой я вижу как сложно мыслят и программируют некоторые программисты, хочется поделиться своим видением.
Такой нет :) А почему ? Да потому, что не нужно. Десятки более простых есть (ну, десятки - это если считать еще с версии 7.7), а такой нет. И не будет. Потому, что для решения конкретной бизнес-задачи такой монстр в принципе не нужен. Я Вам открою страшную тайну : типовые конфигурации пишутся не с целью создать классное ПО , и не с целью удовлетворить клиентов. А с целью срубить как можно больше бабла. Помните об этом, и Вам многое станет ясно.
Зачем вообще по вашему мнению, как фрилансера или фикси выполнять привязку продажи 1с лицензий и итс к какой-либо фирме-франчайзи?
Чего нового и хорошего в этой статье, а?
Ну давайте я вам расскажу, как закрытие бух.периода убыстрил с полутора часов до семи минут. Написав 4 символа. Давайте? А мне за это более 200 плюсов?)) Оптимизация, тыкскзть!
Нарушение лицензионного соглашения очень спорный вопрос, так как например смотрите:
У меня два сервера в AlwaysOn. Один из серверов подключен к app серверу. Я строю индекс на второй, неактивной ноде и он появляется на основной базе. Является ли это нарушением с точки зрения лицензионной политики? Я задавал данный вопрос в 1С, ответ не получил, а наставить не стал.
Основных причин три:
1. Сохранить информацию на память для себя.
2. Показать своим сотрудникам, что именно делается на продуктиве и какими средствами.
3. Показать людям, которые еще не умеют это делать, показать, что это не сложно и принудить к изучению нового. Показать, что 1С это не только код, но и инфраструктура.
И да, я так понимаю, что тут принято поклоняться плюсикам? Не очень понимаю смысл этого, за плюсиками не гонюсь, что на них покупать не знаю.
А насчёт пользы от статьи - я так и не проникся.
1. Если для себя и на память, то, может, не стоит превращать ИС в личный бложик?
2. А завтра вы ИС будете использовать как площадку обучения своих юзеров?
3. Пока что вы показали несколько скриншотов и решение одного очень узкого кейса. Желающим реально познавать - для начала Филиппова в руки и айда.
Интересно, что ответят ваши 1С-ники. Может там вообще можно отказаться от такого запроса, провести "умную" ручную оптимизацию и индексы не пришлось бы менять.
Важно(!) Отказаться от запроса - значит взять задачу в спринт, проставить ей приоритет и потом выпустить в релизе. Это от 2 недель до 3 месяцев. Мне же хотелось результат здесь и сейчас.
1. Scrum, не канонический, но какой уж получился. Всех устраивает пока.
2. TFS+Jira.
3. Их всегда не хватает, но в данном случае просто задача не приоритетная. Жалоб от пользователей нет, значит нет инцидентов. Нет инцидентов - задача без дополнительных пинков с моей стороны как релиз-менеджера уйдет в самый низ списка.
После недельной битвы удалил все, что было связано с индексами и статистиками по полям из процедуры. Время выполнения процедуры стало 1.5 часа. Планы запросов ужасны, студия ругается, но главное время выполнения процедуры стало предсказуемым, стабильным и приемлемым.
и кстати реально интересно, что думает администрация и модераторы ИС на тему чуть ли не пропаганды нарушения лицензионных соглашений.
Нет дыма без огня.
Видите ли, есть люди, у которых "караван идёт со скоростью хромой лошади", а есть люди у которых "семеро одного не ждут".
Имхо, все подобные высказывания появляются когда очередная хромая лошадь ошиблась и вместо каравана попала в команду спринтеров.
Но тут как вы понимаете вопрос в ценности груза и самой возможности замены, а не в хорошем отношении к лошадям.
Сколько стоит день простоя на вашем предприятии?
Каков конкурс на вакансию для такого специалиста?
День простоя стоит дорого. Я думаю миллиарды долларов, если мы говорим про все предприятие в целом.
О вакансии какого специалисты вы говорите?
Хромых у нас хватает.. у нас не хватает практики в задачах по оптимизации.
Так хоть почитаем (хотя это направление возможно для инфостарта как магазина разработок не выгодно, вы предлагаете не разработку, а ноу-хау).
Вчера где то читал что Huawei оценили убытки от санкций США в 35 млрд долларов в год. Боюсь даже спросить что у вас за предприятие если у вас убытки миллиарды долларов за день простоя.
Ещё накидать?))
главное, чтобы за такую сложность адекватно платили
Я думаю, что у 1С сейчас проблемы роста и большие, которые выливаются в
нестабильный функционал типовых конфигураций.
Я не знаю как у них устроено управление проектами, но даже по коду видно,
что координация часто страдает.
Исправить ситуацию быстро не выйдет до тех пор, пока не появятся архитекторы нового поколения, которые будут чистыми глобалистами с фантастическим талантами держать под контролем сотни подсистем.
Немного пафосно, конечно, но факт - без эволюции сознания архитекторов проектов - 1С станет терять сначала качество(это уже происходит), а затем и количество в звонкой монете.
Пока что на проектах конфигураций "сидят" сотни архитекторов с узким спектром предметной области и тысячи кодеров-ботов, и хорошо если они не лебедь, рак и щука.
Опишу пользу для себя. Исхожу из того, что даже если одному человеку было полезно, то статья того стоила, а Вы, Яков, так не считаете?
1. Показан процесс локализации и устранения проблемы. Мне интересен чужой опыт.
2. Понятен набор используемых инструментов (ТЖ, утилита парсинга ТЖ, БД данных ТЖ, Кибана). Опять таки повод сравнить "как у нас", подумать какой подход эффективнее.
3. Понятен подход к оптимизации запросов и разработке. А про создание индексов говорили даже на конференции 1С в блоке под кураторством Морозова Александра. Открыто рассказали, что для решения проблемы был создан индекс прямо в СУБД и что потом в конфигурации установили нужное индексирование и с обновлением всё вернулось в штатный режим.
4. Популяризация информации о больших БД. К сожалению владельцы крупных решений либо зашорены и бояться что либо рассказывать, либо им просто не до этого. А это плохо для развития направления.
Надеюсь Олег продолжит цикл.
Так же надеюсь на пополнение рядов авторов-практиков в теме HiLoad.
1. ОК, согласен, но это давно описанная общая метода, которая дофига где доступна;
2. Опять же, либо это всё уже известно, либо "ваша утилита", которую вы даже сюда не выложили и её фишки не рассказали (кроме как её производительность) - вы лучше её опубликуйте или её принципы изложите;
3. Что позволено Морозову, то не позволено нам. Проверено экспериментально (((
4. Какой информации? Вы и о своей-то минимум сказали. Количество пользователей, количество сеансов, инфраструктура кластера и сети, характер бизнес-процессов, разбивка по времени суток, по регионам итд; самые "жадные" операции, порядок статистических величин по таблицам и индексам, регламентные действия (хотя б планы обслуживания в скуле) - где об этом хоть слово?
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1076647
Создание 13.06.19 11:30
Обновление 13.06.19 11:30
Просмотры 18532
Загрузки 0
Рейтинг
90
Комментарии 117
Код открыт Да
Рубрики HighLoad оптимизация
Кому
Системный администратор
,
Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)