2011-05-23 20 views
5

Bu basit PSGI uygulamasına sahibim (app.psgi).Neden plackup (veya starman) bellek kullanımını yükseltiyorsunuz?

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 ]]; 
}; 

Yukarıda 1000 kez talep edildi ve bellek kullanımı artırıldı. sunucuyu başlatıldı şekline bağlı olarak, var:

  • plackup - bellek kullanımı ilk 3 istekleri de yükselterek ve

  • plackup -r sonraki 997 istekleri için sabit kalır - en (bellek kullanımı rastgele yükselttiğini değil her istek) 4 k.

  • starman -, bellek kullanımı rastgele yavaş oranıyla ancak, 4k tarafından yükselttiğini yukarıdaki gibi

soru şudur:

  • NEDEN bellek kullanımını yükseltiyor? Sızıntı nerede ve sürekli bellek kullanımı (özellikle starman) nasıl elde edilir, çünkü uzun vadede bellek bitti istemiyorum. (Tamam, mesela --max-request 100'ü tanımlamak mümkündür), ancak bellek kullanımı için bir cevap değildir.
  • veya - örneğimde sorun nedir?

kimse de bunu test isterseniz - burada getiriliyor için benim senaryom:

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; 
} 

Benim sonuçları:

  • neden plackup

    yılında yükselterek

    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 
    

    Yani, İlk 3 istekleri?

  • plackup -r - 4k artış (son satırları bakınız) - çok daha başlamadan en
  • starman - daha düşük bir hızda (3280-> 3912)

versiyonları içinde, ancak varsayılan ile çok 5 işçiyi yükselterek:

# 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 - ilk 3 istekte bellek kullanımı artırılıyor ve sonraki 997 istekleri için sabit kalıyor" Bu, bazı modüllerin ilk birkaç istekte tembel yüklü olduğu anlamına gelir. Bundan sonra sızıntı yok. – miyagawa

+2

Starman varsayılan olarak canlı tutma ve HTTP pipeline etmeyi sağlar, yani eğer 1000 bağlantıyı kısa bir süre içinde gönderirseniz, bu bağlantıları açık bir şekilde koparmadıkça, bu bağlantılara bağlanırsınız. ApacheBench'i kullanarak bunu onaylayabilirim - bellek geçici olarak artar, ancak bağlantıyı keserken/zaman aşımına uğradığında, bellek bulunduğuna gider. – miyagawa

+0

vay. Açıklama için teşekkür ederim. :) Benim perl ya da benzeri bir sorun var korkuyordu. – kobame

cevap

4

miyagava yorumlarına dayanarak cevap:

"plackup - bellek kullanımı ilk 3 istekleri de yükselterek ve bir sonraki için sabit kalır edilir 997 istek "Bu, bazı modüllerin ilk birkaç istekte tembel yüklendiği anlamına gelir. Bundan sonra kaçak yok. - Miyagawa 14 saat önce varsayılan olarak

Starman size bağlı bu bağlantıları gerekecek kısa süre 1000 istekleri göndermek eğer onları kesmek sürece açıkça , yani canlı tutma ve HTTP pipelining sağlar . Bu ApacheBench kullanarak bu onaylayabilirim - bellek geçici olarak artar, ancak bağlantı kesme/zaman aşımı olduğunda, bellek olduğu yere düşer. - miyagawa 14 saat önce

thanx.

1

En son sürümü kullandınız mı? Çıktınızı üretemiyorum. "Plackup -r" ile

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

: "starman" ile

[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 

sürümleri:
Perl: 5.12 "plackup" ile

. 1 & 5.12.3
Plack: 0,9979
Starman: 0,2010

+0

Evet: Plak güncel. (0.9979) ve starman sadece 0.2008 idi, ancak yükseltme sonrasında sonuç aynı ... – kobame

+0

Perl'iniz makul bir şekilde güncel mi? – phaylon

+0

henüz 5.14 var. Bu perl 5, sürüm 12, subversion 3 (v5.12.3) – kobame

İlgili konular