2013-05-16 4 views
5

लिनक्स पर एक उच्च नेटवर्क गहन सर्वर अनुप्रयोग विकसित करने के लिए, किस प्रकार की वास्तुकला को प्राथमिकता दी जाती है? विचार यह है कि यह ऐप आमतौर पर कई कोर (या तो आभासी या भौतिक) वाली मशीनों पर चलता है। यह मानते हुए कि प्रदर्शन मुख्य मानदंड है, क्या यह बहु-थ्रेडेड एप्लिकेशन या मल्टी-प्रोसेस डिज़ाइन वाले किसी के लिए जाना बेहतर है? मुझे पता है कि कई प्रक्रियाओं से ऐसे संसाधनों तक पहुंच के लिए संसाधनों और सिंक्रनाइज़ेशन का साझा करना बहुत सारे प्रोग्रामिंग ओवरहेड है, लेकिन जैसा कि पहले बताया गया है कि समग्र प्रदर्शन मुख्य आवश्यकता है और इसलिए हम उन चीजों को अनदेखा कर सकते हैं। और प्रोग्रामिंग भाषा सी/सी ++ होगी।प्रदर्शन - मल्टीथ्रेड या मल्टीप्रोसेस अनुप्रयोग

मैंने सुना है कि बहु-थ्रेडेड एप्लिकेशन (एकल प्रक्रिया) कई कोर का लाभ उठा सकते हैं और प्रत्येक थ्रेड को अलग-अलग कोर पर स्वतंत्र रूप से चला सकते हैं (जब तक कोई सिंक समस्या नहीं होती है)। और यह शेड्यूलिंग कर्नेल द्वारा किया जाता है। यदि हां, तो बहु-थ्रेडेड अनुप्रयोगों और बहु-प्रक्रिया अनुप्रयोगों के बीच प्रदर्शन में बहुत अंतर नहीं है? Nginx एक बहु-प्रक्रिया आर्किटेक्चर का उपयोग करता है और वास्तव में तेज़ है, लेकिन क्या बहु-थ्रेडेड अनुप्रयोगों के साथ एक ही प्रदर्शन प्राप्त कर सकता है?

धन्यवाद।

उत्तर

3

लिनक्स पर प्रक्रियाएं और धागे एक-दूसरे के समान हैं - मुख्य अंतर यह है कि संपूर्ण वर्चुअल मेमोरी साझा की जाती है और सिग्नल हैंडलिंग जैसी कुछ चीजें अलग-अलग होती हैं।

यह धागे के बीच सस्ता संदर्भ स्विच (महंगा एमएमयू रीलोड इत्यादि की आवश्यकता नहीं) के लिए बनाता है लेकिन गति में विशेष रूप से थ्रेड सृजन के बाहर बहुत अंतर नहीं होता है।

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

ऐसी स्थितियों में पेश आ रही समस्याओं के बारे में एक प्रसिद्ध writeup कि "C10k समस्या", http://www.kegel.com/c10k.html से उपलब्ध है - यह अलग आई/ओ दृष्टिकोण का वर्णन करता है, तो थोड़ा दिनांकित होने के बावजूद, यह एक बहुत अच्छा परिचय है।

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

+0

@ पी-एल: आपके उत्तर के लिए धन्यवाद। हां, योजना नेटवर्क आधारित घटनाओं के आधार पर भी आधारित वास्तुकला और कार्य का उपयोग करना है। और रनटाइम के दौरान कोई अतिरिक्त धागे और प्रक्रियाएं नहीं बनाई जाती हैं। यह देखते हुए, क्या आप बहु-थ्रेडेड और बहु-प्रक्रिया अनुप्रयोगों के बीच कोई प्रदर्शन अंतर नहीं देखते हैं? उदाहरण के लिए: यदि 4 कोर कहने वाला कोई सिस्टम है, तो आर्किटेक्चर दोनों के बीच प्रदर्शन में कोई ध्यान देने योग्य नहीं होगा? – sthustfo

+0

सबसे बड़ा संभव अंतर शेड्यूलिंग में होगा, और इसे कार्य के सीपीयू एफ़िनिटी के साथ संशोधित किया जा सकता है, प्रत्येक कार्य (थ्रेड/प्रक्रिया) को विशिष्ट सीपीयू में पिन करना। सर्वर प्रक्रिया द्वारा किए गए वास्तविक कार्यों और नेटवर्क हिस्से के साथ यह कैसे इंटरैक्ट करता है, उससे अधिक अंतर हो सकते हैं। स्मृति से कैसे पहुंचा जा सकता है इससे संबंधित मतभेद हो सकते हैं, लेकिन NUMA सिस्टम पर सामान्य रूप से स्मृति साझा करने के लिए धागे/प्रक्रिया अंतर से कम संबंधित - हालांकि यह संभव है कि मौजूदा कर्नेल को विभिन्न NUMA में कोड सेगमेंट की प्रतिलिपि बनाने के लिए समर्थन मिले जोन (उनके पास कर्नेल के लिए अतीत में ही था)। –

1

यदि आपके धागे एक दूसरे से स्वतंत्र काम कर रहे हैं, लिनक्स के तहत, इसके बजाय कई प्रक्रियाओं के साथ नहीं जाने का कोई कारण नहीं है। कई प्रक्रियाएं आपके मेमोरी उपयोग को बढ़ाएंगी क्योंकि प्रत्येक प्रक्रिया में अपनी निजी मेमोरी स्पेस होती है, लेकिन दूसरी तरफ स्वतंत्र धागे के बीच मेमोरी स्पेस साझा करना बुरा निर्णय होता है। धागे बनाम प्रक्रियाओं के बीच संदर्भ स्विचिंग आमतौर पर धागे की बजाय प्रक्रियाओं के लिए बेहतर होती है हालांकि इसका थोड़ा सा आर्किटेक्चर और कोड निर्भर होता है। लॉक और म्यूटेक्स एसएस के साथ क्रमबद्ध नहीं होने के लिए प्रक्रियाएं सुरक्षित हैं। लिनक्स में प्रक्रियाओं का प्रबंधन और बातचीत करना आसान है। यहां एक अच्छा दस्तावेज़ है जो आपको दिलचस्प लगेगा (http://elinux.org/images/1/1c/Ben-Yossef-GoodBadUgly.pdf)।

+0

दस्तावेज़ के संदर्भ के लिए धन्यवाद, बहुत उपयोगी है। मेरा मानना ​​है कि धारणाएं कि थ्रेड बहुत तेजी से विंडोज वातावरण से आती हैं जो स्क्रैच से पूरी प्रक्रियाएं बनाती हैं, लिनक्स फोर्क के विपरीत जो केवल ढेर को डुप्लिकेट करती है और शुरुआत में बच्चे और अभिभावक दोनों प्रक्रियाएं समान स्मृति खंड साझा करती हैं। मुझे लगता है कि कोड, जब तक एक निष्पादन कॉल नहीं किया जाता है, तब तक सभी बाल प्रक्रियाओं और अभिभावकों के बीच साझा किया जाता है। – CyberFonic

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