missing-cn 阅读(184) 评论(0)
一、目标


 测试目标IDC的链路质量,看其BGP到全国各地运营商的链路的可用性、稳定性、速度。
 


二、方法


1、dig测试 

通过在目标IDC内部的server 上定时运行dig命令多次向全国各省市分运营商的dns发送dns查询命令,记录获取的查询时间。
测试脚本:netspeed.sh
  dns列表文件:serverlist.txt dns ip可以自定义,格式为 name ip;一般来说dns要每个省的三大运营商都要有,大概100多个。可以根据需求自定义。
  netspeed.txt:测试结果文件,格式为name、时间、速度(单位为毫秒)
2、统计分析结果

在一定时期统计结果,计算出平均速度、探测不成功次数、和平均速度的标准方差。
统计结果脚本:result.sh 
输入文件:netspeed.txt
统计结果文件:r.txt(第一次计算的结果) result.txt(第二次计算结果) scope.txt(按照评价方法计算的得分文件) final.txt(最终结果得出一个总和分数) 
 


3、评价方法

3.1 可用性
占比:40%,百分制
指标:丢包率
   计算方法:(1-丢包率)*40为可用性得分
3.2 速度     
占比:30%
指标:平均速度
计算方法:小于1ms为满分,大于1s为零分,(1-平均速度/1000)*30 
3.3 稳定性
占比:30%
指标:标准方差
计算方法:(1-标准方差/平均速度)* 30 ,如果该值为负,统计时按零处理

3.4 举例

某测试结果:平均速度50ms,丢包率10%,标准方差 5ms,则计算过程如下:

可用性得分= (1-10%)* 40 = 36
速度得分=(1-50/1000)* 30 = 28.5
稳定性得分=(1-5/50)* 30 = 27

总和得分=36+28.5+27=91.5

3.5 其他意外

如果某个server dig探测全部失败,即探测次数和失败次数相等,计算是忽略该server的值





三、脚本及文件说明






1、netspeed.sh


#!/bin/bash


# Input file : serverlist.txt
# Output file : netspeed.txt
# Input file format : name(isp name,ct or cu) domain( domain name ,example www.tiros.com.cn)
# Output file format : name domain   date&time  speed 
# set for running directory ,can be running any directory
if [ $(echo $0 | grep '^/') ]; then
        DATA_DIR=$(dirname $0)
      else
        DATA_DIR=$(pwd)/$(dirname $0)
fi
# Domain default sina.cn
if [ "$1" == "" ] ;then
        Domain=sina.cn
else
        Domain=$1
fi
if [ "$2" == "" ] ; then 
        INPUT_FILE=serverlist.txt
else
        INPUT_FILE=$2
fi
# get speed  for each line from serverlist.txt
while read  name  DNSServer
   do 
   # dig domain for each dns server  
   speed=`dig $Domain  @$DNSServer | sed -n /"Query time"/p |awk '{print $4,$5}'`
   # recording speed data to Output file
   # for debuging
   #echo $name $domain `date "+%F %T" `  $speed  
   echo $name  `date "+%F %T" `  $speed   >> $DATA_DIR/netspeed.txt
   echo -e "\n"
   done < $DATA_DIR/$INPUT_FILE
   
   
2、result.sh
#!/bin/bash
# The fields of input include :Nanme , Date,Time,Speed,Speed_unit
#
# output file r.txt include 3 fields : name ,test times, average  speed,lost


# set for running directory ,can be running any directory 
if [ $(echo $0 | grep '^/') ]; then
        DATA_DIR=$(dirname $0)
      else          
        DATA_DIR=$(pwd)/$(dirname $0)      
fi
# clear temp files 
:>$DATA_DIR/r.txt
:>$DATA_DIR/result.txt
:>$DATA_DIR/scope.txt
#caclute the speed and losts
awk '{name[$1]=$1;cnt[$1]=cnt[$1]+1;sum[$1]=$4+sum[$1];if($4=="")lost[$1]=lost[$1]+1}END{for (i in name)print name[i],cnt[i]+0,sum[i]/cnt[i],(lost[i]+0)}' $DATA_DIR/netspeed.txt  > $DATA_DIR/r.txt
#caclute mdev
while read name cnt average lost 
    do
        mdev=`grep $name $DATA_DIR/netspeed.txt |awk -v ave=$average -v nam=$name -v ct=$cnt '{sum+=($4-ave)^2}END{print sqrt(sum/ct)}'`
        # exclude the bad server "awk '{if($2>$4)print $0}'"
        echo $name $cnt $average $lost $mdev |awk '{if($2>$4)print $0}' >>$DATA_DIR/result.txt
        # debugging
        #echo $name $cnt $average $lost $mdev
    done < $DATA_DIR/r.txt
# calculte scores of each server 
awk '{name[$1]=$1;cnt[$1]+=$2;avg[$1]+=$3;lost[$1]+=$4;mdev[$1]+=$5}END{for (i in name) print name[i],(1-lost[i]/cnt[i])*40,(1-avg[i]/1000)*30,(1-mdev[i]/avg[i])*30}' $DATA_DIR/result.txt|awk '{if($4>0){print $0,$2+$3+$4} else {print $0,$2+$3}}' >> $DATA_DIR/scope.txt
# calculte final scope 
sort -nrk5 $DATA_DIR/scope.txt |awk '{sum+=$5;cnt++}END{print sum/cnt}' >$DATA_DIR/final.txt
# display final scope 
ser_num=`wc -l $DATA_DIR/r.txt|awk '{print $1}'`
test_num=`wc -l $DATA_DIR/result.txt|awk '{print $1}'`
lost_num=`echo $ser_num - $test_num |bc`
echo  "Total servers:$ser_num  Bad servers:$lost_num Pass servers:$test_num"
#echo $ser_num  $test_num $lost_num
cat $DATA_DIR/final.txt