memory leaks and core file

26 views
Skip to first unread message

Sergey Leschenko

unread,
Jul 26, 2011, 12:25:50 PM7/26/11
to kiev-perl-...@googlegroups.com
Добрый день,

Есть перловый скрипт, который подгружает много разных модулей и делает
много разных вычислений, работая с БД.
Течет память, область утечки весьма обширна по размеру кода.
С работающего скрипта сняли core файл, размером ~400Mb.
Есть ли способ посмотреть, что именно там съело столько памяти?
Медитировать на вывод strings?

--
Sergey

Yaroslav

unread,
Jul 26, 2011, 1:26:21 PM7/26/11
to kiev-perl-...@googlegroups.com
Сергей,

Мне обычно хватает 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

Dmitrii

unread,
Jul 26, 2011, 2:58:44 PM7/26/11
to Sergey Leschenko, kiev-perl-...@googlegroups.com

пїЅпїЅпїЅпїЅпїЅ 2 пїЅпїЅпїЅ 3 пїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ
пїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅ, пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ

--- пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ ---
пїЅпїЅ пїЅпїЅпїЅпїЅ: " Sergey Leschenko" <serg...@gmail.com>
пїЅпїЅпїЅпїЅ: kiev-perl-...@googlegroups.com
пїЅпїЅпїЅпїЅ: 26 пїЅпїЅпїЅпїЅ 2011, 19:25:50
пїЅпїЅпїЅпїЅ: Re: memory leaks and core file


> пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ,
>
> пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅ
> пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅ.
> пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ.
> пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ core пїЅпїЅпїЅпїЅ, пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ ~400Mb.
> пїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ?
> пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅ strings?
>
> --
> Sergey
>

Sergey Leschenko

unread,
Jul 26, 2011, 3:09:29 PM7/26/11
to Dmitrii, kiev-perl-...@googlegroups.com
2011/7/26 Dmitrii <q7...@ukr.net>:
> видел 2 или 3 статьи, про то как надо писать, чтобы не было утечки памяти
> я всегда стараюсь писать пишу так, по рекомендациям, чтобы не было утечки

Это legacy code.

--
Sergey

Sergey Leschenko

unread,
Jul 26, 2011, 3:28:34 PM7/26/11
to kiev-perl-...@googlegroups.com
2011/7/26 Yaroslav <ykor...@gmail.com>:

> Сергей,
>
> Мне обычно хватает Devel::Cycle:
> ...

Спасибо, завтра попробую применить.
Обычно с таким модулям нужна переменная которую они проверяют.
Но тот же Test::LeakTrace по описанию неплох.

> Но прежде всего, есть ли уверенность, что это утечки, а не живые полезные
> данные,
> которые вернула DBI?

По сути там цикл который обрабатывает клиентов из базы. И размер
скрипта стает заметным только на серверах с наибольшим количеством
записей (порядка 100т) - растет в процессе выполнения. количество
данных на клиента разное, но думаю что проявилось бы и на других
серверах. Кроме того, там Оракл - для него данные сразу все не
считываются в DBI, насколько я знаю.

--
Sergey

Yaroslav

unread,
Jul 26, 2011, 4:10:10 PM7/26/11
to kiev-perl-...@googlegroups.com
On 07/26/2011 10:28 PM, Sergey Leschenko wrote:
> Спасибо, завтра попробую применить.
> Обычно с таким модулям нужна переменная которую они проверяют.
Именно

# простая демонстрация цикличной ссылки
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

Oleg Alistratov

unread,
Aug 4, 2011, 1:41:24 PM8/4/11
to kiev-perl-...@googlegroups.com, Sergey Leschenko

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}?

--
Олег Алистратов

Sergey Leschenko

unread,
Aug 4, 2011, 3:59:25 PM8/4/11
to kiev-perl-...@googlegroups.com
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.
Пока просто делаю цикл по тем же данным и отсекаю функциональность.

Нашел одно место - вложенные структуры с ссылкой на родителя (template
body ;-) ).
Но где-то еще протекает, хотя рост памяти какой-то нелинейный при
увеличении количества циклов.

--
Sergey

Oleg Alistratov

unread,
Aug 4, 2011, 4:09:01 PM8/4/11
to kiev-perl-...@googlegroups.com

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 ;-) ).

Отжежблин :)


> Но где-то еще протекает, хотя рост памяти какой-то нелинейный при
> увеличении количества циклов.
>

Точно похоже на авторефернтность.

--
Олег Алистратов

Reply all
Reply to author
Forward
0 new messages