咱們經常會遇到這種問題,業務須要全國布點來知足用戶的訪問需求。可是全國那麼多的機房要如何選擇呢?固然咱們確定事先基本經過各個渠道瞭解並初步篩選了十幾二十家機房,可是真的是要決定選擇那幾家做爲第一批去布點的機房仍是須要一番測試的,其中上傳、下載速率以及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腳本
這樣就可讓它自動運行啦,次日我們就能夠一早來收數據啦~。