- 在线时间
 - 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"; 
  } 
 
 
 |   
 
  
 |