URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1317
[ Назад ]

Исходное сообщение
"Подсчет траффика-perl скрипт"

Отправлено Oberon , 27-Янв-03 13:57 
Всем доброго дня!
Написал скрипт каторый считает траффик не хуже 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>;


Содержание

Сообщения в этом обсуждении
"RE: Подсчет траффика-perl скрипт"
Отправлено Dawnshade , 27-Янв-03 16:08 
>Всем доброго дня!
>Написал скрипт каторый считает траффик не хуже sarga, но собственно дело вот
>вчем мой скрип считает слишком медленно 100mb за 10минут а sarg
>туже сумму только за 6 минут.Можно все исправить если каждый день
>архивировать логи сквида то время снижается. Так вот вчем моя просьба,
>увожаемые специалисты посмотрите мой скрипт может поткинете мне решение данной проблемы.

Удивляться как бы нечему. Сарг написан на сях, если я не ошибаюсь. А перл - интерпретируемый язык, который по определнию работает медленнее.


"RE: Подсчет траффика-perl скрипт"
Отправлено konst , 27-Янв-03 17:24 
>>Всем доброго дня!
>>Написал скрипт каторый считает траффик не хуже 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>) {
# ДЕЛАТЬ ЧТО НУЖНО
;  
}
===
ТО ЕСТЬ в этом коде слишком много лишних "проходов" (итераций)