我们常常会遇到这种问题,业务需要全国布点来满足用户的访问需求。但是全国那么多的机房要如何选择呢?当然我们肯定事先基本通过各个渠道了解并初步筛选了十几二十家机房,但是真的是要决定选择那几家作为第一批去布点的机房还是需要一番测试的,其中上传、下载速率以及
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 <mumonitor\@gmail.com>, 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'=>'
中国网通北京网通',
'218.69.33.1'=>'
天津网通',
#下面可依次添加网通的机房
);
} elsif ( $idc eq 'ctc' ) {
%ping_list=(
'61.152.188.1'=>'
上海电
信
1',
'61.129.51.254'=>'
上海电
信
2',
'218.1.64.33'=>'
上海热线',
'61.145.125.229'=>'
广东
互
联
星空
_
广州电
信
',
#下面可依次添加电信的机房
);
} elsif ($idc eq 'edu' ) {
%ping_list=(
'202.112.128.1'=>'
北京航空航天大学',
'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 = <PROCESS>;
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
脚本
这样就可以让它自动运行啦,第二天咱们就可以一早来收数据啦
~。
本文出自 “奇幻的梦” 博客,转载请与作者联系!