- 在线时间
- 61 小时
- 最后登录
- 2013-11-8
- 威望
- 205
- 金钱
- 1882
- 贡献
- 365
- 注册时间
- 2011-5-28
- 阅读权限
- 100
- 主题
- 8
- 帖子
- 94
- 分享
- 0
- 精华
- 0
- 积分
- 2751
- 相册
- 0
|
本帖最后由 gprssanling 于 2013-3-29 09:57 编辑
GGSN(Er) pdc_kpi功能实现统计APN si/rg流量的算法 --E家的GGSN pdc_kpi工具你用过嘛?
http://user.qzone.qq.com/345010109#!app=2&via=QZ.HashRefresh&pos=1347457574日志《原创:SGSN/GGSN维护、统计工具》
文中提到GGSN pdc_kpi功能,这里重点讲一下实现统计APN si/rg流量的算法。
1.pdc_kpi程序中添加1个标量保存DL.log的值,原有的标量$pm_tab保存UL.log的值;增添2个标量分别保存DL.log/UL.log中的counters。
2.get_pm_values程序中添加return /@counters,保存counters的数组。
sub get_pm_values {
my($pm_log)=@_;
my(@counter_values,@head,%pm_val);
my($counter,@counters);
open(PM_LOG,"<$pm_log") or logg('fatal_error',"Failed to open file $pm_log");
while (<PM_LOG>) {
chomp;
unless ( m/^Time/ or m/^[\s]*[0-9]{4,4}\-[0-9]{2,2}\-[0-9]{2,2}/ ) {
next;
}
if (m/^Time/) {
@counters= split(/\|/,$_);
} else {
@counter_values=split('\|');
if ($#counter_values != $#counters) {
#sub_print("Counters != counter values...\n");next;
}
my $n=0;
foreach $counter (@counters) {
push @{$pm_val{$counter}}, $counter_values[$n];
$n++;
}
}
}
close(PM_LOG);
return \%pm_val,\@counters;
}
3.calc_sau_sds程序中传递进来的参数需要增加\@counters。计算各counter的值算法修改为:
$iend=$#$pc; #pc为接收\@counters的标量名称
for($i=0;$i<$iend;$i++){
$sau_sds[$i] = sprintf("%.2f",get_value(@$pc[$i+1],$num,$tab,"diff")*8/1000000); #get_value第一个参数为counter的名称,得出值后转化单位为Mb,保留2位小数位有效数字。
}
4.最后是修改打印输出print_sau_sds程序,这个比较麻烦,修改变动要大的多,不过核心算法是以上三步。以下是修改添加:
$id=$#$pcdl;$iu=$#$pcul;
($info_2) =uc($gnode) . " " . $apn . " " . $tlog . "(" . sprintf("%s",$id) . "," . sprintf("%s",$iu) . ")";
my $width1=length($date)+length($hour)+4;
$width1+=($id+$iu)*12;
$width = $width1 if($width1 > $width);
my $head_format = "\n" . $sign2 x($width) . "\n";
my $info_space= int(($width - length($info_1) - length($info_2))/2);
$head_format .= "$info_1" . ' ' x $info_space . "$info_2" . ' ' x $info_space . "\n\n";
$head_format .= sprintf "%-5s %-5s ",$date,$hour ;
for($i=1;$i<=$id or $i<=$iu;$i++){ #打印输出counters名称
$head_format .= sprintf("%-10d %-10d ",@$pcdl[$i],@$pcdl[$i]);}
$head_format .= "\n";
$head_format .= $sign2 x($width) . "\n";
print $head_format;
for ($i=0;$i<=$#{$saudl}; $i++) {
$line=$$saudl[$i]; #打点DL.log的counters和值,准备输出
(@values)=();
for ($j=0;$j<=($id+1); $j++) {
if (defined($line->[$j])) {
$ent=$line->[$j];
} else {
$ent="-";
}
$values[$j]=$ent;
}
$line=$$sauul[$i]; #打点UL.log的counters和值,准备输出
for ($j+=3;$j<=($id+$iu+4);$j++) {
if (defined($line->[$j-$id-3])) {
$ent=$line->[$j-$id-3];
} else {
$ent="-";
}
$values[$j]=$ent;
}
printf("%-5s %-5s ",$values[0],$values[1]);
for($n=1;$n<=($id);$n++){ #打印输出值
printf "%-10.2f %-10.2f ",$values[$n+1],$values[$n+4+$id] ; }
print "\n";
print $sign x $width . "\n";
}
|
|