perl: Ловим утечки памяти
Feb. 27th, 2018 01:23 pmЗаметка скорее для себя, чем...
Если быть более точным, то не ловим, а убеждаемся что они есть, и по возможности локализуем.
Значит есть такой модуль Memory::Usage , он по факту лазиет в /proc и запоминает информацию о памяти потребляемой процессом. Его после инициальизации дергаешь время от времени. После чего получаешь от него сводку, че было с памятью.
Я делал это так:
И получал вот такой вот вывод:
По которому видно, что расход памяти постоянно растет, несмотря на то что мы только и делаем, что открываем сокет и закрываем его.
Помимо этого модуля есть еще Test::LeakTrace который вроде как умеет следить за тем, какие скаляры появились в памяти пока исполнялся заданный участок кода, но я так и не разобрался как им пользоваться, мне в него попадает всякая внутренняя перловая кухня, из серии подключение новых package'ей и т.п. Может когда-то в будущем...
Если быть более точным, то не ловим, а убеждаемся что они есть, и по возможности локализуем.
Значит есть такой модуль Memory::Usage , он по факту лазиет в /proc и запоминает информацию о памяти потребляемой процессом. Его после инициальизации дергаешь время от времени. После чего получаешь от него сводку, че было с памятью.
Я делал это так:
use Memory::Usage;
use IO::Socket::SSL;
my $mu = Memory::Usage->new();
foreach my $i(1..5)
{
print $i,"\n";
$mu->record($i);
foreach (1..100)
{
# то что как мы предполагаем течет памятью
my $cl = IO::Socket::SSL->new('ru.wikipedia.org:443');
close $cl;
}
}
$mu->dump();И получал вот такой вот вывод:
time vsz ( diff) rss ( diff) shared ( diff) code ( diff) data ( diff)
0 14460 ( 14460) 10576 ( 10576) 5012 ( 5012) 1840 ( 1840) 5660 ( 5660) 1
17 16788 ( 2328) 14136 ( 3560) 6416 ( 1404) 1840 ( 0) 7852 ( 2192) 2
34 17844 ( 1056) 15244 ( 1108) 6416 ( 0) 1840 ( 0) 8908 ( 1056) 3
50 18900 ( 1056) 16356 ( 1112) 6416 ( 0) 1840 ( 0) 9964 ( 1056) 4
67 20088 ( 1188) 17464 ( 1108) 6416 ( 0) 1840 ( 0) 11152 ( 1188) 5По которому видно, что расход памяти постоянно растет, несмотря на то что мы только и делаем, что открываем сокет и закрываем его.
Помимо этого модуля есть еще Test::LeakTrace который вроде как умеет следить за тем, какие скаляры появились в памяти пока исполнялся заданный участок кода, но я так и не разобрался как им пользоваться, мне в него попадает всякая внутренняя перловая кухня, из серии подключение новых package'ей и т.п. Может когда-то в будущем...
no subject
Date: 2018-02-27 11:03 am (UTC)no subject
Date: 2018-02-27 11:05 am (UTC)О! Сечас уже не актуально, но на будущее буду знать...