Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Slava Trofimov                       2:5013/21.3    28 Nov 2003  13:57:08
 To : All
 Subject : как вычислить и устранить утечку памяти
 -------------------------------------------------------------------------------- 
 
 
     Есть написанная на перле программка, которая постоянно выполняется, раз в
 минуту в ней вызывается процедура, которая отрабатывает и выполнение
 продолжается, при каждом вызове объем занимаемой памяти увеличивается на 16
 кбайт, так она за 27 дней выросла до 459 метров. Все, что приходит в голову
 (куда течет память) это на подсоединение к базе SQL
 
 Вот основной узел программы:
 
 while (true)
 {
     $_ = `/bin/date "+%w %Y-%m-%d %H:%M:%S"`;
     ($wday, $year, $mon, $mday, $hour, $min, $sec) =
 m/(.)\s+(....)\-(..)\-(..)\s+(..):(..):(..)/;
     $wday = (qw(Sun Mon Tue Wed Thu Fri Sat Sun))[$wday];
     $acceptaddr = accept(CLIENT, SERVER);
     if ( !$acceptaddr ) { sleep 5;
         ++$count;
         if ($count > 12) { check_access(); $count = 0; }
         next; }
     fork() && next;
 
 т.е. примерно раз в минуту вызывается check_access
 
 sub check_access {
     $dbh = Mysql->Connect ("localhost", "*", "*", "*") || terminate
 ($Mysql::db_errstr);
     $sth = $dbh->Query("SELECT login, timeend, ipauth FROM online") ||
      terminate ($Mysql::db_errstr);
     $numrow = $sth->numrows;
     for ($i=1;$i<=$numrow;++$i)
     {
         @data = $sth->Fetchrow;
         $data[1] -= 1;
 #
         $sth1 = $dbh->Query("select reject from access where (login='$data[0]'
 and (day_week='All' or
          day_week REGEXP '.*$wday.*') and (time_begin<'$hour:$min' and
 time_end>'$hour:$min')) order by count")
          || terminate ($Mysql::db_errstr);
         @data1 = $sth1->FetchRow; $reject = $data1[0];
         if ($reject eq "1")
         { syslog ("info", "Warning: Access $username reject $nowtime");
             $sth1 = $dbh->Query("DELETE FROM online WHERE (login='$data[0]' AND
 ipauth='$data[2]')") || terminate ($Mysql::db_errstr);
             ipfw_deny($data[2]);
         }
         elsif ( $data[1] <= 0 )
         {
             syslog("info", "User $data[0] from $data[2] - timeout access");
             $sth1 = $dbh->Query("DELETE FROM online WHERE (login='$data[0]' AND
 ipauth='$data[2]')") || terminate ($Mysql::db_errstr);
         #  IPFW
             ipfw_deny($data[2]);
         }
         else
         {
             $sth1 = $dbh->Query("UPDATE online SET timeend='$data[1]' WHERE
 (login='$data[0]' AND ipauth='$data[2]')") || terminate ($Mysql::
         }
     }
     $dbh->DESTROY;
 }
 
 Hу где, где может так теряться память? Hе писать же утилиту, которая раз в
 неделю будет перезапускать этот скрипт, хотя уже подумываю об этом.
 
                                                          До встpечи,
                                                               Слава.
 ... ICQ 62940418 [SHERLOCK]              E-mail: sherlock_boy @ mail.ru
 --- GoldED/W32 3.0.0-dam8    [HI-FI (Black raven)] [MATRIX] [THIEF] [GIRLS]
  * Origin:  (FidoNet 2:5013/21.3)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 как вычислить и устранить утечку памяти   Slava Trofimov   28 Nov 2003 13:57:08 
 Re: как вычислить и устранить утечку памяти   Yury Kopyl   01 Dec 2003 15:25:55 
 Re: как вычислить и устранить утечку памяти   Artem Chuprina   01 Dec 2003 16:19:39 
 Re: как вычислить и устранить утечку памяти   Slava Trofimov   05 Dec 2003 13:30:50 
Архивное /ru.perl/27073fc7478e.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional