привет, да, интересная тема

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" <[email protected]>:
> Господа, подскажите, есть ли что-нибудь хорошее для поиска мест, где течёт 
> память для perl 5.14.Помнится, когда использовал Devel::LeakTrace::Fast, но 
> он перестал собираться то ли под 5.10, то ли под 5.12 в связи с какими-то 
> изменениями в недрах перла.
>
> ,
> --
> Moscow.pm mailing list
> [email protected] | http://moscow.pm.org

-- 
С уважением
Николай Мишин

-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить