[Moscow.pm] Поиск утечек памяти
Nikolay Mishin
mi на ya.ru
Пн Окт 14 20:28:01 PDT 2013
привет, да, интересная тема
use Devel::Peek;
perl -e 'print qx{ grep VmSize /proc/$$/status };'
https://metacpan.org/module/Devel::Peek#Memory-footprint-debugging
http://techblog.net-a-porter.com/2013/02/finding-memory-leaks/
http://letsgetdugg.com/2009/04/19/finding-circular-reference-leaks-in-perl/
http://www.freshports.org/devel/p5-Devel-Peek/
Devel::Peek - Инструмент отладки данных для XSпрограммиста
Давайте рассмотрим пример выделении буфера в Perl только один раз, независимо от my() границы, хотя это будет realloc(), если размер больше, чем SvLEN:
use Devel::Peek;
for (1..3) {
foo();
}
sub foo {
my $sv;
Dump $sv;
$sv = 'x' x 100_000;
$sv = "";
}
Вывод:
SV = NULL(0x0) at 0x8138008
REFCNT = 1
FLAGS = (PADBUSY,PADMY)
SV = PV(0x80e5794) at 0x8138008
REFCNT = 1
FLAGS = (PADBUSY,PADMY)
PV = 0x815f808 ""\0
CUR = 0
LEN = 100001
SV = PV(0x80e5794) at 0x8138008
REFCNT = 1
FLAGS = (PADBUSY,PADMY)
PV = 0x815f808 ""\0
CUR = 0
Мы видим, что на втором и последующих вызовах $sv уже использует предварительно выделенную память.
Таким образом, если вы можете позволить себе больше памяти, больший буфер означает меньше системных вызовов brk() ( syscalls) . Если вы захотите увидеть привер с `strace` вы увидите только вызовы brk() в первый раз во время цикла. Так что это тот случай, когда ваш модуль может предварительно выделить буфер вот так:
package Your::Proxy;
my $buffer = ' ' x 100_000;
$buffer = "";
Теперь только родитель вызывает brk() при запуске сервера, каждый дочерний вызов уже будет иметь выделенный буфер. Просто сбросьте буфер в "" ,когда завершится выполнение процедуры.
Примечание: Ранее распределение скаляра таким образом экономит перераспределение (reallocation) в v5.005, но может не сделать так в других версиях.
(из http://perl.apache.org/docs/1.0/guide/debug.html#Devel__Peek)
15.10.2013, 00:20, "Jack of Shadows" <somerandomlogin на gmail.com>:
> Господа, подскажите, есть ли что-нибудь хорошее для поиска мест, где течёт память для perl 5.14.Помнится, когда использовал Devel::LeakTrace::Fast, но он перестал собираться то ли под 5.10, то ли под 5.12 в связи с какими-то изменениями в недрах перла.
>
> ,
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
--
С уважением
Николай Мишин
Подробная информация о списке рассылки Moscow-pm