[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