LINUX.ORG.RU

Утечки памяти в прогах под mod_perl. Как отловить?


0

0

Подскажите, пожалуста, инструментарий для отлавливания утечек памяти в cgi прогах, исполняющихся под mod_perl.
Сейчас сервер приходиться периодически рестартовать, т.к. начинает активно использоваться своп и все начинает тормозить. :(
М.б. кто-то знает хорошую доку по правилам написания каких прог?
Мне приходиться адаптировать свои старые проги, которые работали как скрипты. Я пробовал ставить use strip, но получил такое количество ошибок, что просто растерялся на счет того - с чего начать. :(

Наверное стоит копнуть в сторону перевода скриптов на нормальный mod_perl (не регистри) и учитывать то, как перл работает с памятью - судя по всему ты очень не аккуратно обращаешься с данными. Перл ведь по факту память не освобождает, сколько раз undef не говори. Любопытные топики по этому поводу проскакивали на http://xpoint.ru/forums/programming/perl/mod_perl/forum.xhtml (вообще рекомендую, кстати). Ну и на perl.apache.org гайды почитать имеет смысл чтобы понимать что и как там происходит...

ach
()

Имхо, начинать любую перловую программу надо со сточек:

#!/usr/bin/perl -w
use strict;

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

sub xxx{
my ($a,$b,$c);
}

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

можно проверить perl на предмет корректного освобождения памяти так:

#!/usr/bin/perl -w
use strict;
print "content-type: text/html \n\n";
#вызываем подпрограмму
&10megabajt();

#здесь снова делаем sleep 10 чтобы успеть заглянуть в вывод top
# на предмет сколько памяти занимает процесс
# на данном этапе выполнения программы переменной $txt, в котороую
# было считано 10 м6егабайт из файла, существовать не должно.

sleep 10;

sub 10megabajt {
$/=undef;
open F, "10megabajt.file.txt" or die "cant open: $1";
my $txt=<F>;
sleep 10;
#на этом шаге лезем в топ и смотрим, сколько мегабайт занимает
# процесс, открывший файл 10megabajt.file.txt размером в 10 мегабайт.
close F;
# точка выхода из подпрограммы, здесь переменна $txt уничтожается
}

д

vilfred ☆☆
()
Ответ на: комментарий от vilfred

Ага! Всем спасибо! Щас буду все смотреть.
Сегодня активно рылся в инете по этому поводу - решил нормально разгрести скрипты с use strict.
Кроме всего прочего нашел ссылку на B::TerseSize - позволяет в perl-status смотреть размеры объектов с детализацией.
За ссылки и наводки на Apache::Leaks особое спасибо! :)

UncleAndy ★★★
() автор топика

>Подскажите, пожалуста, инструментарий для отлавливания утечек памяти в cgi прогах, исполняющихся под mod_perl.

Поставь tomcat и будет тебе щастье.

anonymous
()
Ответ на: комментарий от anonymous

Apache::Leak Apache::SizeLimit проканает только если скрипт запущен как полноценный модуль.

Не освобождает перл нормально память.
в случае $a = $b .$c; будет отожрана память на то, чтобы сначала вычислить значение $b .$c а потом запихнуть его в $a. Эта память потом может быть использована под какие-то другие переменные (равно как и "освобождаемая" по undef). А может быть и не использована. Отсюда и утечки.

ach
()
Ответ на: комментарий от ach

хз, ни разу не встречался с некорректной работой с памятью

vilfred ☆☆
()
Ответ на: комментарий от ach

Apache::SizeLimit проканает в любом случае:

perldoc Apache::SizeLimit 

Or you can just check those requests that are likely to get big, such
as CGI requests.  This way of checking is also easier for those who are mostly just running CGI.pm/Registry scripts:
     # in your CGI:
     use Apache::SizeLimit;
     &Apache::SizeLimit::setmax(10000);          # Max size in KB
     &Apache::SizeLimit::setmin(1000);           # Min share in KB
     &Apache::SizeLimit::setmax_unshared(12000); # Max unshared size in KB

Еще вариант - использовать MaxRequestPerChild

anonymous
()
Ответ на: комментарий от anonymous

Пока решил использовать MaxRequestPerChild и переписать все свои скрипты с избавлением от конструкций типа $a=$b.$c и вовремя проставленного undef. Кроме этого думаю переделать скрипты на использование HTML::Template, но мучают сомнения по поводу возможных утечек в самом HTML::Template. Никто не изучал этот вопрос?

UncleAndy ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.