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 veplackup -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ükselterekplackup 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 enstarman
- 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
"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
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
vay. Açıklama için teşekkür ederim. :) Benim perl ya da benzeri bir sorun var korkuyordu. – kobame