Борьба с вредителями — как избавиться от "непредвиденных утечек памяти" сервера 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 не будет опубликован. Обязательные поля помечены *