2008-12-11 16 views
5

मैंने आईओ :: सॉकेट :: आईएनईटी का उपयोग कर पर्ल के साथ क्लाइंट-सर्वर प्रोग्राम बनाया है। मैं सीजीआई आधारित साइट के माध्यम से सर्वर का उपयोग करता हूं। मेरा सर्वर प्रोग्राम डेमॉन के रूप में चलाएगा और एकाधिक एक साथ कनेक्शन स्वीकार करेगा। मेरी सर्वर प्रक्रिया लगभग 100 एमबी मेमोरी स्पेस (9 बड़े सरणी, कई सरणी ...) का उपभोग करती है। मैं चाहता हूं कि इन हैंश को स्मृति में रहें और उन्हें साझा करें ताकि मुझे उन्हें हर कनेक्शन के लिए बनाना न पड़े। हैश निर्माण में 10-15 सेकंड लगते हैं।बड़े मेमोरी उपयोग के साथ पर्ल डिमन के भीतर मैं एकाधिक सॉकेट कैसे संभाल सकता हूं?

जब भी सॉकेट के माध्यम से कोई नया कनेक्शन स्वीकार किया जाता है, तो मैंने प्राप्त प्रत्येक कनेक्शन के लिए प्रसंस्करण की देखभाल करने के लिए एक नई प्रक्रिया को फोर्क किया। चूंकि माता-पिता की प्रक्रिया बहुत बड़ी है, हर बार जब मैं कांटा, प्रोसेसर एक नए बच्चे को स्मृति आवंटित करने की कोशिश करता है, लेकिन सीमित स्मृति के कारण, एक नए बच्चे को जन्म देने में बड़ा समय लगता है, जिससे प्रतिक्रिया समय बढ़ जाता है। कई बार यह एक कनेक्शन के लिए भी लटकता है।

अभिभावक प्रक्रिया 9 बड़े हैंश बनाता है। प्रत्येक बच्चे के लिए, मुझे केवल एकमात्र हैश को रीड-ओनली मोड में संदर्भित करने की आवश्यकता है। मैं बच्चे के माध्यम से हैश अपडेट नहीं करूंगा। मैं कॉपी-ऑन-राइट जैसे कुछ का उपयोग करना चाहता हूं, जिसके द्वारा मैं पूरे 100 एमबी या पूरे बच्चे के साथ माता-पिता द्वारा बनाए गए पूरे वैश्विक चर साझा कर सकता हूं? या थ्रेड जैसे किसी भी अन्य तंत्र। मुझे उम्मीद है कि सर्वर प्रति सेकेंड न्यूनतम 100 अनुरोध प्राप्त करेगा और यह उन सभी को समानांतर में संसाधित करने में सक्षम होना चाहिए। औसतन, एक बच्चा 2 सेकंड में बाहर निकल जाएगा।

मैं केवल 1 जीबी रैम के साथ विंडोज एक्सपी पर सिग्विन का उपयोग कर रहा हूं। मुझे इस मुद्दे को दूर करने का कोई रास्ता नहीं मिल रहा है। क्या आप कुछ सुझाव दे सकते हैं? मैं चर को कैसे साझा कर सकता हूं और प्रति सेकंड 100 बाल प्रक्रियाएं भी बना सकता हूं और उन्हें प्रबंधित कर सकता हूं और उन्हें सिंक्रनाइज़ कर सकता हूं,

धन्यवाद।

उत्तर

3

फोर्किंग के बजाय समवर्ती कनेक्शन को संभालने के लिए दो अन्य दृष्टिकोण हैं। या तो आप धागे या मतदान दृष्टिकोण का उपयोग करते हैं।

प्रत्येक कनेक्शन के लिए थ्रेड दृष्टिकोण में एक नया धागा बनाया जाता है जो सॉकेट के I/O को संभालता है। एक धागा बनाने की प्रक्रिया के समान वर्चुअल मेमोरी में चलता है और इसके सभी डेटा तक पहुंच सकता है। अपने डेटा पर लिखने के उपयोग को सिंक्रनाइज़ करने के लिए ताले का सही ढंग से उपयोग करना सुनिश्चित करें।

चयन() के माध्यम से मतदान का उपयोग करने के लिए एक और अधिक कुशल दृष्टिकोण है। इस मामले में एक एकल प्रक्रिया/थ्रेड सभी सॉकेट को संभालती है। यह धारणा के तहत काम करता है कि अधिकतर काम I/O होगा और यह कि समय समाप्त होने के लिए आई/ओ अनुरोधों के इंतजार के साथ समय व्यतीत होता है, अन्य सॉकेट को संभालने में खर्च किया जाता है।

उन दो विकल्पों पर आगे बढ़ें और निर्णय लें कि कौन सा सबसे अच्छा है।

उदाहरण के लिए देखें: http://www.perlfect.com/articles/select.shtml

2

आप अधिक डेटा, मुझे आश्चर्य है कि क्यों आप बस एक डेटाबेस का उपयोग नहीं करते है, तो?

2

यह आर्किटेक्चर सिगविन के लिए अनुपयुक्त है। असली यूनिक्स सिस्टम पर फोर्किंग सस्ता है, लेकिन सिग्विन जैसे नकली यूनिक्स सिस्टम पर यह बहुत महंगा है, क्योंकि सभी डेटा की प्रतिलिपि बनाई जानी चाहिए (असली यूनिट कॉपी-ऑन-राइट का उपयोग करें)। धागे का उपयोग स्मृति उपयोग पैटर्न (उच्च आधार उपयोग, लेकिन प्रति थ्रेड में छोटी वृद्धि) को बदलता है, लेकिन बाधाएं अभी भी अक्षम हैं।

मैं सलाह देता हूं कि आप मतदान का उपयोग करके एकल प्रक्रिया दृष्टिकोण का उपयोग करें, और शायद गैर-अवरुद्ध आईओ भी।

+0

क्या पर्ल के फोर्क का नकली विंडोज संस्करण एक ही प्रक्रिया में एक थ्रेड नहीं है? यह मुझे हाल ही में थोड़ा सा है और यही मुझे पढ़ना याद है। –

+0

हां, वे दोनों Win32 थ्रेड के रूप में लागू किए गए हैं, लेकिन एक नकली प्रक्रिया को एक पर्ल परिप्रेक्ष्य से एक ithread के रूप में लागू नहीं किया जाता है। –

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