我有這個簡單的PSGI應用程序(app.psgi)。爲什麼要提高plackup(或starman)的內存使用率?
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提高,但與較慢的速率
的問題是:
- WHY是提高存儲器使用?漏洞在哪裏,以及如何實現不斷的內存使用(特別是在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
「plackup - 內存使用量在前三個請求中增加,並在接下來的997個請求中保持不變」這意味着某些模塊在前幾個請求中被延遲加載。之後,沒有泄漏。 – miyagawa 2011-05-23 18:48:39
Starman默認情況下啓用保持活動和HTTP流水線,這意味着如果您在短時間內發送1000個請求,則會將這些連接連接起來,除非您明確斷開連接。我可以使用ApacheBench來確認這一點 - 內存暫時增加,但是當它們斷開/超時時,內存會下降到原來的位置。 – miyagawa 2011-05-23 19:02:48
哇。謝謝你的解釋。 :)我擔心我的perl有問題。 – kobame 2011-05-23 19:33:00