2011-05-23 9 views
5

मेरे पास यह सरल पीएसजीआई एप्लिकेशन (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 द्वारा बढ़ा रहा है, लेकिन धीमी दर के साथ

सवाल यह है:

  • क्यों स्मृति उपयोग बढ़ा रहा है? रिसाव कहां है, और निरंतर स्मृति उपयोग (विशेष रूप से स्टर्मन पर) कैसे प्राप्त होता है, क्योंकि मैं लंबे समय तक स्मृति से बाहर नहीं निकलना चाहता हूं। (ठीक है, उदाहरण के लिए यह संभव है परिभाषित करें - मैक्स-अनुरोध 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 - धीमी दर (3280-> 3912)

संस्करण में भी 5 कार्यकर्ताओं को ऊपर उठाने, लेकिन डिफ़ॉल्ट के साथ:

# 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 - स्मृति के उपयोग के पहले 3 अनुरोध पर ऊपर उठाने और अगले 997 अनुरोधों के लिए स्थिर रहना है" इसका मतलब है कि कुछ मॉड्यूल आलसी-लोडेड पहले कुछ अनुरोध कर रहे हैं। उसके बाद कोई रिसाव नहीं है। – miyagawa

+2

Starman डिफ़ॉल्ट रूप से जीवित-रखें और HTTP पाइपलाइनिंग, जिसका अर्थ है यदि आप समय की छोटी सी अवधि में 1000 अनुरोध भेजने के आप इन कनेक्शन, जुड़ा हुआ होगा जब तक आप स्पष्ट उन्हें डिस्कनेक्ट सक्षम बनाता है। मैं ApacheBench का उपयोग करके इसकी पुष्टि कर सकता हूं - स्मृति अस्थायी रूप से बढ़ जाती है, लेकिन जब वे डिस्कनेक्ट/टाइमआउट करते हैं, तो स्मृति उस स्थान पर गिर जाती है जहां यह था। – miyagawa

+0

वाह। विवरण के लिए आपका धन्यवाद। :) मुझे डर था कि मुझे अपने पर्ले के साथ कोई समस्या है या नहीं। – kobame

उत्तर

4

miyagava की टिप्पणियों के आधार पर जवाब है:

"plackup - स्मृति के उपयोग पहले 3 अनुरोध पर ऊपर उठाने और अगले के लिए निरंतर रहने के है 997 अनुरोध " इसका मतलब है कि कुछ मॉड्यूल आलसी-लोडेड पहले कुछ अनुरोध कर रहे हैं। उसके बाद कोई रिसाव नहीं है। - Miyagawa 14 घंटे पहले

Starman डिफ़ॉल्ट रूप से जीवित-रखें और HTTP पाइपलाइनिंग,, यदि आप छोटी अवधि के समय की आप इन कनेक्शन जुड़ा होगा 1000 अनुरोध भेजने के अर्थ जब तक आप स्पष्ट उन्हें डिस्कनेक्ट सक्षम बनाता है । स्मृति अस्थायी रूप से बढ़ जाती है, लेकिन जब वे डिस्कनेक्ट/टाइमआउट, स्मृति, जहां यह था करने के लिए नीचे हो जाता है - मैं इस ApacheBench का उपयोग कर इस बात की पुष्टि कर सकते हैं। - मियागावा 14 घंटे पहले

thanx।

1

क्या आपने नवीनतम संस्करण का उपयोग किया था? मैं आपके आउटपुट को पुन: उत्पन्न नहीं कर सकता।

[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 
"STARMAN" के साथ

:

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

संस्करण:
पर्ल: 5.12

"plackup" के साथ

। 1 & 5.12।3
Plack: 0.9979
Starman: 0,2010

+0

हाँ होना अच्छा रहेगा जो: Plack अप टू डेट है। (0.9 9 7 9) और स्टर्मन केवल 0.2008 था, लेकिन अपग्रेड के बाद परिणाम एक ही है ... – kobame

+0

क्या आपका पर्ल उचित रूप से अद्यतित है? – phaylon

+0

अभी तक 5.14 है। यह पर्ल 5, संस्करण 12, सबवर्सन 3 (v5.12.3) – kobame

संबंधित मुद्दे