我们常常会遇到这种问题,业务需要全国布点来满足用户的访问需求。但是全国那么多的机房要如何选择呢?当然我们肯定事先基本通过各个渠道了解并初步筛选了
十几二十家机房,但是真的是要决定选择那几家作为第一批去布点的机房还是需要一番测试的,其中上传、下载速率以及Ping值的测试是必不可少的环节。今天
先来介绍Ping值测试。
Ping值测试我们可以用一个perl脚本来实现,同时网通机房和电信的机房是要分开来测的,下面就是ping值测试的
perl脚本,大家可以根据自己的情况进行修改需要测试的服务器。并把ping值脚本轮流放在
每一个节点上,最后综合统计它们相互测试的结果。
#!/usr/bin/perl
# 设定输出结果的文件名
$result_filename='./ping_result.log';
$argv=@ARGV;
if
(($argv != 2) && ($argv != 3)) {
print "Useage: ./ping.pl
ctc|cnc|edu minutes [-s]\n";
print "\n";
print "For
Example: \n";
print "\t ./ping.pl ctc 10\n";
print "\n";
print "Please report bug , Thank you!\n";
print "\n";
exit;
}
$idc=$ARGV[0];
#
转换为妙
$time=$ARGV[1]*60;
# 设定测试点
#网通的
if ( $idc eq 'cnc'
) {
%ping_list=(
'219.158.28.121'=>'中国网通骨干网',
'202.108.100.166'=&
gt;'中国网通北京网通',
'218.69.33.1'=>'天津网通',
#下面可依次添加网通的机房
);
} elsif ( $idc eq 'ctc' ) {
%ping_list=(
'61.152.188.1'=&
gt;'上海电信1',
'61.129.51.254'=>'上海电信2',
'218.1.64.33'=&
gt;'上海热线',
'61.145.125.229'=>'广东互联星空_广州电信',
#下面可依次添
加电信的机房
);
} elsif ($idc eq 'edu' ) {
%ping_list=(
'202.112.128.1'=&
gt;'北京航空航天大学',
'166.111.8.28' =>'北京清华大学',
'202.114.0.242'
=>'湖北武汉华中科技大学',
#下面可依次添加教育网的机房
);
}
#
计数器,用来区分第一次记录ping值和丢包率
$count = 1;
chomp ($now_time=`/bin/date
+%s`);
# 设定测试结束时间
$end_time=$now_time+$time;
#
判断现在时间是否小于结束时间
while ($now_time <= $end_time) {
foreach $i
(keys %ping_list) {
if ($count == 1) {
$server_count{$ping_list{$i}}=1;
}
# 测试ping数据
open(PROCESS,
"/bin/ping -c 1 $i | grep icmp_seq |");
$ping = ;
close(PROCESS);
#
判断计数单位ms和usec
if ( $ping =~ m/(.*time=)(.*) (ms|usec)/ ) {
#
如果非常非常非常快,到了微妙级别,则...
if ($3 eq "usec") {
#
如果是第一次的数值,则直接记录
if ($count==1) {
$average_num=($2/1000+$result{$ping_list{$i}});
$rate=($rate_tmp+$result_rate{$ping_list{$i}});
}
else {
# 两次的结果相加然后除以2
$average_num=($2/1000+$result{$ping_list{$i}})/2;
$rate_tmp=0;
$rate=($rate_tmp+$result_rate{$ping_list{$i}})/2;
}
$result{$ping_list{$i}}=$average_num;
$result_rate{$ping_list{$i}}=$rate;
}else
{
# 如果是第一次的数值,则直接记录
if ($count==1) {
$average_num=($2+$result{$ping_list{$i}});
$rate=($rate_tmp+$result_rate{$ping_list{$i}});
}
else {
# 两次的结果相加然后除以2
$average_num=($2+$result{$ping_list{$i}})/2;
$rate_tmp=0;
$rate=($rate_tmp+$result_rate{$ping_list{$i}})/2;
}
$result{$ping_list{$i}}=$average_num;
$result_rate{$ping_list{$i}}=$rate;
}
}else{
#
ping没有输出结果,或者是timeout
# 第一次则直接记录
if ($count==1) {
$result{$ping_list{$i}}=0;
$rate=100;
}
else {
# 丢包率需要两次结果相加,平均值则不作记录
$rate_tmp=100;
$rate=($rate_tmp+$result_rate{$ping_list{$i}})/2;
}
$result_rate{$ping_list{$i}}=$rate;
}
}
$count +=
1;
chomp ($now_time=`/bin/date +%s`);
# 输出一次的结果到文件
open
LOG, ">$result_filename";
if ($ARGV[2] eq '-s') {
foreach
$i (sort (sort_values (keys %result))) {
printf LOG "%s
%.2f %.2f%\n" , $i,$result{$i},$result_rate{$i};
}
} else {
foreach
$i (sort (keys %result)) {
printf LOG "%s %.2f %.2f%\n" ,
$i,$result{$i},$result_rate{$i};
}
}
close LOG;
}
sub
sort_values {
$result{$a} <=> $result{$b}
}
当然为了同时间测
试网通和电信,我们可以写一个Shell脚本,让系统在同一个时间执行它,使网通和电信的ping值测试可以同时进行。
下面是这个Shell脚本
idc.sh
#!/bin/sh
date=$(date +%Y%m%d_%T)
echo $date
cd
/root #进入ping.pl的目录,可以根据自己的需求更改
perl ping.pl cnc 10
mv
ping_result.log ping_cnc_$date.log
perl ping.pl ctc 10
mv
ping_result.log ping_ctc_$date.log
测试的结果中有平均速度和丢包率这两项,可以把每个节点的结果统计成
excel表格以便于观察。
把需运行的脚本放入crontab中自用运行。
vi /etc/crontab
编辑crontab,
加入
30 */1 * * * root sh /root/idc.sh # 表示每隔一小时,在半点时运行idc.sh脚本
这样就可
以让它自动运行啦,第二天咱们就可以一早来收数据啦~。
阅读(2575) | 评论(1) | 转发(0) |