|
|
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
|