The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
netflow вешает pgsql, !*! grinz, 06-Окт-07, 18:27  [смотреть все]
Начал работать админом freebsd, и по наследству досталась связка netflow (столкнулся с нетфлоу впервые). Вся статистика заносится в PostgreSQL. Постараюсь описать проблему.

Есть три скрипта запускающиеся по крону:
1. /usr/netflow/newday.pl запускается в 00:00
2. каждые 10 минут /usr/netflow/script.pl > /dev/null 2>&1
3. /usr/netflow/netflow.sh в 23.59

Структура бд выглядит следующим образом:

CREATE TABLE logs
(
  date date DEFAULT now(),
  ip character varying,
  proto bigint,
  traf bigint,
  alias character varying
)
WITHOUT OIDS;
ALTER TABLE logs OWNER TO netflow;
GRANT ALL ON TABLE logs TO pgsql WITH GRANT OPTION;
GRANT ALL ON TABLE logs TO netflow WITH GRANT OPTION;

-- /usr/netflow/newday.pl делает:

#!/usr/bin/perl

use DBI;
use CGI qw(:standard);

my $dbh = DBI->connect("dbi:Pg:dbname=netflow", "netflow", "password") || die "Not connected";

my($tmp,$tmp,$tmp,$nday,$nmonth,$nyear,$tmp,$tmp,$tmp) = localtime(time);
$nday = sprintf("d", $nday % 100);
$nmonth+=1;
$nyear+=1900;

$dbh->do("insert into logs(date,ip,proto,traf,alias) values ('$nyear-$nmonth-$nday','ip_adress',0,0,'');");
$dbh->do("insert into logs(date,ip,proto,traf,alias) values ('$nyear-$nmonth-$nday','ip_adress',21,0,'');");
$dbh->do("insert into logs(date,ip,proto,traf,alias) values ('$nyear-$nmonth-$nday','ip_adress',22,0,'');");
$dbh->do("insert into logs(date,ip,proto,traf,alias) values ('$nyear-$nmonth-$nday','ip_adress',23,0,'');");
$dbh->do("insert into logs(date,ip,proto,traf,alias) values ('$nyear-$nmonth-$nday','ip_adress',25,0,'');");
$dbh->do("insert into logs(date,ip,proto,traf,alias) values ('$nyear-$nmonth-$nday','ip_adress',53,0,'');");
$dbh->do("insert into logs(date,ip,proto,traf,alias) values ('$nyear-$nmonth-$nday','ip_adress',80,0,'');");
$dbh->do("insert into logs(date,ip,proto,traf,alias) values ('$nyear-$nmonth-$nday','ip_adress',110,0,'');");
$dbh->do("insert into logs(date,ip,proto,traf,alias) values ('$nyear-$nmonth-$nday','ip_adress',443,0,'');");

$dbh->disconnect;

-- /usr/netflow/script.pl делает следующее:

#!/usr/bin/perl

use DBI;
use CGI qw(:standard);

my($tmp,$tmp,$tmp,$nday,$nmonth,$nyear,$tmp,$tmp,$tmp) = localtime(time);
$nday = sprintf("d", $nday % 100);
$nmonth+=1;
$nyear+=1900;

my $dbh = DBI->connect("dbi:Pg:dbname=netflow", "netflow", "password") || die "Not connected";

`/usr/local/bin/fd_filter /usr/netflow/format.file /usr/netflow/today.flw > /usr/netflow/out`;

open (ERR,"/usr/netflow/$ARGV[0].err");
open(SRC,"/usr/netflow/out"); #out - это файл резултатов fd_filter
while($l=<SRC>)
{
next if($l=~/^#/);
($a[0],$a[1],$a[2],$a[3],$a[4],$a[5],$a[6],$a[7],$a[8],$a[9],$a[10],$a[11],$a[12])=split(' ',$l);
# src   dst  s_asn d_asn  ->     <-    ->p  <-p  s_if   d_if
if($a[12] == 255) { print ERR "$l";next; }
if($a[0] ne "0.0.0.0")
    {
$hash="$a[0]"."#$a[9]"."#$a[10]";
$d{$hash}[0]+=$a[5]; #na adres
$d{$hash}[1]+=$a[4]; #s adres
$d{$hash}[2]+=$a[7];
$d{$hash}[3]+=$a[6];
    }
if ($a[2] != 0)
    {
$hash="$a[2]"."#$a[9]"."#$a[10]";
$d{$hash}[0]+=$a[5]; #na adres
$d{$hash}[1]+=$a[4]; #s adres
$d{$hash}[2]+=$a[7];
$d{$hash}[3]+=$a[6];
    }

if ($a[1] ne "0.0.0.0")
        {
$hash="$a[1]"."#$a[8]"."#$a[11]";
$d{$hash}[0]+=$a[4];
$d{$hash}[1]+=$a[5];
$d{$hash}[2]+=$a[6];
$d{$hash}[3]+=$a[7];
        }

if ($a[3] != 0)
    {
$hash="$a[3]"."#$a[8]"."#$a[11]";
$d{$hash}[0]+=$a[4]; #na adres
$d{$hash}[1]+=$a[5]; #s adres
$d{$hash}[2]+=$a[6];
$d{$hash}[3]+=$a[7];
    }

}

foreach $key (keys (%d))
{
($a,$b,$c)=split('#',$key);
($a[1],$a[2],$a[3],$a[4])=split('\.',$a);
$val="'$a[1].$a[2].$a[3].$a[4]',$c,'$d{$key}[0]'";

$dbh->do("update logs SET traf=$d{$key}[0] where date='$nyear-$nmonth-$nday' and ip='$a[1].$a[2].$a[3].$a[4]' and proto=$c;");

#print "$val\n";
}

$dbh->disconnect;


-- /usr/netflow/netflow.sh делает:

#!/bin/sh

# netflow
cd /usr/netflow
/usr/netflow/script.pl
killall -9 NetFlowMet
killall -9 NeMaC
sleep 5
rm /usr/netflow/today.flw /usr/netflow/today.log
/usr/local/bin/NetFlowMet -w wr435ihgte -f 100000 -b 20000 -t 40000 -v 3000 -e 600 -D
/usr/local/bin/NeMaC -k120 -F /usr/netflow/today.flw -h 60 -g 600 -L /usr/netflow/today.log -b mib.txt -r /usr/netflow/new.slr.rules -c 600 ип_адресс wr435ihgte -D


Вобщем проблема заключается в том, что /usr/netflow/script.pl толи долго делает апдейт бд, толи хз, но через 10 минут запускается опять этот скрипт, и за пару часов образуется куча клонов этого процесса. В следствии чего pgsql очень сильно нагружается и вылетает в кору.

В /usr/netflow/script.pl я убирал все строчки связанные с бд, все работает.
/usr/netflow/today.flw за пару часов достигает 5 метров, парсится скриптом нормально. Может очень большой объем информации апдейтится и поэтому бд не справляется? Периодичность запуска этого скрипта я увеличивал и до один запуск в 30 минут. Не помогало. Может у кого есть какие соображения?




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

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