gifts2017

Борьба с вредителями - как избавиться от "непредвиденных утечек памяти" сервера 1С

Опубликовал Олег Филиппов (comol) в раздел Программирование - Инструментарий

Обычный рабочий день и вроде бы ничего не предвещало беды, вот только 1С вдруг начинает жутко "тормозить". Оперативно среагировав видите что сервер "съел" всю свободную память и принялся за файл подкачки. За это время либо всё "валится", либо вы сами перезагружаете сервер и остаток дня слушаете жалобы недовольных пользователей. Знакомая ситуация?

Собственно небольшой скрипт, который нужно поставить в расписание на сервере/серверах 1С - поменять там нужно имя сервера - на ваше, и количество памяти которое ему допустимо съесть безболезненно - можете ещё выставить время которое у пользователя будет шанс "прекратить" съедать память 1С (метафору вы ведь поняли - речь идёт о пользователях/программистах которые или сами запрос написали "кривой" или сделали настройку таких же свойств). Собственно скрипт рассчитан на 1 сервер и 1 рабочий процесс, и менять на универсальный не буду и вам не советую.

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

Наименование Файл Версия Размер Кол. Скачив.
KillUsers.vbs
.vbs 1,11Kb
01.10.11
118
.vbs 1,11Kb 118 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Serg Kondrasgov (SergDi) 03.10.11 14:24
в данный момент у меня похожая проблема, сервер отъедает всю доступную память, лечу это дело запуском нового процесса и остановкой рабочего, в течении 10 секунд все приходит в норму.
а этот скрипт грохает непосредственно юзверей?
2. Ийон Тихий (cool.vlad4) 03.10.11 14:34
Опиши будь добр, что за скрипт, - не "net start/stop"?
3. Ийон Тихий (cool.vlad4) 03.10.11 14:37
+ 2 конечно, же нет, читать разучился...а на чем скрипт написан? на vbs .ps сегодня не мой день...
4. Олег Филиппов (comol) 03.10.11 15:29
(1) SergDi, да, убивает тех пользователей, которые "рушат" сервер. Если запрос на самом деле серьёзный - балансировка не произойдёт, т.к. пользователь выболняет запрос к БД... такие пользователи не балансируются. В итоге на рабочем процессе вы этих пользователей всё равно убьёте.. только вот можете не успеть... у нас просто SQL "быстрый"... и мы реально не успевали это дело остановить... а скрипт успевает :)
5. Олег Филиппов (comol) 03.10.11 15:38
И хоть бы кто "+" поставил кто встречал такое дело. Сейчас ведь "придут доброжелатели" наставят минусов, и уже не скачаете когда встретитесь :)
6. Артур Аюханов (artbear) 03.10.11 15:43
12 Гб - объем виртуальной или реальной памяти?
Скрипт проверялся на 64-битных серверах или 32-битные также проверялись?
ЗЫ у меня есть контора, которая съекономила 10 штук на 64-битном ключе и сидят на 32х :)
7. Steve Gordon (SGordon1) 03.10.11 15:45
А утечки мозгов только из за пользователей бывают?
8. Олег Филиппов (comol) 03.10.11 15:50
(7) SGordon1, Конечно не только... в основном из за программистов... в принципе утечки это нормальный процесс для 1С.. скрипт нужен для борьбы с "резкими" утечками... для борьбы с обычными подойдёт перезапуск процессов по расписанию...
9. Олег Филиппов (comol) 03.10.11 16:36
(6) artbear, 12 ГБ конечно про виртуальную память. Скрипт работал только на 64 битных системах... я как-то с трудом себе уже представляю 32 битный сервер... Там наверное будет реботать при очень тонкой настройке... ведь 2ГБ это не так много.. они могут быть заняты и при нормальной работе пользователей... а мы будем выкидывать "ни в чём не повинных", только потому что они больше всех старались...
10. Андрей (andru_dv) 07.10.11 12:55
Это точно полезная вещь т.к.
переодически возникают такие "пожыратели" памяти.
Спасибо за разработку!
11. Дмитрий (Mitri4) 11.10.11 11:42
А как можно вычислить какие запросы вешают сервер?
12. Олег Филиппов (comol) 11.10.11 12:02
(11) Mitri4, нуу... это уже не так просто в идеале нужно конечно включать профайлер и проверять. Но вообще Activity Monitor показывает самые ресурсоёмкие запросы. просто если запрос большой, то может быть не полным. А ещё можете не успеть "поймать" запрос - если на SQL сервере памяти много и диски быстрые, сервер 1с может раньше "рухнуть".. если данный скриптик не работает.
13. Юрий Хрипачёв (hrip) 14.10.11 16:55
По моему проблема утечки памяти на 8.2 неплохо решается и штатными средствами. В свойствах кластера необходимо указать время через какое необходимо перезапускать процессы и ограничение на объем памяти "съеденной" процессом при которой происходит его перезапуск. На 8.1 можно только указать время через которое будут перезапускаться процессы (хотя пока работали на 8.1 таких проблем и не возникало).
При перезапуске процесса соединения не обрываются - они передаются другому процессу.
14. Брест Беларусь (zhleonid8) 18.10.11 09:37
15. Олег Филиппов (comol) 18.10.11 16:24
(13) hrip, Это разные проблемы... проблема постепенной утечки памяти решается перезапуском. А проблема "мгновенной" - только таким образом - нужно успеть "убить" клиента, запустившего не правильный запрос...
16. Иван Петров (nzass) 25.10.11 19:13
а у меня проще. 2 batника в шедулере
например в 18.00
stop.bat - "C:\Program Files\1cv82\8.2.11.236\bin\ragent.exe" -stop
в 18.01
start.bat - "C:\Program Files\1cv82\8.2.11.236\bin\ragent.exe" -start
17. Трактор Трактор (Трактор) 25.10.11 21:12
comol пишет:И хоть бы кто "+" поставил кто встречал такое дело. Сейчас ведь "придут доброжелатели" наставят минусов, и уже не скачаете когда встретитесь :)

Плюсы выпрашивать нехорошо. Повышаются шансы быть заминусованным.
18. Ийон Тихий (cool.vlad4) 25.10.11 21:13
(16) нет, там другое, там скрипт насколько я помню, мониторит память, если он превышает лимит, то рубит процесс.
19. Трактор Трактор (Трактор) 25.10.11 22:38
Незачем огород городить с виндовым планировщиком. Всё делается в рамках 1С. Правда только под виндой. 1Сники почему-то не сочли нужным сделать управление кластером из-под линукса.
Вот перевод код этого скрипта на язык 1С. Не проверял так как лениво.
В 1Се делаешь регламентное задание которые каждую минуту исполняет следующий код:
Процедура УбитьЗлодея()
	
	Соединение = Новый COMОбъект("V82.COMConnector");
	Агент = Соединение.ConnectAgent("tcp://ИмяСервера"); // Имя сервера
	Кластер = Агент.GetClusters()[0]; // 1 кластер в сервере
	Агент.Authenticate(Кластер, "АдминистраторКластера", "ПарольАдминистратора");
	
	РабочийПроцесс = Агент.GetWorkingProcesses(Cluster)[0]; // 1 Рабочий процесс в кластере
	
	Памъять = РабочийПроцесс.MemorySize;
	
	Если Памъять > 12582912 Тогда // Если сожрал больше 12 ГБ - ищем гада
		МассивСессий = Агент.GetSessions(Cluster).Выгрузить();
		Для Каждого Сессия Из МассивСессий Цикл
			ДлительностьВызоваСервераSQL = Сессия.durationCurrentDBMS // Длительность в миллисекундах
			Если ДлительностьВызоваСервераSQL > 300000 Тогда
				Агент.TerminateSession(Кластер, Сессия); // Если больше 5-ти минут выполняет запрос к СУБД - убиваем
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры
...Показать Скрыть

Соответственно любой может переписАть код под несколько кластеров и несколько рабочих процессов.
За публикацию плюс так как она обращает взор 1Сников на малопопулярную тему.
Ещё бы авторов платформы попинать за то что управление кластером не работает под линуксом и за то что фоновые задания не убиваются.
user609516_rrustam11983; croga; KrivosheevEV; gogi2003; krv2k; janjul; comol; +7 Ответить 1
20. Олег Филиппов (comol) 31.10.11 17:34
(19) Трактор, тоже можно, просто подумалось что виндовым планировщиком будет надежнее... если сервер "умирать" начнет...
21. Сергей (seandr) 17.11.11 09:27
Спасибо за скрипт. Выполняет свои функции, а ранее приходилось вручную проделывать это.
22. Сергей (sipoju) 30.11.11 17:43
У меня частенько вылетал сервер 1С, сжирал всю память, залазил в своп и падал, помогала только перегрузка сервака, добавил оперативки -- всё как рукой сняло!
23. stark temp (stark.temp) 19.01.12 11:52
Большое спасибо за полезную информацию.
Хотелось бы увидеть и другие статьи по данной теме.
24. stark temp (stark.temp) 19.01.12 12:30
25. genadyichnew genadyichnew (genadyichnew) 21.01.12 14:27
26. Григорий Селин (Lgm) 13.04.12 15:33
есть еще один вариант...
Process Lasso
27. Антон Тоник (artichoke) 25.06.12 14:49
а если обратная задача - нехватка памяти для выполнения больших запросов в отчетах пользователей - то где настраивается доступный к использованию объем памяти для rphost?
28. Алекс Ю (AlexO) 25.06.12 14:55
как избавиться от "непредвиденных утечек памяти"

от непредвиденных - никак.
Можно только от предвиденных и предупрежденных.
29. Олег Филиппов (comol) 25.06.12 17:28
(27) artichoke, Настраивается только установкой x64 сервера 1С (и Win/lin x64) и дополнительных планок памяти на сервере :). rphost ничем не ограничен в своих желаниях :).
30. Алекс Ю (AlexO) 25.06.12 17:53
(29) comol,
ну почему же? есть.
Для 32-х разрядных систем Windows - применение технологии AWE с расширением PAE.
И наоборот - не выставление PAE ограничивает любой пользовательский процесс 2 Гб памяти.
31. Алекс Ю (AlexO) 25.06.12 17:59
(0) comol,
я не понял, что у вас за утечки памяти - а как знаю я, самые что ни на есть утечки в 1с-сервере происходят из-за того, что какой-то пользователь запустил серьезный расчет, память отъел, а сервер по завершении расчета - память не освободил (спасибо программистам 1с).
В результате - и "старая" ненужная уже память не освободилась, и новая под новые процессы занимается.
А ваш скрипт - это управление давно есть: GetMem и FreeMem, следите, выделяете и освобождате память.
А то, что у вас следит за размером - так просто не дадите пользователю сделать важный отчет. Только и всего :)
Трактор; +1 Ответить 1
32. Олег Филиппов (comol) 25.06.12 22:03
(30) AlexO, 3ГБ PAE - не сильно спасёт. а AWE должна поддерживаться приложением по-моему.
33. Олег Филиппов (comol) 25.06.12 22:10
(31) AlexO, Нет, это не утечки памяти. Утечки памяти это как правило медленная деградация и с ними можно бороться. Отчет который может занять 3ГБ памяти сервера - это ошибка программиста 1С, и за такие отчеты его надо бить (больно бить).
По поводу GetMem и FreeMem искренне надеюсь что вы имели ввиду функции (вроде даже не C... паскаль какой-то), а не одноименные программы, тогда ваша фраза хотя бы не лишена смысла. Но нам то они как бы ничем не помогут... если только исходный код платформы раздобыть :)))
34. Олег Филиппов (comol) 04.07.12 10:07
Для 8.3 уже не актуальна публикация. Как все перейдут сниму. Появились нормальные средства управления памятью.
35. Ариан Попов (arian89) 29.01.13 08:57
мдамс, такая же проблем есть. стоит попробовать
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа