6

我有这个简单的 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#\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
4

2 回答 2

6

根据miyagava的评论,答案是:

“plackup - 内存使用量在前 3 个请求中增加,并在接下来的 997 个请求中保持不变”这意味着某些模块在前几个请求中是延迟加载的。之后就没有泄漏了。– 宫川 14 小时前

Starman 默认启用 keep-alive 和 HTTP 流水线,这意味着如果您在短时间内发送 1000 个请求,您将连接这些连接,除非您明确断开它们。我可以使用 ApacheBench 确认这一点 - 内存暂时增加,但是当它们断开连接/超时时,内存会下降到原来的位置。– 宫川 14 小时前

谢谢。

于 2011-05-24T09:22:57.073 回答
1

你用的是最新版本吗?我无法重现您的输出。

使用“装盘”:

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
Plack:0.9979
Starman:0.2010

于 2011-05-23T14:29:48.100 回答