2012-10-26 237 views
1

我試圖寫在Perl監控腳本應該檢查的URL列表中的任何緩存。我現在用的是LWP::UserAgentHTTP::ResponseTime::HiRes模塊。是否LWP :: UserAgent的做

下面是我的代碼:

use strict; 
use warnings; 

use LWP::UserAgent; 
use HTTP::Response; 
use Time::HiRes qw(gettimeofday); 

while (1) { 

    my $start = gettimeofday(); 

    my $ua = LWP::UserAgent->new(); 
    $ua->agent('lb-healthcheck.pl/0.1'); 
    $ua->timeout(10); 

    # download the tile locally 
    my $response = $ua->get("myurl"); 
    my $content = $response->content; 

    my $end = gettimeofday(); 

    print "$start - $end = ".(($end-$start)*1000)."\n"; 
} 

手動運行該腳本不到位while循環,我得到平均約70ms的響應時間,但隨着地方while循環我得到5ms的響應時間,這是不真實的。

是否LWP::UserAgent做任何緩存?如果是,是否可以禁用它,以及如何?如果不是我做錯了什麼?

回答

0

嘗試設置conn_cache與被設置爲丟棄所有的連接(參見其total_capacity子程序e.g)一個LWP::ConnCache對象

+0

試過這無濟於事。似乎緩存是在服務器端而不是我的LWP :: UserAgent端完成的。 – Sfairas

0

它看起來是your're不能正確估計經過的時間。 gettimeof day將返回一個包含秒和微秒的數組,因此爲了計算已用時間,您需要進行一些轉換。喜歡的東西:

my ($init_sec, $init_usec) = gettimeofday 
# SOME CODE HERE 
my ($stop_sec, $stop_usec) = gettimeofday 

if ($init_usec > $stop_usec) { 
    $stop_usec += 1_000_000; 
    $stop_sec--; 
} 

#convert seconds into mseconds 
my $tsec = ($stop_sec - $init_sec) * 1_000; 

# convert usecs into msecs 
my $tusec = ($stop_usec - $init_usec)/1_000; 

# elapsed time is $tsec + $tusec 
+0

我總是比較喜歡'Time :: HiRes :: time',不需要扭曲,它只是時代以來的一段時間。 – kbenson

+0

有時候需要比Time :: HiRes :: time提供的分辨率更高的分辨率時間 – quicoju

+0

是的,我確實需要微秒級的精確度,gettimeofday在這裏不是問題,因爲當我運行代碼而沒有使用while循環時,我得到經過的時間我正在exxting。 – Sfairas

1

LWP沒有做任何自己的緩存,除非你告訴它,但有LWP和主機之間的部位很多。例如,您是否通過代理工作?如果是這樣,那麼它將緩存它提取的頁面,以備第二次使用它們。雲中還有很多其他緩存可能會加快響應速度,但7ms的時間意味着本地緩存合理。

你也應該使用從Time::HiRestv_interval子程序來計算的時間間隔。它期望您將數組gettimeofday中的結果對存儲在數組中,並計算這兩對之間的差異。你的代碼看起來像這樣

use Time::HiRes qw(gettimeofday tv_interval); 

while() { 

    my $start = [ gettimeofday() ]; 

    # download the tile locally 

    my $end = [ gettimeofday() ]; 

    print tv_interval($start, $end), "\n"; 
} 

對於它的價值,對於一個普通國家的網站我避開500ms的初始獲取,其次是大約300毫秒的後續提取。所以有些緩存正在進行,但影響比您報告的要少得多。

+0

感謝您使用tv_interval的建議。我不使用的是計算間隔。 我正在向本地主機發出http請求,因此不涉及代理服務器。我想在服務器端發生緩存,這就是爲什麼我在間隔中獲得這種差異。 – Sfairas

0

LWP沒有做緩存,但操作系統會像DNS查詢的結果可能是緩存數據,所以那些只會花時間在第一次查找和OS緩存過期之後。

相關問題