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

perl – 为什么要提高plackup(或starman)的内存使用率?,第1张

概述我有这个简单的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 ]];}; 我有这个简单的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              starmanreq#    mem             req#    mem             req#    mem1       7780            1       3924            1       32802       7800            2       4296            5       37283       7804            3       4304            8       3280                        ...                     ...                        ... deleted             ... deleted                        ...                     ...                        839     4596            994     3912                        866     4600            998     3908                        962     4604            1000    3912

所以,

>为什么在前3个请求中提升?
> plackup -r – 增加4k(见最后几行) – 开头还有更多
> starman – 提升,但默认5名工人的速度较慢(3280-> 3912)

版本:

# cpanm Plack starmanPlack is up to date. (0.9979)starman is up to date. (0.2010)# perl -vThis is perl 5,version 12,subversion 3 (v5.12.3) built for darwin-thread-multi-2level
解决方法 根据 miyagava的评论,答案是:

“plackup – memory usage is raising at
first 3 requests and remain constant
for the next 997 requests” That means
some modules are lazy-loaded in the
first few requests. After that there’s
no leak. – miyagawa 14 hours ago

starman by default enables keep-alive
and http pipelining,meaning if you
send 1000 requests in the short period
of time you’ll have these connections
connected,unless you explicitly
disconnect them. I can confirm this
using ApacheBench – the memory
temporarily increases,but when they
disconnect/timeout,the memory gets
down to where it was. – miyagawa 14
hours ago

感谢名单.

总结

以上是内存溢出为你收集整理的perl – 为什么要提高plackup(或starman)的内存使用率?全部内容,希望文章能够帮你解决perl – 为什么要提高plackup(或starman)的内存使用率?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1255450.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存