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

34 Comments

  1. SergDi

    в данный момент у меня похожая проблема, сервер отъедает всю доступную память, лечу это дело запуском нового процесса и остановкой рабочего, в течении 10 секунд все приходит в норму.

    а этот скрипт грохает непосредственно юзверей?

    Reply
  2. cool.vlad4

    Опиши будь добр, что за скрипт, — не «net start/stop»?

    Reply
  3. cool.vlad4

    + 2 конечно, же нет, читать разучился…а на чем скрипт написан? на vbs .ps сегодня не мой день…

    Reply
  4. comol

    (1) SergDi, да, убивает тех пользователей, которые «рушат» сервер. Если запрос на самом деле серьёзный — балансировка не произойдёт, т.к. пользователь выболняет запрос к БД… такие пользователи не балансируются. В итоге на рабочем процессе вы этих пользователей всё равно убьёте.. только вот можете не успеть… у нас просто SQL «быстрый»… и мы реально не успевали это дело остановить… а скрипт успевает 🙂

    Reply
  5. artbear

    12 Гб — объем виртуальной или реальной памяти?

    Скрипт проверялся на 64-битных серверах или 32-битные также проверялись?

    ЗЫ у меня есть контора, которая съекономила 10 штук на 64-битном ключе и сидят на 32х 🙂

    Reply
  6. SGordon1

    А утечки мозгов только из за пользователей бывают?

    Reply
  7. comol

    (7) SGordon1, Конечно не только… в основном из за программистов… в принципе утечки это нормальный процесс для 1С.. скрипт нужен для борьбы с «резкими» утечками… для борьбы с обычными подойдёт перезапуск процессов по расписанию…

    Reply
  8. comol

    (6) artbear, 12 ГБ конечно про виртуальную память. Скрипт работал только на 64 битных системах… я как-то с трудом себе уже представляю 32 битный сервер… Там наверное будет реботать при очень тонкой настройке… ведь 2ГБ это не так много.. они могут быть заняты и при нормальной работе пользователей… а мы будем выкидывать «ни в чём не повинных», только потому что они больше всех старались…

    Reply
  9. andru_dv

    Это точно полезная вещь т.к.

    переодически возникают такие «пожыратели» памяти.

    Спасибо за разработку!

    Reply
  10. Mitri4

    А как можно вычислить какие запросы вешают сервер?

    Reply
  11. comol

    (11) Mitri4, нуу… это уже не так просто в идеале нужно конечно включать профайлер и проверять. Но вообще Activity Monitor показывает самые ресурсоёмкие запросы. просто если запрос большой, то может быть не полным. А ещё можете не успеть «поймать» запрос — если на SQL сервере памяти много и диски быстрые, сервер 1с может раньше «рухнуть».. если данный скриптик не работает.

    Reply
  12. hrip

    По моему проблема утечки памяти на 8.2 неплохо решается и штатными средствами. В свойствах кластера необходимо указать время через какое необходимо перезапускать процессы и ограничение на объем памяти «съеденной» процессом при которой происходит его перезапуск. На 8.1 можно только указать время через которое будут перезапускаться процессы (хотя пока работали на 8.1 таких проблем и не возникало).

    При перезапуске процесса соединения не обрываются — они передаются другому процессу.

    Reply
  13. zhleonid8

    полезная ставлю +

    Reply
  14. comol

    (13) hrip, Это разные проблемы… проблема постепенной утечки памяти решается перезапуском. А проблема «мгновенной» — только таким образом — нужно успеть «убить» клиента, запустившего не правильный запрос…

    Reply
  15. nzass

    а у меня проще. 2 batника в шедулере

    например в 18.00

    stop.bat — «C:Program Files1cv828.2.11.236in
    agent.exe» -stop

    в 18.01

    start.bat — «C:Program Files1cv828.2.11.236in
    agent.exe» -start

    Reply
  16. Трактор
    comol пишет:И хоть бы кто «+» поставил кто встречал такое дело. Сейчас ведь «придут доброжелатели» наставят минусов, и уже не скачаете когда встретитесь 🙂

    Плюсы выпрашивать нехорошо. Повышаются шансы быть заминусованным.

    Reply
  17. cool.vlad4

    (16) нет, там другое, там скрипт насколько я помню, мониторит память, если он превышает лимит, то рубит процесс.

    Reply
  18. Трактор

    Незачем огород городить с виндовым планировщиком. Всё делается в рамках 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Сников на малопопулярную тему.

    Ещё бы авторов платформы попинать за то что управление кластером не работает под линуксом и за то что фоновые задания не убиваются.

    Reply
  19. comol

    (19) Трактор, тоже можно, просто подумалось что виндовым планировщиком будет надежнее… если сервер «умирать» начнет…

    Reply
  20. seandr

    Спасибо за скрипт. Выполняет свои функции, а ранее приходилось вручную проделывать это.

    Reply
  21. sipoju

    У меня частенько вылетал сервер 1С, сжирал всю память, залазил в своп и падал, помогала только перегрузка сервака, добавил оперативки — всё как рукой сняло!

    Reply
  22. stark.temp

    Большое спасибо за полезную информацию.

    Хотелось бы увидеть и другие статьи по данной теме.

    Reply
  23. stark.temp

    полезная инфа, ставлю+

    Reply
  24. genadyichnew

    Попробуем

    Reply
  25. Lgm

    есть еще один вариант…

    Process Lasso

    Reply
  26. artichoke

    а если обратная задача — нехватка памяти для выполнения больших запросов в отчетах пользователей — то где настраивается доступный к использованию объем памяти для rphost?

    Reply
  27. AlexO
    как избавиться от «непредвиденных утечек памяти»

    от непредвиденных — никак.

    Можно только от предвиденных и предупрежденных.

    Reply
  28. comol

    (27) artichoke, Настраивается только установкой x64 сервера 1С (и Win/lin x64) и дополнительных планок памяти на сервере :). rphost ничем не ограничен в своих желаниях :).

    Reply
  29. AlexO

    (29)

    ну почему же? есть.

    Для 32-х разрядных систем Windows — применение технологии AWE с расширением PAE.

    И наоборот — не выставление PAE ограничивает любой пользовательский процесс 2 Гб памяти.

    Reply
  30. AlexO

    (0)

    я не понял, что у вас за утечки памяти — а как знаю я, самые что ни на есть утечки в 1с-сервере происходят из-за того, что какой-то пользователь запустил серьезный расчет, память отъел, а сервер по завершении расчета — память не освободил (спасибо программистам 1с).

    В результате — и «старая» ненужная уже память не освободилась, и новая под новые процессы занимается.

    А ваш скрипт — это управление давно есть: GetMem и FreeMem, следите, выделяете и освобождате память.

    А то, что у вас следит за размером — так просто не дадите пользователю сделать важный отчет. Только и всего 🙂

    Reply
  31. comol

    (30) AlexO, 3ГБ PAE — не сильно спасёт. а AWE должна поддерживаться приложением по-моему.

    Reply
  32. comol

    (31) AlexO, Нет, это не утечки памяти. Утечки памяти это как правило медленная деградация и с ними можно бороться. Отчет который может занять 3ГБ памяти сервера — это ошибка программиста 1С, и за такие отчеты его надо бить (больно бить).

    По поводу GetMem и FreeMem искренне надеюсь что вы имели ввиду функции (вроде даже не C… паскаль какой-то), а не одноименные программы, тогда ваша фраза хотя бы не лишена смысла. Но нам то они как бы ничем не помогут… если только исходный код платформы раздобыть :)))

    Reply
  33. comol

    Для 8.3 уже не актуальна публикация. Как все перейдут сниму. Появились нормальные средства управления памятью.

    Reply
  34. arian89

    мдамс, такая же проблем есть. стоит попробовать

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *