我有这个简单的PSGI应用程序(app.psgi)。
use strict;
use warnings;
my $app = sub {
my $mem = `ps -o rss= -p $$`;
$mem =~ s/^\s*|\s*$//gs;
return [ 200, [ 'Content-Type' => 'text/text' ], [ $mem ]];
};
我被要求上述1000次并增加了内存使用量。根据启动服务器的方式,得到:
plackup
- 内存使用量在前3个请求中提高,并在接下来的997个请求中保持不变
plackup -r
- 内存使用量随机增加(不是每次请求)4k。
starman
- 如上所述,内存使用量随机增加4k,但速率较慢
问题是:
如果有人想要测试它 - 这是我的获取脚本:
use strict;
use warnings;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => 'http://localhost:5000');
my $old_mem = 0;
print "req#\tmem\n";
foreach my $i (1..1000) {
my $res = $ua->request($req);
(my $mem = $res->content) =~ s/\D//g;
next if( $mem == $old_mem );
print "$i\t$mem\n";
$old_mem = $mem;
}
我的结果:
plackup plackup -r starman
req# mem req# mem req# mem
1 7780 1 3924 1 3280
2 7800 2 4296 5 3728
3 7804 3 4304 8 3280
... ...
... deleted ... deleted
... ...
839 4596 994 3912
866 4600 998 3908
962 4604 1000 3912
所以,
plackup
提出前3个请求?plackup -r
- 增加4k(参见最后一行) - 开头更多starman
- 提高,但默认5名工作人员的速度较慢(3280-> 3912)版本:
# cpanm Plack Starman
Plack is up to date. (0.9979)
Starman is up to date. (0.2010)
# perl -v
This is perl 5, version 12, subversion 3 (v5.12.3) built for darwin-thread-multi-2level
答案 0 :(得分:5)
基于miyagava的评论,答案是:
“plackup - 内存使用量正在增加 前3个请求并保持不变 对于接下来的997个请求“这意味着 一些模块是延迟加载的 前几个请求。之后就是了 没有泄漏。 - miyagawa 14小时前
Starman默认启用keep-alive 和HTTP流水线,这意味着你 在短期内发送1000个请求 你有这些联系的时间 连接,除非你明确 断开他们。我可以证实这一点 使用ApacheBench - 内存 暂时增加,但当他们 断开/超时,内存得到 到了原来的位置。 - miyagawa 14 小时前
感谢名单。
答案 1 :(得分:1)
您使用的是最新版本吗?我无法重现你的输出。
使用" plackup":
sidburn@sid:~/perl/plack$ ./memory.pl
req# mem
1 5340
2 5380
使用" plackup -r":
sidburn@sid:~/perl/plack$ ./memory.pl
req# mem
1 4860
2 5060
使用" starman":
sidburn@sid:~/perl/plack$ ./memory.pl
req# mem
1 5176
5 5224
6 5176
7 5224
版本:
Perl:5.12.1& 5.12.3
普拉克:0.9979
Starman:0.2010