測試機房品質之Ping值測試
我們常常會遇到這種問題,業務需要全國布點來滿足使用者的通路需求。但是全國那麼多的機房要如何選擇呢?當然我們肯定事先基本通過各個管道了解并初步篩選了十幾二十家機房,但是真的是要決定選擇那幾家作為第一批去布點的機房還是需要一番測試的,其中上傳、下載下傳速率以及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 "Please report bug <mumonitor\@gmail.com>, Thank you!\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' ) {
'61.152.188.1'=>'上海電信1',
'61.129.51.254'=>'上海電信2',
'218.1.64.33'=>'上海熱線',
'61.145.125.229'=>'廣東互聯星空_廣州電信',
#下面可依次添加電信的機房
} elsif ($idc eq 'edu' ) {
'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 {
$average_num=($2+$result{$ping_list{$i}});
$average_num=($2+$result{$ping_list{$i}})/2;
}
}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)) {
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腳本
這樣就可以讓它自動運作啦,第二天咱們就可以一早來收資料啦~。