2009-01-21 36 views
6

मैं apache 1.3.41 perl संस्करण 5.8.6 के साथ mod perl 1.3.0 का उपयोग कर रहा हूं, और स्मृति आकार प्रत्येक तीसरे या चौथे अनुरोध के बारे में 4k बढ़ने लगता है। पर्ल स्क्रिप्ट हम चल रहे हैं बस है:मैं mod_perl मेमोरी रिसाव को कैसे ट्रैक करूं?

print "Content-type: text/html\n\n"; print "baby"; 

फिर भी है कि अपाचे प्रक्रिया अभी बढ़ता है और बढ़ता है जब हम अपाचे बेंचमार्क के साथ यह स्लैम। हम साथ यह मार रहे हैं:

ab -n 100000 -c 1 http://localhost/search/search.cgi &> /dev/null 

और हम देखते हैं के रूप में इस प्रक्रिया को आकार 20000 के बारे में अनुरोध के बाद 24 के बारे में 4 मेगाबाइट से बढ़ता है।

नीचे दिए गए प्रश्न का उत्तर देने के लिए: हम इसे redhat Enterprise 4.7 पर कर रहे हैं। इसे इस तरह से अलग किया गया है क्योंकि हमने एक स्थिर फ़ाइल, या सीधे सीजीआई अनुरोध मारा और स्मृति बढ़ती नहीं है। जब हम एक पर्लहैंडलर अपाचे :: रजिस्ट्री या पर्लरुन का उपयोग करते हैं, या केवल पर्लहैंडलर को कुछ कोड पर इंगित करते हैं जो हैंडलर है, तो वे सभी रिसाव करते हैं।

किसी ने भी ऐसा कुछ देखा, या पता है कि क्या चल रहा है?

संपादित करें:

उत्तर लोगों के लिए धन्यवाद। मैंने डेवेल :: साइकिल का उपयोग किया है और एक रिसाव पाया है, लेकिन यहां मुद्दा यह है कि हमने हेडर और एक कथन मुद्रित करने के लिए हमारे कोड को तोड़ दिया है। पर्ल लीक में प्रिंट फ़ंक्शन का कोई तरीका नहीं है (मुझे उम्मीद है ....)। प्रैक्टिकल मॉडपरल में मेमोरी लीक सेक्शन मैंने पढ़ा है, लेकिन यह कोडिंग समस्याओं से संबंधित है, और फिर जब तक कि पर्ल के प्रिंट फ़ंक्शन के साथ कोई समस्या न हो, यह कोड नहीं है।

+0

आप इसे एक ठोस प्रश्न में तैयार करने पर विचार कर सकते हैं। :) – sharkin

+0

आप अपाचे लोगों को एक बग रिपोर्ट पोस्ट करने पर भी विचार कर सकते हैं। –

+0

क्या आप ओएस के विवरण पोस्ट कर सकते हैं जिस पर आप काम कर रहे हैं? क्या आपने प्रक्रिया को तब तक चलने की कोशिश की है जब तक यह स्मृति सीमा तक न पहुंच जाए और आपको अपने सर्वर को पुनरारंभ करना होगा? असल में मैं क्या जानना चाहता हूं कि आपने यह कैसे चुना है कि यह केवल इस मॉड्यूल के साथ स्मृति रिसाव है? –

उत्तर

1

यदि संभव हो, तो अपना कोड डेवेल :: साइकिल के साथ चलाएं। संभावना है कि आपके पास में कुछ कोड मेमोरी लीक है, जो आपके कोड है, विशेष रूप से mod_perl में नहीं।

एक बार जब आप मेमोरी लीक (ओं) में स्थित हो जाते हैं - तो कई हो सकते हैं - उन्हें ठीक करें।

3

चूंकि आप एक प्रिंट स्टेटमेंट पर हैं, तो क्या आप वाकई किसी अन्य मॉड्यूल को लोड नहीं कर रहे हैं? किसी और के कोड में एक रिसाव हो सकती है जिसे आप लोड कर रहे हैं।

आप क्या मिलता है जब आप चलाने के इस:

package My::Handler; 

use strict; 
use warnings 'all'; 
use Data::Dumper; 

sub handler : method { 
    my ($class, $r) = @_; 

    print "content-type: text/html\n\n<plaintext>"; 
    print Dumper(\%INC); 
} 

1;# return true: 
0
$VAR1 = { 
    'XSLoader.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/XSLoader.pm', 
    'mod_perl.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/mod_perl.pm', 
    'warnings/register.pm' => '/usr/local/lib/perl5/5.8.6/warnings/register.pm', 
    'Apache/DBI.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/Apache/DBI.pm', 
    'List/Util.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/List/Util.pm', 
    'Test.pm' => '/home/jodonnell/fashion_2009//Test.pm', 
    'Apache/Server.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache/Server.pm', 
    'warnings.pm' => '/usr/local/lib/perl5/5.8.6/warnings.pm', 
    'DBI.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/DBI.pm', 
    'Config.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/Config.pm', 
    'bytes.pm' => '/usr/local/lib/perl5/5.8.6/bytes.pm', 
    'Carp.pm' => '/usr/local/lib/perl5/5.8.6/Carp.pm', 
    'Exporter/Heavy.pm' => '/usr/local/lib/perl5/5.8.6/Exporter/Heavy.pm', 
    'Scalar/Util.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/Scalar/Util.pm', 
    'vars.pm' => '/usr/local/lib/perl5/5.8.6/vars.pm', 
    'Exporter.pm' => '/usr/local/lib/perl5/5.8.6/Exporter.pm', 
    'strict.pm' => '/usr/local/lib/perl5/5.8.6/strict.pm', 
    'Apache.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache.pm', 
    'constant.pm' => '/usr/local/lib/perl5/5.8.6/constant.pm', 
    'overload.pm' => '/usr/local/lib/perl5/5.8.6/overload.pm', 
    'AutoLoader.pm' => '/usr/local/lib/perl5/5.8.6/AutoLoader.pm', 
    'Apache/Constants.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache/Constants.pm', 
    'Apache/Constants/Exports.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache/Constants/Exports.pm', 
    'Apache/Connection.pm' => '/usr/local/lib/perl5/site_perl/5.8.6/i686-linux/Apache/Connection.pm', 
    'DynaLoader.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/DynaLoader.pm', 
    'Data/Dumper.pm' => '/usr/local/lib/perl5/5.8.6/i686-linux/Data/Dumper.pm' 
}; 

की तरह मेरे लिए ये बातें सब अपाचे द्वारा लोड किए गए हैं लग रहा है।

+0

अपने httpd.conf की जांच करें। कुछ अपाचे :: डीबीआई और डीबीआई लोड हो रहा है। क्या कोई अन्य कोड निष्पादित कर रहा है जिसे आप जानते नहीं हैं? – JDrago

+0

इसके अलावा - कृपया अपना उत्तर संपादित करें ताकि टेक्स्ट एकाधिक लाइनों पर हो। – JDrago

+0

मैंने http conf को पूरी तरह से जांच लिया है और सब कुछ अनजान को हटाने का प्रयास किया है, लेकिन मैंने अपने परिवर्तनों को वापस कर दिया है, इसलिए यह यहां परिलक्षित नहीं होता है। मैं यह समझ नहीं पाया कि इसे कई लाइनें कैसे बनाएं, मैं फिर कोशिश करूंगा – jacob

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