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