Борьба с вредителями - как избавиться от "непредвиденных утечек памяти" сервера 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) 41 03.10.11 14:34 Сейчас в теме
Опиши будь добр, что за скрипт, - не "net start/stop"?
3. Ийон Тихий (cool.vlad4) 41 03.10.11 14:37 Сейчас в теме
+ 2 конечно, же нет, читать разучился...а на чем скрипт написан? на vbs .ps сегодня не мой день...
4. Олег Филиппов (comol) 2689 03.10.11 15:29 Сейчас в теме
(1) SergDi, да, убивает тех пользователей, которые "рушат" сервер. Если запрос на самом деле серьёзный - балансировка не произойдёт, т.к. пользователь выболняет запрос к БД... такие пользователи не балансируются. В итоге на рабочем процессе вы этих пользователей всё равно убьёте.. только вот можете не успеть... у нас просто SQL "быстрый"... и мы реально не успевали это дело остановить... а скрипт успевает :)
5. Олег Филиппов (comol) 2689 03.10.11 15:38 Сейчас в теме
И хоть бы кто "+" поставил кто встречал такое дело. Сейчас ведь "придут доброжелатели" наставят минусов, и уже не скачаете когда встретитесь :)
6. Артур Аюханов (artbear) 850 03.10.11 15:43 Сейчас в теме
12 Гб - объем виртуальной или реальной памяти?
Скрипт проверялся на 64-битных серверах или 32-битные также проверялись?
ЗЫ у меня есть контора, которая съекономила 10 штук на 64-битном ключе и сидят на 32х :)
7. Steve Gordon (SGordon1) 03.10.11 15:45 Сейчас в теме
А утечки мозгов только из за пользователей бывают?
8. Олег Филиппов (comol) 2689 03.10.11 15:50 Сейчас в теме
(7) SGordon1, Конечно не только... в основном из за программистов... в принципе утечки это нормальный процесс для 1С.. скрипт нужен для борьбы с "резкими" утечками... для борьбы с обычными подойдёт перезапуск процессов по расписанию...
9. Олег Филиппов (comol) 2689 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) 2689 11.10.11 12:02 Сейчас в теме
(11) Mitri4, нуу... это уже не так просто в идеале нужно конечно включать профайлер и проверять. Но вообще Activity Monitor показывает самые ресурсоёмкие запросы. просто если запрос большой, то может быть не полным. А ещё можете не успеть "поймать" запрос - если на SQL сервере памяти много и диски быстрые, сервер 1с может раньше "рухнуть".. если данный скриптик не работает.
13. Юрий Хрипачёв (hrip) 203 14.10.11 16:55 Сейчас в теме
По моему проблема утечки памяти на 8.2 неплохо решается и штатными средствами. В свойствах кластера необходимо указать время через какое необходимо перезапускать процессы и ограничение на объем памяти "съеденной" процессом при которой происходит его перезапуск. На 8.1 можно только указать время через которое будут перезапускаться процессы (хотя пока работали на 8.1 таких проблем и не возникало).
При перезапуске процесса соединения не обрываются - они передаются другому процессу.
14. Брест Беларусь (zhleonid8) 18.10.11 09:37 Сейчас в теме
15. Олег Филиппов (comol) 2689 18.10.11 16:24 Сейчас в теме
(13) hrip, Это разные проблемы... проблема постепенной утечки памяти решается перезапуском. А проблема "мгновенной" - только таким образом - нужно успеть "убить" клиента, запустившего не правильный запрос...
16. Иван Петров (nzass) 89 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. Трактор Трактор (Трактор) 1109 25.10.11 21:12 Сейчас в теме
comol пишет:И хоть бы кто "+" поставил кто встречал такое дело. Сейчас ведь "придут доброжелатели" наставят минусов, и уже не скачаете когда встретитесь :)

Плюсы выпрашивать нехорошо. Повышаются шансы быть заминусованным.
18. Ийон Тихий (cool.vlad4) 41 25.10.11 21:13 Сейчас в теме
(16) нет, там другое, там скрипт насколько я помню, мониторит память, если он превышает лимит, то рубит процесс.
19. Трактор Трактор (Трактор) 1109 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) 2689 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) 115 25.06.12 14:55 Сейчас в теме
как избавиться от "непредвиденных утечек памяти"

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