Всем доброго дня!
Написал скрипт каторый считает траффик не хуже sarga, но собственно дело вот вчем мой скрип считает слишком медленно 100mb за 10минут а sarg туже сумму только за 6 минут.Можно все исправить если каждый день архивировать логи сквида то время снижается. Так вот вчем моя просьба, увожаемые специалисты посмотрите мой скрипт может поткинете мне решение данной проблемы.
==================
#!/usr/bin/perl
#====================================================================================================================
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
@wdays=('Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота');
@mons = ('Января','Февраля','Марта','Апреля','Мая','Июня','Июля','Августа','Сентября','Октября','Ноября','Декабря');
$a=$wday;
$b=$mon;
$year=$year+1900;
$a1=$wday;
$a1--;
$mdays=$mday;
$mdays--;
open(NDATES, ">d.a");
print NDATES $wdays[$a]," ".$mday," ",$mons[$b];
close(NDATES);
#==========================================================================================
open(NDATES,"d.a");
@dn=<NDATES>;
print "Iptraf версия 1.0","\n";
print "Сбор статистики"," ", @dn,"...","\n";
close(NDATES);
#==========================================================================================
open(ALL, "/var/log/squid/access.log");
@sa=<ALL>;$t=scalar(localtime);
$te=substr($t,0,10);for($i=0;$i<@sa;$i++)
{
@str=$sa[$i];
@date=<@str>;
$stt=localtime(${date[0]})."\n";
$st=substr($stt,0,10);
if($st eq $te)
{
open(DATES, ">>data.a");
print DATES $st,"\n";
print DATES $date[4]," ";
print DATES $date[2]," ";
close(DATES);open(IPUSER, ">>ip.user");
print IPUSER $date[2],"\n";
close(IPUSER);
}
}
close(ALL);
#==========================================================================================
open(DATES, "data.a");
@ipall=<DATES>;for($str=1; $str<@ipall; $str++)
{
@ips=$ipall[$str];
@ip=<@ips>;
open(IP, ">>$ip[1].sum");
print IP $ip[0],"\n";
close(IP);open(IP, "$ip[1].sum");
@bit=<IP>;sub summa
{
my $rezult;
foreach my $bit (@_) { $rezult += $bit }
return $rezult;
}
$sum = summa(@bit);close(IP);
open(USER, ">$ip[1].itog");
print USER $sum;
close(USER);
}
close(DATES);
#==========================================================================================
open(DATES, "data.a");
@ipalls=<DATES>;for($str=1; $str<@ipalls; $str++)
{
@ips1=$ipalls[$str];
@ip1=<@ips1>;
open(USER, "$ip1[1].itog");
@user=<USER>;
open(IP, ">>IP.a");
print IP @user," ";
print IP $ip1[1],"\n";
}
close(DATES);
#==========================================================================================
open(IP, "IP.a");
@mip=<IP>;%seen=();
foreach(@mip)
{
$seen{$_}=1;
}
@sip=keys %seen;
@sip=reverse sort{$a<=>$b;}@sip;close(IP);
#==========================================================================================
open(ITOG, ">@dn.html");
#==========================================================================================
print ITOG "<html> \n";
print ITOG " <head>\n";
print ITOG " <title>МОСРЕГИОНТОРГ статистика интернет траффика</title>\n";
print ITOG " </head>\n";
print ITOG " <body bgcolor='#ffebbc'>\n";
print ITOG " <CENTER>\n";
print ITOG " <h3>статистика</h3>\n";print ITOG " <table border=1>\n";
print ITOG " <tr>\n";
print ITOG " <td bgcolor='#ffebbc'><center>сегодня:</center></td>\n";
print ITOG " <td bgcolor='#ffebbc'><center>@dn</center></td>\n";
print ITOG " </tr>\n";
print ITOG " <tr>\n";
print ITOG " <td><center>Пользователь</td>\n";
print ITOG " <td><center>Траффик</center></td>\n";
print ITOG " </tr>\n";
#==========================================================================================
for($xx=0; $xx<@sip; $xx++)
{
@it=$sip[$xx];
@itog=<@it>;
#==========================================================================================
print ITOG " <tr>\n";
print ITOG " <td bgcolor='#ffebbc'><center>$itog[1]</td>\n";
print ITOG " <td bgcolor='#ffebbc'><center>$itog[0]</td>\n";
print ITOG " </tr>\n";
#==========================================================================================
open(SUMM, ">>SUM.a") ||die "$!";
print SUMM $itog[0],"\n";
close(SUMM);
#==========================================================================================
open(DA, ">>@dn") || die "$!";
print DA $itog[0], " ";
print DA $itog[1], "\n";
close(DA);
}
#==========================================================================================
open(SUMM, "SUM.a")||die "$!";
@bit1=<SUMM>;sub summa1
{
my $rezult1;
foreach my $bit1 (@_) { $rezult1 += $bit1 }
return $rezult1;
}
$sum1 = summa1(@bit1);
close(SUMM);
#==========================================================================================
open(DA, ">>summauser") || die "$!";
print DA "$sum1","\n";
close(DA);
#==========================================================================================
print ITOG " <tr>\n";
print ITOG " <td>ИТОГ</td>\n";
print ITOG " <td bgcolor='green'><center>$sum1</center></td>\n";
print ITOG " </tr>\n";
print ITOG " </table>\n";
print ITOG " <a href='sum.html'>Суммарный траффик по дням</a>\n";
print ITOG " <a href='today.html'>Траффик по предыдущим дням</a>\n";
print ITOG " </body>\n";
close(ITOG);
#==========================================================================================
open(NDATES, ">d.a") || die "$!";
print NDATES $wdays[$a]," ".$mday," ",$mons[$b];
close(NDATES);
open(NDATES1, ">d1.a") || die "$!";
print NDATES1 $wdays[$a1]," ".$mdays," ",$mons[$b];
close(NDATES1);
#==========================================================================================
open(NDATES,"d.a")||die "$!";
@dn=<NDATES>;
open(NDATES1,"d1.a")||die "$!";
@dn1=<NDATES1>;
#==========================================================================================
open(DAY,"@dn")||die"$!";
while(<DAY>)
{
($ip,$bait)=(split(/\s+/,$_))[1,0];
open(DAY1,"@dn1");while(<DAY1>)
{
($ip1,$bait1)=(split(/\s+/,$_))[1,0];
if($ip1 eq $ip)
{
$s=$bait+$bait1;
open(ITODAY, ">>itsum.a") || die "$!";
print ITODAY $s," ";
print ITODAY $ip1,"\n";
close(ITODAY);
}
}
}
close(DAY);
close(NDATES1);
close(NDATES);
#==========================================================================================
open(ITOG6, ">sum.html");
print ITOG6 "<html> \n";
print ITOG6 " <head>\n";
print ITOG6 " <title>МОСРЕГИОНТОРГ статистика интернет траффика</title>\n";
print ITOG6 " </head>\n";
print ITOG6 " <body bgcolor='#ffebbc'>\n";
print ITOG6 " <CENTER>\n";
print ITOG6 " <h3>статистика</h3>\n";
print ITOG6 " <table border=1>\n";print ITOG6 " <tr>\n";
print ITOG6 " <td><center>Общий</center></td>\n";
print ITOG6 " <td><center> </center></td>\n";
print ITOG6 " </tr>\n";
print ITOG6 " <tr>\n";
print ITOG6 " <td bgcolor='#ffebbc'>Пользователь</td>\n";
print ITOG6 " <td bgcolor='#ffebbc'><center>Траффик</td>\n";
print ITOG6 " </tr>\n";
#==========================================================================================
open(ITODAY, "itsum.a");
@sip1=<ITODAY>;
for($xx1=0; $xx1<@sip1; $xx1++)
{
@it1=$sip1[$xx1];
@itog1=<@it1>;
#==========================================================================================
print ITOG6 " <tr>\n";
print ITOG6 " <td bgcolor='#ffebbc'><center>$itog1[1]</td>\n";
print ITOG6 " <td bgcolor='#ffebbc'><center>$itog1[0]</td>\n";
print ITOG6 " </tr>\n";
}
#==========================================================================================
open(SUMM1, "summauser");
@bit2=<SUMM1>;sub summa2
{
my $rezult2;
foreach my $bit2 (@_) { $rezult2 += $bit2 }
return $rezult2;
}
$sum2 = summa2(@bit2);
close(SUMM);
#==========================================================================================
print ITOG6 " <tr>\n";
print ITOG6 " <td>ИТОГ</td>\n";
print ITOG6 " <td bgcolor='green'><center>$sum2</center></td>\n";
print ITOG6 " </tr>\n";
print ITOG6 " </table>\n";
print ITOG6 " </body>\n";
close(ITOG);
#==========================================================================================
open(ITOG6, ">>today.html");
print ITOG6 " <body bgcolor='#ffebbc'>\n";
print ITOG6 "<a href='@dn.html'>@dn</a><br>\n";
close(ITOG6);
#==========================================================================================
unlink <*.user>;
unlink <*.itog>;
unlink <*.a>;
unlink <*.sum>;
unlink <*.a1>;
unlink <*.itsum>;
>Всем доброго дня!
>Написал скрипт каторый считает траффик не хуже sarga, но собственно дело вот
>вчем мой скрип считает слишком медленно 100mb за 10минут а sarg
>туже сумму только за 6 минут.Можно все исправить если каждый день
>архивировать логи сквида то время снижается. Так вот вчем моя просьба,
>увожаемые специалисты посмотрите мой скрипт может поткинете мне решение данной проблемы.Удивляться как бы нечему. Сарг написан на сях, если я не ошибаюсь. А перл - интерпретируемый язык, который по определнию работает медленнее.
>>Всем доброго дня!
>>Написал скрипт каторый считает траффик не хуже sarga, но собственно дело вот
>>вчем мой скрип считает слишком медленно 100mb за 10минут а sarg
>>туже сумму только за 6 минут.Можно все исправить если каждый день
>>архивировать логи сквида то время снижается. Так вот вчем моя просьба,
>>увожаемые специалисты посмотрите мой скрипт может поткинете мне решение данной проблемы.
>
>Удивляться как бы нечему. Сарг написан на сях, если я не ошибаюсь.
>А перл - интерпретируемый язык, который по определнию работает медленнее.
====
Я только глянул код (не вчитывался). По моему проблема есть в таком подходе:open(ALL, "/var/log/squid/access.log");
@sa=<ALL>;
## СНАЧАЛА ОРГАНИЗУЕМ ОГРОМНЫЙ МАССИВ
$t=scalar(localtime);
$te=substr($t,0,10);
for($i=0;$i<@sa;$i++)
{
# ПОТОМ ОБРАБАТЫВАЕМ КАЖДУЮ СТРОКУ МАССИВА
@str=$sa[$i];
@date=<@str>;
$stt=localtime(${date[0]})."\n";
$st=substr($stt,0,10);
if($st eq $te)
{
# ДА ЕЩЕ С ПРОВЕРКОЙ УСЛОВИЙ
open(DAT........
===
проще открывать файл и
open(ALL, "/var/log/squid/access.log");
while (<ALL>) {
# ДЕЛАТЬ ЧТО НУЖНО
;
}
===
ТО ЕСТЬ в этом коде слишком много лишних "проходов" (итераций)