Решение проблем подвисания 1С “в онлайне”. Инструмент - консоль управления блокировками и процессами 1С и PostgreSQL (MS SQL - тестируется)

11.11.22

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

Обработка-консоль, улучшенная версия консоли администрирования 1С для решения проблем с производительностью, поиска и устранения блокировок и длительных запросов. Тестировалось на платформе 8.3.14, 8.3.17, 8.3.20 УФ.

Скачать файлы

Наименование Файл Версия Размер
Решение проблем подвисания 1С “в онлайне”. Инструмент - консоль управления блокировками и процессами 1С и PostgreSQL (MS SQL - тестируется):
.epf 20,21Kb
78
.epf 20,21Kb 78 Скачать

 

Вводные условия

Работая в высоконагруженных базах, я часто встречался с таким феноменом: когда возникают проблемы производительности быстро решить их с использованием стандартных средств практически невозможно или крайне неудобно. Это обусловлено следующими причинами: все данные о проблемах разрознены, а чтобы выявить реальный источник нужно анализировать их во-взаимосвязи. На данный момент я имею на вооружении следующие источники данных и инструменты:

  1. Запрос по TOP текущих выполняющихся запросов PostgreSQL (я работал в основном с этой СУБД последние 10 лет), отсортированных по времени выполнения в обратном порядке. Там же используется функция определения блокирующих процессов. Его приблизительный вид такой (можно запускать с отбором без автовакуума):
    SELECT pg_stat_activity.datname,  
    	NOW() - query_start AS duration,
    	query_start,
    	pg_stat_activity.pid, 
    	pg_blocking_pids(pg_stat_activity.pid) as blocked_by,
    	query,
    	state,
    	wait_event_type,
    	wait_event,
    	pg_stat_activity.backend_start 
    FROM pg_stat_activity 
    	left join pg_stat_progress_vacuum 
    	on pg_stat_activity.pid = pg_stat_progress_vacuum.pid
    where COALESCE(state, '') <> 'idle'
    	--and not query like 'autovacuum%'
    	--and query_start is not null
    ORDER BY duration DESC, query;

     

  2. Консоль администрирования 1С: Предприятия. Главным ее недостатком является неудобство интерфейса: данные не обновляются, ручное обновление крайне неудобно (надо кликать несколько раз мышью, а не горячей клавишей), зависимые данные - а именно блокирующие соединения из сеансов вынуждают переключаться в соединения, что в часы высокой нагрузки могут приводить к зависанию. Есть pid СУБД, но какой запрос выполняется по этому pid не отображается, а чтобы понять необходимо обращаться к запросу TOP из п.1 (см. выше)
  3. Консоль заданий от ИР (ToromzIT - шикарнейшей подсистемы, не нуждающейся здесь в рекламе). При выставленных настройках - отключенные успешные задания и без отбора по методу регламентного список фоновых отображает активные фоновые задания и ошибки, что часто дает понять: происходят какие то проблемы! А иногда понять, кто является причиной
  4. Техно журнал 1С и замечательная обработка от Анализ техножурнала ИР от того же ToromzIT. Тут я смотрю наиболее тяжелые запросы, блокировки и в каких местах программы они происходят с точностью до строки кода (но часто это оказываются довольно очевидные проведения документов и программные блокировки тяжелых объектов, что не дает понять истинную причину замедлений)
  5. Анализ метрик в Zabbix, как общих по нагрузке на диск / процессор /память, так и специфических от Mamonsu именно по PostgreSQL (самые важные на данный момент в моем понимании - это активность автовакуума, а так же попадание в буфер кэша). Но это как правило “посмертный анализ” и на принятие экстренного решения не сильно оказывает влияние
  6.  Также раньше использовал pgBadger  - анализатор логов PostgreSQL на Perl, достаточно красиво предоставляющий отчет о проблемах с БД, а также самые тяжелые запросы. При этом удобно "бить" логи сервера по дням (циклически на 1 неделю). В связи с настройкой Zabbiх на предприятии актуальность немного упала. Также наиболее нагруженные запросы за последнее время можно получить из представления  pg_stat_statements, но здесь я не буду приводить ее описание, так как это источник данных, а анализ строится с помощью различных запросов, тема, которая выходит за пределы этой статьи.
  7. Из важных инструментов, которые используются при борьбе с “тормозами” был анализатор планов запросов от компании Тензор - он помогает понять причину и тюнинговать тяжелые запросы, являющиеся узкими местами, если их удавалось обнаружить при помощи предыдущих инструментов. Да PostgreSQL ведет себя несколько иначе, чем MS SQL, и надо учитывать эти особенности. И планы запросов, представленные в удобном виде иногда помогают понять, как переписать запрос или добавить недостающий индекс.

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

Решение

Поэтому я озадачился о том, чтобы иметь в арсенале какой-то инструмент с одной стороны достаточно простой в использовании, с другой достаточный для решения 95% всех проблем с производительностью. Больше всего недоволен я был консолью администрирования 1С. Она, по идее, должна была давать самую ценную информацию - о сеансах пользователей 1С, т.е. по ней точнее всего можно в онлайне понять, где проблема именно в системе 1С, в каком именно пользователе или процессе. Это отличает ее от других инструментов, где нужно идти "снизу вверх" от проблем в SQL или системных показателей, которые не привязаны ни к пользователю ни к бизнес-процессам в 1С. 

В общем, я сделал обработку "Консоль управления блокировками 1С", которая решала 3 задачи

  • связанное отображение блокирующих и ожидающих процессов,
  • отображение SQL запросов, также с зависимостям по блокировкам,
  • по сеансам в которых 1С возвращает pid СУБД отображается запрос  SQL, который выполняется данным pid (и в запросах SQL также отображается пользователь 1С, сеанс). 

       Этот запрос SQL можно перевести в термины названий объектов 1С вместо таблиц хранения Postgres.

Самое главное - все это на одном экране! Не надо скакать между программами или окнами, судорожно нажимая кнопку "Обновить" и перематывать списки в поиске нужного сеанса. Время обновления можно настроить (слишком частое мешает анализу). Можно нажимать на кнопку обновляя вручную, но обновляя сразу все данные, а не по очереди (как в случае со стандартной консолью). Кроме того, в программе выделяются цветом проблемы, чего нет в стандартной консоли.

Ну и, естественно, тут можно завершить сеанс 1С или pid Postgres либо "мягким способом", отменив текущий запрос, либо "жестким" убиванием процесса, с отваливанием пользователя, если первый не помог.

 

  Как пользоваться

1. Настроить Строку соединения с 1С кластером в формате : tcp://ИмяКластера:Порт (для порта по-умолчанию двоеточие и порт можно не указывать)

2. Настроить параметры соединения с сервером СУБД:

  • Сервер БД в формате ИмяСервера; port=Порт ( "; port=Порт" можно не указывать, если он по-умолчанию и равен 5432 для Postgres )
  • Имя базы на сервере СУБД
  • Имя пользователя
  • Пароль

3. Прочие настройки: таймаут обновления (комфортный от 20-30 сек), перевод запросов в 1С имена (лучше не включать, если метаданных в конфигурации много, например в типовых иначе при обновлении будет тормозить. Перевод в 1С можно делать по каждому запросу кнопкой)

Все настройки сохраняются в данных формы и повторно вводить их при каждом открытии не нужно

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

UPD. Убрал зависимости от внешних функций, перенес все в обработку

UPD. Сделал адаптацию под MS SQL в режиме бета-тестирования. Чтобы работала необходимы права на системные таблицы

 

 

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

  1. Доделать нормальное (сейчас есть, но пока неудобно используемо) ведение логов длительных запросов и блокировок в таком формате, чтобы потом можно было строить отчеты
  2. Сделать настройку автоматического убивания сеансов или запросов SQL если они превышают какие-то временные границы
  3. Сделать адаптацию под MS SQL (уже начата - в процессе тестирования пользователями MS SQL)
  4. Сделать более умный переводчик запросов на язык 1С (сейчас только имена таблиц на объекты, но не сложные выражения), или как минимум более быстрый  - на данный момент он достаточно неоптимально делает анализ текстов запросов и замены
  5. Добавить другие показатели из консоли, сделать их перевод на “человеческий язык”, разобраться как их можно использовать. Скажем, потребление памяти.

Консоль блокировки тормоза highload SQL администрирование сеансы оптимизация производительность

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4574    dsdred    53    

72

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

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

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

1 стартмани

15.02.2024    7658    158    ZAOSTG    68    

96

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

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

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

09.01.2024    5988    doom2good    48    

63

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

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

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

20.11.2023    8879    ivanov660    6    

76

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

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

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

15.11.2023    5109    a.doroshkevich    20    

72

Мигрируем с MS SQL на PostgreSQL

Администрирование СУБД Бесплатно (free)

Переход с MS SQL на PostgreSQL сопряжен с рисками для бизнеса и неизбежно вызывает множество вопросов. Статья посвящена тому, как заранее подготовиться к предстоящей миграции, провести нагрузочное тестирование, выявить возможные проблемы перехода и провести необходимую оптимизацию.

13.11.2023    10832    ivanov660    31    

73

Неочевидный баг Истории данных, убивающий rphost

Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

Расследование о том, почему команда ИсторияДанных.ОбновитьИсторию() убивала rphost.

08.11.2023    6118    dsdred    48    

72

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

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

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

11.10.2023    16195    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Antoska 17 12.07.22 10:15 Сейчас в теме
14. victor_goodwill 46 12.11.22 14:33 Сейчас в теме
(3) (9) (11) Выпустил наконец-то версию с поддержкой MS SQL, но сам не тестировал - нет работающей базы 1С под MS SQL - протестировал только запрос получения исполняемых запросов и встроил его в обработку. Всем кто качал ранее - напишите в личку, отправлю доработанную обработку на почту или другим способом
Antoska; klaus38; +2 Ответить
2. victor_goodwill 46 14.07.22 11:37 Сейчас в теме
(1) Ок, принято. В качестве приоритетной доработки. На данный момент не могу сказать, когда смогу приступить, если есть в вашей практике правильный аналогичный запрос для MS SQL для получения TOP запросов, которым пользуетесь, то можете написать, чтобы я не изобретал велосипед
3. Antoska 17 14.07.22 15:36 Сейчас в теме
(2)Обычно монитором смотрим. Поисковик выдал такой пример:
-- получаем список всех текущих запросов
SELECT LEFT((SELECT [text] FROM sys.dm_exec_sql_text(der.sql_handle)),500) AS txt
--,(select top 1 1 from sys.dm_exec_query_profiles where session_id=der.session_id) as HasLiveStat
,der.blocking_session_id as blocker, DB_NAME(der.database_id) AS База, s.login_name, *
from sys.dm_exec_requests der
left join sys.dm_exec_sessions s ON s.session_id = der.session_id
WHERE der.session_id<>@@SPID
-- AND der.session_id>50  -- если необходимо исключить системные запросы
5. Alex_Japanese_Student 454 18.07.22 12:49 Сейчас в теме
так понимаю, у вас еще вторая обработка - cmd=Обработки.ОбменСУправленческойБазой77.ПолучитьADOCommandТекущейБазыSQL()
можно текст этой функции?
6. victor_goodwill 46 09.08.22 10:27 Сейчас в теме
(5) Исправил, убрал зависимости

Вот код, который я добавил:
Функция ПолучитьАДОCommand(Знач ConnectionString="") Экспорт 
	
	#Если Не МобильноеПриложениеСервер Тогда 	
	Соединение = Новый COMОбъект("ADODB.Connection");
	Соединение.ConnectionTimeOut = 70;
	Соединение.CommandTimeout = 70;
	Соединение.CursorLocation = 3;
	Соединение.ConnectionString = ConnectionString;
	try
		Соединение.Open();  
	except 
		Сообщить("Невозможно установить соединение");
		//Сообщить(ConnectionString);
		Возврат -1;
	endtry;
	
	Cmd = Новый COMОбъект("ADODB.Command");
	Cmd.ActiveConnection = Соединение;
	Cmd.CommandTimeout = 70;
	Возврат Cmd;	
	#КонецЕсли
КонецФункции


Функция ПолучитьADOCommandТекущейБазыSQL() 
	ConnectionString="Driver={PostgreSQL ANSI(x64)}; Server="+СерверБД+"; Database="+ИмяБД+"; Uid="+ПользовательБД+"; Pwd=" +ПарольБД;
	Возврат ПолучитьАДОCommand(ConnectionString);
КонецФункции	
Показать


Кроме того, добавил 4 реквизита на форму СерверБД, ИмяБД, ПользовательБД, ПарольБД
7. xten 47 23.08.22 22:29 Сейчас в теме
Доброго времени суток !) Уважаемый автор, хотел уточнить Ваше решение будет работать на СУБД SQL Server ?
Спасибо!
8. victor_goodwill 46 04.09.22 17:46 Сейчас в теме
(7) Здравствуйте! На данный момент нет, я пока не нашел время чтобы настроить тестовый стенд и отладить работу на MS SQL. Если быть уверенным в запросе для получения текущих запросов, которую приводили в (3), то могу без тестирования доработать обработку и сделать переключение между СУБД. Или если вы предложите другой запрос
9. xten 47 21.09.22 13:04 Сейчас в теме
Спасибо Уважаемый автор за обратную связь! Очень бы хотелось от вас магии в плане доработки под SQL ))
10. ziercool 38 23.09.22 11:13 Сейчас в теме
Скриншот удален по просьбе автора. Момент исправлен.
11. ziercool 38 23.09.22 11:18 Сейчас в теме
c MsSQL как я понял не работает? Тогда надо в заголовке указать что это только для postgresql, зачем я её тогда качал?

По комменту (10) сделайте 2 доп. реквизита на форму, будет счастье не хранить логины/пароли в коде.
12. victor_goodwill 46 11.11.22 17:18 Сейчас в теме
Исправил, сразу не увидел этот "хвост"
13. victor_goodwill 46 11.11.22 17:20 Сейчас в теме
(11) Извините, сделал, как вы сказали - исправил заголовок, пока не доработаю под MS SQL.
15. ziercool 38 14.11.22 21:58 Сейчас в теме
Опечатка в запросе для MsSQL, Последнее поле AS query, лишний разделитель полей. Т.е. после AS query надо убрать запятую
17. victor_goodwill 46 16.11.22 06:12 Сейчас в теме
(15) Спасибо за замечание, исправил
16. ziercool 38 15.11.22 21:00 Сейчас в теме
По MsSQL нужен еще пользователь с особыми правами для чтения определенных системных таблиц. иначе -
->"Запрещено разрешение VIEW SERVER STATE на объект "server" базы данных "master""<-

У себя пробовал на системном sa пользователе, текстов запросов нет( все query null...
18. victor_goodwill 46 16.11.22 06:13 Сейчас в теме
(16) К сожалению тут не подскажу, у меня были тексты запросов на тестовом Express сервере. Если есть решение проблемы - предлагайте, попробую исправить.
19. stneon 27.01.23 01:55 Сейчас в теме
Сервер 1С - 8.3.22.1709
Сервер БД - PostgreSQL 14
Клиент тонкий под Windows

Баян не едет.
Прикрепленные файлы:
20. victor_goodwill 46 27.01.23 06:03 Сейчас в теме
(19) Откройте отчет об ошибке что пишет. Чаще всего проблема с COM- коннектором
Соединитель = Новый COMОбъект("V83.COMConnector");


Для его корректной работы на сервере предприятия необходимо зарегистрировать comcntr.dll через regsvr32.exe
21. victor_goodwill 46 27.01.23 06:04 Сейчас в теме
(19) Также может быть проблема с некорректным адресом сервера предприятия и его порта (если он не стандартный)
22. chg 10.03.23 07:22 Сейчас в теме
Добрый день, как обстоят дела с анализом MSSQL?
23. victor_goodwill 46 10.03.23 11:43 Сейчас в теме
(22) Добрый, обработка под MS SQL дописана, но не прошла полноценного тестирования. Думаю там остались небольшие штрихи. Ну и те, кто хорошо в нем разбираются смогут сделать более тонкую настройку и какие-то фичи для себя
Оставьте свое сообщение