2011-05-23 37 views
5

我有這個簡單的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 
+3

「plackup - 內存使用量在前三個請求中增加,並在接下來的997個請求中保持不變」這意味着某些模塊在前幾個請求中被延遲加載。之後,沒有泄漏。 – miyagawa 2011-05-23 18:48:39

+2

Starman默認情況下啓用保持活動和HTTP流水線,這意味着如果您在短時間內發送1000個請求,則會將這些連接連接起來,除非您明確斷開連接。我可以使用ApacheBench來確認這一點 - 內存暫時增加,但是當它們斷開/超時時,內存會下降到原來的位置。 – miyagawa 2011-05-23 19:02:48

+0

哇。謝謝你的解釋。 :)我擔心我的perl有問題。 – kobame 2011-05-23 19:33:00

回答

4

基於miyagava的評論答案是:

「plackup - 內存使用率提高在 第3級的要求和保持不變 下一個997個請求「這意味着 某些模塊在 的前幾個請求中被延遲加載。之後有 沒有泄漏。 - 宮川15小時前

接龍默認啓用保活 和HTTP管線,這意味着如果你 在短期內 的時候,你就會有這些連接 連接發送1000個請求,除非你明確 斷開它們。我可以使用ApacheBench確認這個 - 內存 暫時增加,但是當它們 斷開/超時時,內存得到 降到原來的位置。 - miyagawa 14 小時前

thanx。

1

使用最新版本?我無法重現您的輸出。

隨着 「plackup」:

[email protected]:~/perl/plack$ ./memory.pl 
req# mem 
1 5340 
2 5380 

隨着 「plackup -r」:

[email protected]:~/perl/plack$ ./memory.pl 
req# mem 
1 4860 
2 5060 

隨着 「星人」:

[email protected]:~/perl/plack$ ./memory.pl 
req# mem 
1 5176 
5 5224 
6 5176 
7 5224 

版本:
的Perl:5.12。 1 & 5.12。3
普拉克:0.9979
接龍:0.2010

+0

是:Plack是最新的。 (0.9979) 和starman只有0.2008,但升級後的結果是一樣的... – kobame 2011-05-23 14:49:54

+0

Perl是否合理最新? – phaylon 2011-05-23 14:52:47

+0

還沒有5.14。這是Perl 5,版本12,Subversion 3(v5.12.3) – kobame 2011-05-23 14:56:03