1

URL のリストをチェックする監視スクリプトを Perl で作成しようとしています。LWP::UserAgentHTTP::ResponseおよびTime::HiResモジュールを使用しています。

これが私のコードです:

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 ループを使用せずにスクリプトを手動で実行すると、平均して約 70 ミリ秒の応答時間が得られますが、while ループを使用すると、非現実的な約 5 ミリ秒の応答時間が得られます。

LWP::UserAgentキャッシュはありますか?はいの場合、それを無効にすることは可能ですか?そうでない場合、私は何を間違っていますか?

4

4 に答える 4

1

LWP指示がない限り、独自のキャッシュは実行されませんが、LWPとホストサイトの間には多くのことがあります。たとえば、プロキシを介して作業していますか?その場合、2回目に必要になった場合に備えて、フェッチするページをキャッシュします。クラウドには他にも多くのキャッシュがあり、応答を高速化する可能性がありますが、7msの時間は、適度にローカルなキャッシュを意味します。

tv_intervalまた、からのサブルーチンを使用しTime::HiResて間隔を計算する必要があります。結果のペアを配列に格納することを想定しておりgettimeofday、これらのペアの2つの間の差を計算します。コードは次のようになります

use Time::HiRes qw( gettimeofday  tv_interval );

while () {

    my $start = [ gettimeofday() ];

    # download the tile locally

    my $end = [ gettimeofday() ];

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

価値があるのは、通常の全国的なWebサイトの場合、最初のフェッチで約500ミリ秒、その後のフェッチで約300ミリ秒かかります。そのため、一部のキャッシュが実行されていますが、報告しているよりもはるかに影響が少なくなっています。

于 2012-10-26T18:57:36.443 に答える
0

LWPはキャッシュを行いませんが、OSはおそらくDNSルックアップの結果のようにデータをキャッシュするため、最初のルックアップとOSキャッシュの有効期限が切れた後にのみ時間がかかります。

于 2012-10-28T08:58:12.867 に答える
0

すべての接続をドロップするように設定されconn_cacheLWP::ConnCacheオブジェクトを設定してみてください(total_capacityたとえば、そのサブルーチンを参照してください) 。

于 2012-10-26T16:03:50.380 に答える
0

経過時間を正しく見積もっていないようです。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
于 2012-10-26T16:21:46.093 に答える