为什么要提高plackup(或starman)的内存使用率



我有这个简单的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,但速率较慢

问题是:

  • 为什么要提高内存使用率?泄漏在哪里,以及如何实现恒定的内存使用(尤其是在starman上),因为我不想在长时间内耗尽内存。(好吧,可以定义例如--max requests 100),但这不是内存使用的答案
  • -我的示例中有什么错误

如果有人想测试这个-这里是我的获取脚本:

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#tmemn";
foreach my $i (1..1000) {
    my $res = $ua->request($req);
    (my $mem = $res->content) =~ s/D//g;
    next if( $mem == $old_mem );
    print "$it$memn";
    $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

根据miyagava的评论,答案是:

"plackup-内存使用率在前3个请求并保持不变对于接下来的997个请求"这意味着中的某些模块延迟加载最初的几个请求。在那之后无泄漏宫川14小时前

Starman默认启用保持活动和HTTP管道,这意味着如果在短时间内发送1000个请求迟早你会有这些联系已连接,除非您明确断开它们的连接。我可以确认使用ApacheBench-内存暂时增加,但当断开连接/超时,内存一直到它所在的地方宫川14小时前

thanx。

您使用了最新版本吗?我无法复制你的输出。

带有"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

与"星际人":

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

相关内容

  • 没有找到相关文章