मेरे पास यह सरल पीएसजीआई एप्लिकेशन (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
"plackup - स्मृति के उपयोग के पहले 3 अनुरोध पर ऊपर उठाने और अगले 997 अनुरोधों के लिए स्थिर रहना है" इसका मतलब है कि कुछ मॉड्यूल आलसी-लोडेड पहले कुछ अनुरोध कर रहे हैं। उसके बाद कोई रिसाव नहीं है। – miyagawa
Starman डिफ़ॉल्ट रूप से जीवित-रखें और HTTP पाइपलाइनिंग, जिसका अर्थ है यदि आप समय की छोटी सी अवधि में 1000 अनुरोध भेजने के आप इन कनेक्शन, जुड़ा हुआ होगा जब तक आप स्पष्ट उन्हें डिस्कनेक्ट सक्षम बनाता है। मैं ApacheBench का उपयोग करके इसकी पुष्टि कर सकता हूं - स्मृति अस्थायी रूप से बढ़ जाती है, लेकिन जब वे डिस्कनेक्ट/टाइमआउट करते हैं, तो स्मृति उस स्थान पर गिर जाती है जहां यह था। – miyagawa
वाह। विवरण के लिए आपका धन्यवाद। :) मुझे डर था कि मुझे अपने पर्ले के साथ कोई समस्या है या नहीं। – kobame