The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"загрузка CPU и скорость работы скриптов"
Отправлено Alexander, 30-Сен-08 15:18 
>Ну так покажите скрипт, поможем :)

ну, давайте попробуем, спасибо :) приведу основной кусок. исходные:
трафик делится на две категории: внешний и локальный
@nonlocalhosts - ip-адреса хостов, трафик на которые считается внешним
@local_nets_dec - ip-адреса локальных подсетей в десятичном представлении, префиксы, маски локальных подсетей в десятичном представлении (соответствующие префиксам)
@client_nets_dec - тоже самое, но только клиентские подсети. плюс - id клиента
@pre_mul_256_... - массивы для быстрого перевода ip-адресов из октетного вида в десятичный

while ( <IN> ) {
  next if (/^$/);
  ( $ip1, $ip2, $bytes1, $bytes2 ) = split;

  $H1proxy = grep $ip1 eq $_, @nonlocalhosts;
  $H2proxy = grep $ip2 eq $_, @nonlocalhosts;

  # какой из хостов принадлежит нашим сетям?
  $H1loc = 0; $H2loc = 0;
  @ips = split(/\./, $ip1);
  #-- convert ips to dec
  $ip1_dec = $pre_mul_256_3[$ips[0]] + $pre_mul_256_2[$ips[1]] + $pre_mul_256_1[$ips[2]] + $ips[3];
  @ips = split(/\./, $ip2);
  #-- convert ip to dec
  $ip2_dec = $pre_mul_256_3[$ips[0]] + $pre_mul_256_2[$ips[1]] + $pre_mul_256_1[$ips[2]] + $ips[3];

  foreach (@local_nets_dec) {
    ($net_dec, $prefix, $mask_dec) = @{$_};
    #-- apply mask
    my $ip1_net = $ip1_dec & $mask_dec;
    my $ip2_net = $ip2_dec & $mask_dec;
    $H1loc = 1 if ($ip1_net == $net_dec && !$H1proxy && !$H1loc);
    $H2loc = 1 if ($ip2_net == $net_dec && !$H2proxy && !$H2loc);
    #-- exit from the loop if we made all checks
    last if ($H1loc && $H2loc);
  }

#-- вот это самый долгий кусок
  foreach (@client_nets_dec) {
    ($net_dec, $prefix, $mask_dec, $cid) = @{$_};
    $ip1_net = $ip1_dec & $mask_dec;
    $ip2_net = $ip2_dec & $mask_dec;
    #-- хост1 - клиент?
    $C1 = ($ip1_net == $net_dec);
    #-- хост2 - клиент?
    $C2 = ($ip2_net == $net_dec);
    unless( $C1 or $C2 ) {  next; } # оба хоста не принадлежат %client_nets

    if( $C1 and $C2 ) { # оба хоста принадлежат %client_nets -> лок трафик
      if( ($H1loc and $H2loc) || ($H1loc and $H2proxy) || ($H1proxy and $H2loc) ) { # и входят в лок сеть
        $bytes_in_loc{$cid}  += $bytes1;
        $bytes_out_loc{$cid} += $bytes2;
        next;
      }
    }

    if( !$C1 and $C2 ) { #$ip1 не принадлежат сети $net, $ip2 принадлежат сети $net
      if( (!$H1loc and $H2loc) || (!$H1loc and $H2proxy) ) { # $ip1 внешний хост -> внеш трафик
        $bytes_in{$cid}  += $bytes2; # переворачиваем
        $bytes_out{$cid} += $bytes1;
        next;
      }
      if( ($H1loc and $H2loc) || ($H1loc and $H2proxy) || ($H1proxy and $H2loc) ) { # $ip1 наш хост -> лок трафик
        $bytes_in_loc{$cid}  += $bytes2; # переворачиваем
        $bytes_out_loc{$cid} += $bytes1;
        next;
      }
    }

    if( $C1 and !$C2 ) { #$ip1 принадлежат сети $net, $ip2 не принадлежат сети $net
      if( ($H1loc and !$H2loc) || ($H1proxy and !$H2loc) ) { # $ip2 внешний хост -> внеш трафик
        $bytes_in{$cid}  += $bytes1;
        $bytes_out{$cid} += $bytes2;
        next;
      }
      if( ($H1loc and $H2loc) || ($H1loc and $H2proxy) || ($H1proxy and $H2loc) ) { # $ip2 наш хост -> лок трафик
        $bytes_in_loc{$cid}  += $bytes1;
        $bytes_out_loc{$cid} += $bytes2;
        next;
      }
    }
  }
}

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.

На сайте действует частичное премодерирование - после публикации некоторые сообщения от анонимов могут автоматически скрываться ботом. После проверки модератором ошибочно скрытые сообщения раскрываются. Для ускорения раскрытия можно воспользоваться ссылкой "Сообщить модератору", указав в качестве причины обращения "скрыто по ошибке".



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру