memory leaks and core file

Yaroslav ykorshak at gmail.com
Tue Jul 26 13:10:10 PDT 2011


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



More information about the Kiev-pm mailing list