我正在尝试在Perl中编写监控脚本,该脚本应该检查URL列表。我使用的是LWP::UserAgent
,HTTP::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循环的情况下手动运行脚本我平均得到大约70ms的响应时间,但是使用while循环我得到大约5ms的响应时间,这是不真实的。
LWP::UserAgent
是否进行任何缓存?如果是,是否可以禁用它以及如何禁用它?如果不是我做错了什么?
答案 0 :(得分:1)
LWP
不会对它自己进行任何缓存,但是LWP和主机站点之间有很多。例如,您是通过代理工作吗?如果是这样的话,它将缓存它提取的页面,以防第二次需要它们。云中还有许多其他缓存可能会加快您的响应速度,但7毫秒的时间意味着合理的本地缓存。
您还应该使用tv_interval
中的Time::HiRes
子例程来计算间隔。它希望您将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";
}
对于它的价值,对于一个普通的国家网站,我获得了大约500毫秒的初始提取,接着大约300毫秒的后续提取。因此,一些缓存正在进行,但影响远远小于您的报告。
答案 1 :(得分:0)
尝试使用设置为删除所有连接的LWP::ConnCache对象设置conn_cache
(例如,请参阅其total_capacity
子例程)
答案 2 :(得分: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
答案 3 :(得分:0)
LWP不进行缓存,但操作系统可能会像DNS查找结果一样缓存数据,因此这些只会在第一次查找和操作系统缓存过期后花费时间。