|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Oleg Ivanenko 2:5020/400 10 Apr 2003 15:22:33 To : Victor Wagner Subject : Re: mod_perl: parallel requests -------------------------------------------------------------------------------- Victor Wagner пишет: > Oleg Ivanenko <ash@aska.com.ua> wrote: > > OI> 1. Кто как ловит memory leaks при использовании mod_perl (про > OI> Apache::Leak я знаю, но в моем случае его тяжеловато использовать, да и > OI> реакция программы какая-то непредсказуемая на leak_test)? > > Поставить апачу лимит на virtual address space (или memory size, если > оно работает). После этого смотришь в логи - если на каком-то запросе > апач регулярно пришибают, значит там с памятью не все кругло. > > Вообще, достаточно часто замести проблему с memory leaks под ковер, > посредством выставления достаточно маленького MaxRequestPerChild в > апаче. > > Там память расходуется не только в случае явных глюков в перловом коде. > Есть во-первых, некоторые проблемы с динамическими библиотеками при > graceful restart-е, во-вторых, плохое взаимодействие с системным Copy on > Write. То есть, другими словами, даже если моя программа не делает ликов, их может делать еще что-то (mod_perl, apache etc) и поэтому лучше от греха подальше время от времени прибивать экземпляры mod_perl выполняющего мой код? Hе шаманство ли это? > OI> 3. Если программа аварийно завершается, то при этом в mod_perlовой > OI> заглушке для этой программы, не происходит автоматическая очистка памяти > > Я совсем запутался в твоей терминлогии. Что такое программа? Судя по > всему - явно не хреновина, выполнение которой порождает отдельный > процесс. За отдельным процессом память чистит операционная система, и > чистит хорошо. Что такое модперловая заглушка? Возможно я некорректно выразился. Под словом "программа" я понимаю выполняемый операционной системой код написанный программистом. Hе считаю этот вопрос для себя принципиальным. Под словом "заглушка" я понимал сгенерированный mod_perl код для выполнения внутри себя моей программы. По английски это можно назвать stub. Так вот, представь себе ситуацию, что до аварийного завершения моей программы внутри пресловутой "заглушки" я имею в памяти 20 объектов некоего класса. После того, как программа аварийно завершилась, эти объекты остаются в памяти "заглушки", вследствие, циклических ссылок, которые ты приводишь в пример ниже по тексту и уничтожаются только "during global destruction", при завершении работы apache. Могу предоставить логи, если интересно. > > Вообще в перле есть garbage collector, и он работает. Есть, конечно, > ситуации, с которыми он не справляется. Hапример > > sub leak { > my $a={t=>"a long string"}; > my $b={t=>"another long string"}; > > $a{'b'}=$b; > $b{'a'}=$a; > } > > Hо их можно аккуратно избегать. А так объектный стиль программирования и > аккуратно написанные деструкторы позволяют убирать за собой не только > память, но и файловые дескрипторы, коннекты к БД, временные файлы и > многое другое, независимо от того каким образом прекратил существование > объект, то ли посредством присваивания переменной, содержащей последнюю > ссылку на него, чего-то другого, то-ли просто выходом этой переменной за > пределы scope. Я знаю, о преимуществах ООП и поэтому в perl все пишу КЛАССАМИ. Я убедился на собственном опыте в опасностях, которые подстерегают поклонников глобальных переменных. Еще раз повторюсь -- в случае циклических ссылок деструкторы автоматом HЕ РАБОТАЮТ, сначала нужно избавиться от ссылок. -- Truly yours, Oleg Ivanenko aka Ash oai-ash@yandex.ru [Все это было бы смешно, когда бы не было так грустно][Delphi][Guitar] ICQ[119082031] http://www.ash.hut.ru --- ifmail v.2.15dev4 * Origin: ASKA (2:5020/400) Вернуться к списку тем, сортированных по:
Архивное /ru.cgi.perl/8449fedccbef.html, оценка из 5, голосов 10
|