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

11.11.22

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

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

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

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

 

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

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

  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 администрирование сеансы оптимизация производительность

См. также

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

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

18.02.2025    5758    ivanov660    39    

59

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    8346    ivanov660    13    

60

Администрирование СУБД 1С v8.3 1C:Бухгалтерия Россия Бесплатно (free)

При хранении файлов в томах на диске они иногда исчезают. Разбираемся, почему.

23.05.2024    15058    human_new    21    

58

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

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

5 стартмани

15.02.2024    16419    317    ZAOSTG    100    

123

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

Казалось бы, базовое знание: «индексы надо обслуживать, чтобы запросы выполнялись быстро». Но обслуживание индексов выполняется долго и может мешать работе пользователей. Кроме того, в последнее время популярны разговоры о том, что индексы можно вообще не обслуживать – насколько это оправданно? Рассмотрим: на что влияет обслуживание индексов, когда надо и когда не надо его выполнять, и если надо – как это сделать так, чтобы никому не помешать?

16.01.2024    21669    Филин    17    

54

HighLoad оптимизация Программист 1С v8.3 1C:Бухгалтерия Абонемент ($m)

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

09.01.2024    27403    doom2good    50    

74

HighLoad оптимизация Системный администратор Программист Бесплатно (free)

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

20.11.2023    18352    ivanov660    7    

84
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Antoska 16 12.07.22 10:15 Сейчас в теме
14. victor_goodwill 63 12.11.22 14:33 Сейчас в теме
(3) (9) (11) Выпустил наконец-то версию с поддержкой MS SQL, но сам не тестировал - нет работающей базы 1С под MS SQL - протестировал только запрос получения исполняемых запросов и встроил его в обработку. Всем кто качал ранее - напишите в личку, отправлю доработанную обработку на почту или другим способом
Antoska; klaus38; +2 Ответить
2. victor_goodwill 63 14.07.22 11:37 Сейчас в теме
(1) Ок, принято. В качестве приоритетной доработки. На данный момент не могу сказать, когда смогу приступить, если есть в вашей практике правильный аналогичный запрос для MS SQL для получения TOP запросов, которым пользуетесь, то можете написать, чтобы я не изобретал велосипед
3. Antoska 16 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 458 18.07.22 12:49 Сейчас в теме
так понимаю, у вас еще вторая обработка - cmd=Обработки.ОбменСУправленческойБазой77.ПолучитьADOCommandТекущейБазыSQL()
можно текст этой функции?
6. victor_goodwill 63 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 49 23.08.22 22:29 Сейчас в теме
Доброго времени суток !) Уважаемый автор, хотел уточнить Ваше решение будет работать на СУБД SQL Server ?
Спасибо!
8. victor_goodwill 63 04.09.22 17:46 Сейчас в теме
(7) Здравствуйте! На данный момент нет, я пока не нашел время чтобы настроить тестовый стенд и отладить работу на MS SQL. Если быть уверенным в запросе для получения текущих запросов, которую приводили в (3), то могу без тестирования доработать обработку и сделать переключение между СУБД. Или если вы предложите другой запрос
9. xten 49 21.09.22 13:04 Сейчас в теме
Спасибо Уважаемый автор за обратную связь! Очень бы хотелось от вас магии в плане доработки под SQL ))
10. ziercool 41 23.09.22 11:13 Сейчас в теме
Скриншот удален по просьбе автора. Момент исправлен.
11. ziercool 41 23.09.22 11:18 Сейчас в теме
c MsSQL как я понял не работает? Тогда надо в заголовке указать что это только для postgresql, зачем я её тогда качал?

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

У себя пробовал на системном sa пользователе, текстов запросов нет( все query null...
18. victor_goodwill 63 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 63 27.01.23 06:03 Сейчас в теме
(19) Откройте отчет об ошибке что пишет. Чаще всего проблема с COM- коннектором
Соединитель = Новый COMОбъект("V83.COMConnector");


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