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

Исходное сообщение
"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 минут. Не помогало. Может у кого есть какие соображения?


Содержание

Сообщения в этом обсуждении
"netflow вешает pgsql"
Отправлено v.i.t , 07-Окт-07 13:36 

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

это - в точку
у вас увеличился объем обрабатываемого netflow  трафика (как причина - например сильная активность троянов в вашей сети )

Периодичность запуска
>этого скрипта я увеличивал и до один запуск в 30 минут.
>Не помогало. Может у кого есть какие соображения?

и не поможет
внедренное у вас решение  netflow->perl(shell)->db  - очень ресурсоемкое
возможные действия:
- выявить и устранить причину возрастания трафика
- оптимизировать ваши программы и произвести индексацию БД
- нарастить мощности
- внедрить другое решение


"netflow вешает pgsql"
Отправлено grinz , 08-Окт-07 01:16 
> - оптимизировать ваши программы и произвести индексацию БД

Что именно оптимизировать в скрипте?


"netflow вешает pgsql"
Отправлено johnjoy , 08-Окт-07 12:11 
>CREATE TABLE logs
>(
>  date date DEFAULT now(),
>  ip character varying,
>  proto bigint,
>  traf bigint,
>  alias character varying
>)

Размер базы какой? (количество записей в этой таблице и физический на диске)

неправильная таблица вообще говоря.
WITHOUT OIDS и при этом нет ни primary key, ни индексов...
эдак он у вас при каждом запросе update перебирает всю таблицу
ну и есть подозрение, что vacuum не проводится, что при таком количестве update очень негативно =)

Для начала так:
VACUUM FULL ANALYZE logs;
CREATE INDEX "logs_date_idx"  ON logs ("date");
CREATE INDEX "logs_proto_idx"  ON logs ("proto");


"netflow вешает pgsql"
Отправлено Cyrill Malevanov , 08-Окт-07 12:59 
>Начал работать админом 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
>

sync write отключить надо бы в постгресе, -f параметр
на update надо добиться, чтобы были индексы - апдейт по индексу будет на порядок быстрее
в начале скрипта поставить begin, в конце после всех инсертов и апдейтов коммит - а то получается коммит после каждого инсерта, это сильно тормозит базу