|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/27073fc7478e.html, оценка из 5, голосов 10
|