Есть перловый скрипт, который подгружает много разных модулей и делает
много разных вычислений, работая с БД.
Течет память, область утечки весьма обширна по размеру кода.
С работающего скрипта сняли core файл, размером ~400Mb.
Есть ли способ посмотреть, что именно там съело столько памяти?
Медитировать на вывод strings?
--
Sergey
Мне обычно хватает Devel::Cycle:
https://metacpan.org/module/Devel::Cycle
Возможно, пригодится Devel::LeakTrace:
https://metacpan.org/module/Test::LeakTrace
Вячеслав Тихановский также рекомендует Devel::FindRef:
https://metacpan.org/module/Devel::FindRef
Ну и, возможно, будет интересна его заметка "Fighting memory leaks" и ее
обсуждение:
http://showmetheco.de/articles/2011/6/fighting-memory-leaks.html
Насколько я помню, Сергей Засенко при написании MojoX::Redis
был доволен Test::LeakTrace:
https://github.com/und3f/mojox-redis/blob/master/t/leak.t
Но прежде всего, есть ли уверенность, что это утечки, а не живые
полезные данные,
которые вернула DBI?
К тому же, я так понимаю, что это скрипт - 1 файл содержащий весь код,
кроме CPAN-зависимостей.
Если это так, возможно, имеет смысл разбить его на несколько модулей,
чтобы облегчить тестирование и нахождение утечек?
--
Regards
yko
--- пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ ---
пїЅпїЅ пїЅпїЅпїЅпїЅ: " Sergey Leschenko" <serg...@gmail.com>
пїЅпїЅпїЅпїЅ: kiev-perl-...@googlegroups.com
пїЅпїЅпїЅпїЅ: 26 пїЅпїЅпїЅпїЅ 2011, 19:25:50
пїЅпїЅпїЅпїЅ: Re: memory leaks and core file
> пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ,
>
> пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅ
> пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅ.
> пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ.
> пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ core пїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ ~400Mb.
> пїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ?
> пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅ strings?
>
> --
> Sergey
>
Это legacy code.
--
Sergey
Спасибо, завтра попробую применить.
Обычно с таким модулям нужна переменная которую они проверяют.
Но тот же Test::LeakTrace по описанию неплох.
> Но прежде всего, есть ли уверенность, что это утечки, а не живые полезные
> данные,
> которые вернула DBI?
По сути там цикл который обрабатывает клиентов из базы. И размер
скрипта стает заметным только на серверах с наибольшим количеством
записей (порядка 100т) - растет в процессе выполнения. количество
данных на клиента разное, но думаю что проявилось бы и на других
серверах. Кроме того, там Оракл - для него данные сразу все не
считываются в DBI, насколько я знаю.
--
Sergey
# простая демонстрация цикличной ссылки
perl -MDevel::Cycle -e 'my $x; $x->{ref} = \$x; find_cycle $x'
# приближенный к реальности вариант
perl -MDevel::Cycle -e 'my ($x, $y); $x->{ref} = \$y; $y->{ref} =
\$x; find_cycle $x
Иногда стоит просто логически проанализировать код, чтобы найти течь.
> Но тот же Test::LeakTrace по описанию неплох.
Да. Можно попробовать обернуть подозрительный (весь?) код в leaktrace { }
perl -MTest::LeakTrace -e 'my $x; leaktrace { $x->{ref} = \$x; } '
> По сути там цикл который обрабатывает клиентов из базы. И размер
> скрипта стает заметным только на серверах с наибольшим количеством
> записей (порядка 100т) - растет в процессе выполнения. количество
> данных на клиента разное, но думаю что проявилось бы и на других
> серверах. Кроме того, там Оракл - для него данные сразу все не
> считываются в DBI, насколько я знаю.
Не имел удовольствия работать с Oracle.
Нет ли варианта, что все данные просто загружаются в массив?
Код
my $sth = $dbh->prepare('SELECT * FROM foo');
$sth->execute;
может приводить к печальным последствиям на таблицах большого размера.
Не знаю как с Oracle, но MySQL возвращает сразу все данные и нет
возможности бежать по ним итератором.
Иногда этими данными приложение просто смывает и приходится делать
SELECT ... LIMIT $pos, $range; $pos += $range
Возможно тут похожая ситуация?
Обратите внимание, что циклические ссылки могут также быть образованы в
замыканиях:
perl -MDevel::Cycle -e 'my $x; $x->{ref} = sub { print $x; };
find_cycle $x'
--
Regards
yko
On 26.07.2011 22:28, Sergey Leschenko wrote:
> Кроме того, там Оракл - для него данные сразу все не считываются в
> DBI, насколько я знаю.
Серега, а ты вот эти ручки крутил?
http://search.cpan.org/~pythian/DBD-Oracle-1.28/Oracle.pm#Row_Prefetching
Что показывает $sth->{RowsInCache}?
--
Олег Алистратов
Нет, я пока тестирую на MySQL версии и на малом объеме данных.
Модули не очень помогли - медленно, и блоки вида { my $var = 1 }
показывают как leak.
Пока просто делаю цикл по тем же данным и отсекаю функциональность.
Нашел одно место - вложенные структуры с ссылкой на родителя (template
body ;-) ).
Но где-то еще протекает, хотя рост памяти какой-то нелинейный при
увеличении количества циклов.
--
Sergey
On 04.08.2011 22:59, Sergey Leschenko wrote:
> 2011/8/4 Oleg Alistratov <a...@ali.org.ua>:
>>> Кроме того, там Оракл - для него данные сразу все не считываются в
>>> DBI, насколько я знаю.
>> Серега, а ты вот эти ручки крутил?
>> http://search.cpan.org/~pythian/DBD-Oracle-1.28/Oracle.pm#Row_Prefetching
>>
>> Что показывает $sth->{RowsInCache}?
> Нет, я пока тестирую на MySQL версии и на малом объеме данных.
> Модули не очень помогли - медленно, и блоки вида { my $var = 1 }
> показывают как leak.
> Пока просто делаю цикл по тем же данным и отсекаю функциональность.
Может, просто вручную мониторить размер структур, при помощи
какого-нибудь Devel::Size
> Нашел одно место - вложенные структуры с ссылкой на родителя (template
> body ;-) ).
Отжежблин :)
> Но где-то еще протекает, хотя рост памяти какой-то нелинейный при
> увеличении количества циклов.
>
Точно похоже на авторефернтность.
--
Олег Алистратов