Для 5.2-001 и выше
Пожалуйста и мне. dron@lsd.net.ua
matvey@luga.net.ua
Заранее спасибо
Заранее спасибо
-
- Сообщения: 11
- Зарегистрирован: Ср ноя 22, 2006 15:48
мм.. представляю как база будет расти быстро. у нас за сутки файлы (*.utm) занимают 4-5гб.
Даже если учитывать что база будет в день подрастать на 2гб, то за год = 2*365 грубо
Долго не похраниш такую деталку, а по закону 3 года нужно.
Нетуповские файлы хоть по дискам расталкать можно, а с базой проблематично это имхо..![Cool 8)](./images/smilies/icon_cool.gif)
С ужасом представляю себе базу на несколько сотен гигов и как это все тормозить будет при запросах![Laughing :lol:](./images/smilies/icon_lol.gif)
Хотя как вариант - хранить в базе статистику не дольше месяца (с каждым днем затирать самые старые записи). Чтобы пользователю была доступна статистика за текущий месяц (редко когда кому нужна статистика за год - а если и нужно то за денюжку)![Smile :)](./images/smilies/icon_smile.gif)
Даже если учитывать что база будет в день подрастать на 2гб, то за год = 2*365 грубо
Долго не похраниш такую деталку, а по закону 3 года нужно.
![Wink :wink:](./images/smilies/icon_wink.gif)
Нетуповские файлы хоть по дискам расталкать можно, а с базой проблематично это имхо..
![Cool 8)](./images/smilies/icon_cool.gif)
С ужасом представляю себе базу на несколько сотен гигов и как это все тормозить будет при запросах
![Laughing :lol:](./images/smilies/icon_lol.gif)
Хотя как вариант - хранить в базе статистику не дольше месяца (с каждым днем затирать самые старые записи). Чтобы пользователю была доступна статистика за текущий месяц (редко когда кому нужна статистика за год - а если и нужно то за денюжку)
![Smile :)](./images/smilies/icon_smile.gif)
Размер поля в таблицах списаний можно уменьшить почти в два раза, поищите тему. Сами таблицы лучше чистить раз в месяц, там подробные данные о списаниях, вряд ли они будут нужны. Детальную статистику, по идее, тоже можно разбирать и складировать в более сжатом формате... Посмотрим, может допишем приблуду сию.
admin@astracomnn.ru и мне пожалуйста???
Чуток модифицировал сей полезный скрипт. Ускорил немного. Деталька теперь пишеться в дневные таблицы (на каждые сутки своя таблица) - ибо хранить все в одной невозможно, слишком огромная таблица получается. У кого детальки много - можно переделать пару строк для хранения каждого часа в отдельной таблице.
Таблицы скрипт создает сам, обработку папки закоментировал. Работает только при передаче параметра в командной строке. У меня запускается в скрипте raw_fd_script.
Таблицы скрипт создает сам, обработку папки закоментировал. Работает только при передаче параметра в командной строке. У меня запускается в скрипте raw_fd_script.
Код: Выделить всё
<?php
/*********************** COPYRIGHT **********************/
/***** UTM 5 detailed statistic packet 0.8b *****/
/***** *.utm (binary) --> MySql *****/
/***** Developed by DRiN a/k/a DJ Neo D'Matrix *****/
/***** Ukraine, Kiev 2006 *****/
/********************************************************/
/***** update by Kayfolom 2009 *****/
/***** Usage: read HOWTO *****/
/*********************** CONFIG **********************/
$config["mysql_host"] = "10.0.0.9";
$config["mysql_db"] = "UTM5_detail_stat";
$config["mysql_user"] = "UTM5_detail_stat";
$config["mysql_pass"]= "UTM5_detail_stat";
$config["path2dbfiles"]= "/netup/utm5/db";
$config["table_stat"] = "stat";
$config["exec_limit"] = 60*60;
$config["ignoresystem"] = false; // If true script will ignore system trafic (id == 0)
$config["log2screen"] = false;
$config["log2file"] = "/netup/utm5/log/export_detail_stat.log";
$config["delete_utm"] = false;
$config["t_class_arr"] = array(10, 14, 20, 24); // traffic class for a store
$config["create_table"] = "CREATE TABLE IF NOT EXISTS `{TABLE_NAME}` (`id` int(11) NOT NULL auto_increment,`timestamp` int(4) unsigned,`account_id` int(2) unsigned,`t_class` int(2) unsigned, `packets` int(4) unsigned, `bytes` int(4) unsigned, `src_ip` int(4) unsigned, `src_port` smallint(2) unsigned, `dst_ip` int(4) unsigned, `dst_port` smallint(2) unsigned, `proto` TINYINT(1) unsigned, `tos` TINYINT(1) unsigned, PRIMARY KEY (`id`)) ENGINE=MyISAM;";
/*********************** FUNCTIONS **********************/
function getmicrotime() {
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
function mylog($log_str) {
global $config, $flog;
$now = date("d.m.y H:i:s");
$log_str = "$now $log_str\r\n";
if ($config["log2screen"]) {
echo $log_str;
}
fwrite($flog, $log_str);
}
function export_record($line) {
global $config, $skip_system, $skip_null, $skip_timestamp, $skip_t_class;
$_timestamp = $line['timestamp'];
$_account_id = $line['account_id'];
$_t_class = $line['t_class'];
$_packets = $line['packets'];
$_bytes = $line['bytes'];
$_src_ip = $line['src_ip'];
$_src_port = $line['src_port'];
$_dst_ip = $line['dst_ip'];
$_dst_port = $line['dst_port'];
$_proto = $line['proto'];
$_tos = $line['tos'];
if (($_account_id == 0) and $config["ignoresystem"]) {
$skip_system++;
return(2);
} /** ignore system **/
if (($_packets == 0) or ($_bytes == 0)) {
$skip_null++;
return;
} /** no data transfer **/
if ($line['timestamp'] == 0) {
$skip_timestamp++;
return;
} /** no timestamp **/
if(!in_array($_t_class, $config["t_class_arr"])) {
$skip_t_class++;
return;
} /** no timestamp **/
$query = $config["create_table"];
$date_tmp = date("Y_m_d", $line['timestamp']);
$query = preg_replace('/{TABLE_NAME}/', $date_tmp, $query);
$result = mysql_query($query);
$columns = "`timestamp`, `account_id`, `t_class`, `packets`, `bytes`, `src_ip`, `src_port`, `dst_ip`, `dst_port`, `proto`, `tos`";
$values = "'$_timestamp', '$_account_id', '$_t_class', '$_packets', '$_bytes', '$_src_ip', '$_src_port', '$_dst_ip', '$_dst_port','$_proto','$_tos'";
$query = "INSERT DELAYED INTO `{$date_tmp}` ($columns) values ($values)";
$result = mysql_query($query);
return($result);
}
function export($exportfile) {
global $config, $rps;
if(!is_file($exportfile)) {
mylog("File \"$exportfile\" not exists");
return;
}
$count_records = floor(filesize($exportfile)/76);
if($count_records == 0) {
mylog("File \"$exportfile\" not have records to export");
return;
}
mylog("\"$exportfile\" contain $count_records records");
if(!($f = fopen($exportfile, "r"))) {
mylog("Can't open \"$exportfile\" for reading");
return;
}
$i = 0;
$rps = 0;
$start_time = getmicrotime();
for ($n = 1; $n <= $count_records; $n++) {
$record = sfread($f);
$result = export_record($record);
if ($result) {
if ($result !== 2) $i++;
}
// else {
// mylog("Export failed (record #$n)");
// }
}
fclose($f);
$end_time = getmicrotime();
$ecex_time = $end_time - $start_time;
$rps = $i/$ecex_time;
return $i;
}
function over($halt=true) {
global $flog;
if ($halt) {
mylog("Export script halted by error");
} else {
mylog("Export script finished");
}
mylog("\r\n");
fclose($flog);
exit();
}
function sfread($f) {
$int_str = fread($f, 76);
$decode_mask = "VWTF1/Csrc_ip1/Csrc_ip2/Csrc_ip3/Csrc_ip4/Cdst_ip1/Cdst_ip2/Cdst_ip3/Cdst_ip4/Vnexthop/vin_iface/vout_iface";
$decode_mask = $decode_mask."/Vpackets/Vbytes/Vfirst/Vlast/vsrc_port/vdst_port/vtcp_flags/Cproto/Ctos/vWTF3";
$decode_mask = $decode_mask."/vsrc_as/vdst_as/vWTF4/Vslink_id/Vaccount_id/Vsourceaddr1/Vt_class/Vtimestamp/Vnfgen_addr";
$result = unpack($decode_mask,$int_str);
$result['src_ip'] = $result['src_ip1'] + $result['src_ip2']*256 + $result['src_ip3']*256*256 + $result['src_ip4']*256*256*256;
$result['dst_ip'] = $result['dst_ip1'] + $result['dst_ip2']*256 + $result['dst_ip3']*256*256 + $result['dst_ip4']*256*256*256;
return ($result);
}
/*********************** MAIN **********************/
$flog = fopen($config["log2file"], "a");
mylog("Export script started");
$con = mysql_connect($config["mysql_host"], $config["mysql_user"], $config["mysql_pass"]);
if ($con == false) {
mylog("ERROR! MySql-->Could not connect: ".mysql_error());
over();
}
$db = mysql_select_db($config["mysql_db"], $con);
if ($db == false) {
mylog("ERROR! MySql-->Could not select database: ".mysql_error());
over();
}
set_time_limit($config["exec_limit"]);
error_reporting(0);
$start_time = getmicrotime();
$total_records = 0;
$rps = 0;
$max_rps = 0;
$min_rps = 2147483647;
$total_rps = 0;
$total_rps_times = 0;
if ($_SERVER["argv"][1]) {
$utmfiles[] = $_SERVER["argv"][1];
} else {
exit;
$d = dir($config["path2dbfiles"]);
while (false !== ($entry = $d->read())) {
$fullpath = "{$config[path2dbfiles]}/$entry";
if (!is_file($fullpath)) continue;
if (!is_readable($fullpath)) continue;
$entry_parts=split("[.]", $entry);
$ext = $entry_parts[count($entry_parts)-1];
if ($ext != 'utm') continue;
$utmfiles[] = $fullpath;
}
$d->close();
}
$count_files = count($utmfiles);
if(isset($utmfiles) and ($count_files > 0)){
mylog("There are $count_files files to export");
} else {
mylog("There are no files to export");
over();
}
$total_skip_system = 0;
$total_skip_null = 0;
$total_skip_timestamp = 0;
$total_skip_t_class = 0;
foreach($utmfiles as $n=>$utmfile) {
// if(is_file($utmfile)) {
// rename($utmfile, $utmfile.".run");
// } else {
// mylog("File \"$utmfile\" not exists (may be already exported)");
// }
$skip_system = 0;
$skip_null = 0;
$skip_timestamp = 0;
$skip_t_class = 0;
// $exported_records = export($utmfile.".run");
$exported_records = export($utmfile);
if ($exported_records) {
$myrps = round($rps*10)/10;
$skiped = $skip_system + $skip_null + $skip_timestamp + $skip_t_class;
mylog("From \"$utmfile\" exported $exported_records records ($myrps records per second)");
mylog("\tSkipped $skiped records (system: $skip_system; null: $skip_null; timestamp: $skip_timestamp; t_class: $skip_t_class)");
$total_records += $exported_records;
$total_skip_system += $skip_system;
$total_skip_null += $skip_null;
$total_skip_timestamp += $skip_timestamp;
$total_skip_t_class += $skip_t_class;
if ($rps > $max_rps) $max_rps = $rps;
if ($rps < $min_rps) $min_rps = $rps;
$total_rps += $rps;
$total_rps_times++;
// if($config["delete_utm"]) {
// unlink($utmfile.".run");
// } else {
// rename($utmfile.".run", $utmfile.".exported");
// }
} else {
mylog("File \"$utmfile\" export failed");
// rename($utmfile.".run", $utmfile.".filed");
}
}
$end_time = getmicrotime();
$ecex_time = $end_time - $start_time;
$med_rps = $total_rps/$total_rps_times;
$glob_rps = $total_records/$ecex_time;
$max_rps = round($max_rps*10)/10;
$min_rps = round($min_rps*10)/10;
$med_rps = round($med_rps*10)/10;
$glob_rps = round($glob_rps*10)/10;
$ecex_time = round($ecex_time*100)/100;
$total_skiped = $total_skip_system + $total_skip_null + $total_skip_timestamp;
mylog("Script execution time is $ecex_time seconds");
mylog("Total exported $total_records records");
mylog("Total skipped $total_skiped records (system: $total_skip_system; null: $total_skip_null; timestamp: $total_skip_timestamp)");
mylog("Maximum speed : $max_rps records per second");
mylog("Minimum speed : $min_rps records per second");
mylog("Medium speed : $med_rps records per second");
mylog("Global speed : $glob_rps records per second");
over(false);
?>