2011-01-14 14 views
12

मुझे विशेष HTTP सर्वर बनाने की आवश्यकता है, इसके लिए मैं एपोल सिकॉल का उपयोग करने की योजना बना रहा हूं, लेकिन मैं एकाधिक प्रोसेसर/कोर का उपयोग करना चाहता हूं और मैं आर्किटेक्चर समाधान के साथ नहीं आ सकता। एटीएम मेरा विचार followng है: अपने एपोल डिस्क्रिप्टर के साथ कई धागे बनाएं, मुख्य धागा कनेक्शन स्वीकार करता है और उन्हें थ्रेड एपोल के बीच वितरित करता है। लेकिन क्या कोई बेहतर समाधान है? उच्च लोड आर्किटेक्चर पर मैं कौन सी किताबें/लेख/गाइड पढ़ सकता हूं? मैं केवल C10K लेख देखा है, लेकिन उदाहरण के लिए सबसे अधिक लिंक मृत इस विषय :(पर कोई में गहराई से किताबें हैं :(और अभी भीसी: एपोल और मल्टीथ्रेडिंग

जवाब के लिए धन्यवाद

युपीडी:।। कृपया अधिक हो विशिष्ट, मैं सामग्री और उदाहरण (nginx एक उदाहरण है क्योंकि इसकी बहुत जटिल है और कई अमूर्त परतों कई सिस्टम का समर्थन करने के लिए नहीं है)।

+1

अरे डैनियल, मैं सोच रहा था कि यह कैसे साथ आ रहा था। मैं इस विषय में कुछ शोध कर रहा हूं और मेरा मानना ​​है कि इवेंट संचालित सर्वर की मेरी अवधारणा अभी थोड़ा कमजोर हो सकती है। मेरे ज्ञान के लिए, ऐसा लगता है कि अगर हमारे पास एक ईवेंट संचालित बैक एंड है (एपोल का उपयोग करके कहें) जिसे हर फंक्शन कहा जाता है, उसे अवरुद्ध करना पड़ता है ... शायद यह मेरा डिज़ाइन है, लेकिन प्रत्येक अनुरोध जो डेटाबेस कॉल करता है .. यदि वह कॉल किसी भी कारण से धीमा है, तो सभी अन्य क्लाइंट बनाने के अनुरोध भी एक ही समय में डेटाबेस प्रतिक्रिया के समाप्त होने की प्रतीक्षा के कारण पीड़ित हैं। मैं एक धागा बना सकता हूं .. उद्देश्य को हराता है। – Begui

+4

वास्तव में यह नहीं आ रहा है, यह लंबे समय से libev का उपयोग कर समाप्त हुआ :) कुछ फ़ंक्शन अभी भी मेरे ऐप में अवरुद्ध कर रहे हैं, बस उनका ब्लॉक समय वास्तव में छोटा है। लेकिन डेटाबेस क्वेरी जैसे I चीजें, I/o संचालन (विशेष रूप से जब वे वास्तव में गहन होते हैं) गैर-अवरुद्ध होना चाहिए। मेरे मामले में मैं अपने एसिंक-सक्षम ड्राइवर के साथ मोंगोडब का उपयोग कर रहा हूं इसलिए डीबी का उपयोग करते समय मेरे पास कोई अवरोध नहीं है। मेरे पास चीजों के लिए थ्रेड पूल हैं जो मैं एसिंक्रोनस (यानी छवि मैगिक इमेज प्रोसेसिंग और सीएसएस/जेएस मिनीमाइज़र) नहीं बना सकता, लेकिन वे कतारों के माध्यम से संचालित होते हैं और एपोल (स्वयं कतार कार्यान्वयन) द्वारा निगरानी रखे जाते हैं। – Daniel

उत्तर

11

जांच libevent और libev स्रोतों एक अच्छा बुनियादी सुविधाओं की जरूरत है। वे अत्यधिक पठनीय हैं, और पहले से ही उपयोग करें।

इसके अलावा, libev के दस्तावेज में कई कोशिश की और सच्ची रणनीतियों के कई उदाहरण हैं। भले ही आप सीधे epoll() पर लिखना पसंद करते हैं, उदाहरण कई अंतर्दृष्टि का कारण बन सकते हैं।

+0

धन्यवाद, पढ़ना चला गया। – Daniel

+0

जो मैं देखता हूं उससे libevent एकल-थ्रेडेड है, लेकिन बहुत ही कुशल है। libevent + multithreading उदाहरण एटीएम नहीं मिल सकता है, लेकिन प्रगति पर googling ... – Daniel

+1

हाँ, दोनों मल्टीथ्रेडिंग संभालती है, बहु-घटना-लूप टिप्पणियों की जांच करें। – Javier

12

..my विचार followng है: वर्णनकर्ता खुद epoll साथ एक से अधिक थ्रेड बनाने के लिए, मुख्य थ्रेड कनेक्शन स्वीकार करता है और धागे epoll के बीच उन्हें वितरित करता है।

हां वर्तमान में ऐसा करने का सबसे अच्छा तरीका है और यह है कि निगेंक्स यह कैसे करता है। लोड और/या मशीन पर भौतिक कोर की संख्या के आधार पर धागे की संख्या में वृद्धि या कमी की जा सकती है।

अतिरिक्त धागे (भौतिक कोर की संख्या से अधिक) और घटनाओं के बीच व्यापार-विराम विलंबता और थ्रूपुट में से एक है। थ्रेड विलंबता में सुधार करते हैं क्योंकि वे संदर्भ स्विचिंग और थ्रेड सृजन/हटाना द्वारा किए गए ओवरहेड के कारण पूर्व-निष्पादित रूप से निष्पादित कर सकते हैं लेकिन थ्रूपुट की कीमत पर। घटनाक्रम थ्रूपुट में सुधार करते हैं लेकिन नुकसान होता है कि लंबे समय से चलने वाले कोड पूरे थ्रेड को रोकते हैं।

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

तीसरा सबसे अच्छा लाइटटैड या नोड.जे.एस. जैसे अकेले असीमित घटना प्रसंस्करण है। ठीक है, अगर आप सर्वर में भारी प्रसंस्करण नहीं कर रहे हैं तो यह दूसरा सबसे अच्छा है। लेकिन जैसा कि पहले उल्लेख किया गया है, लूप एक पूरे लंबे समय तक चल रहा है जबकि लूप पूरे सर्वर को अवरुद्ध करता है।

-1

जब तक आपके पास एक टेराबिट अपलिंक नहीं है और एक सर्वर से 10000 एक साथ कनेक्शन की सेवा करने की योजना है, तो epoll भूल जाएं। यह सिर्फ अनावश्यक गैर पोर्टेबिलिटी है; poll या यहां तक ​​कि select भी वही करेगा। ध्यान रखें कि उस समय तक टेराबिट अपलिंक और मानक हैं, आपका सर्वर भी तेज़ होगा कि आपको अभी भी epoll की आवश्यकता नहीं होगी।

यदि आप केवल स्थिर सामग्री की सेवा कर रहे हैं, तो थ्रेड के बारे में भी भूल जाएं और लिनक्स sendfile syscall का उपयोग करें। यह भी गैर मानक है, लेकिन कम से कम यह वास्तविक वास्तविक दुनिया के प्रदर्शन लाभ प्रदान करता है।

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

+0

सर्वर हेवन ' 2005 से काफी तेज रहा है। 4GHz (या वहां) स्पष्ट रूप से सीमा है। – slebetman

+1

मैंने अभी भी 'एपोल' के लिए एक ठोस तर्क नहीं देखा है, केवल 'लोकलहोस्ट' बेंचमार्किंग और इस तरह के बहुत सारे। और मैंने इसे पसंद नहीं करने के कई कारण देखे हैं: सभी प्रकार के लोग जो 'एपोल' (और इस प्रकार केवल लिनक्स पर काम करते हैं) लिखते हैं, जब उन्हें केवल 2-10 फाइल डिस्क्रिप्टरों से निपटने की आवश्यकता होती है ... –

+0

I वास्तव में स्थानीयहोस्ट पर परीक्षण करें :) लेकिन फिर भी, मैं libevent2 के साथ खेल रहा हूं और उसने मुझे ~ 10k आर/एस और 100% कोर लोड दिया है, इसलिए मैं सोच रहा हूं कि अगर मैं थ्रेडिंग जोड़ दूंगा तो यह कम से कम सक्षम होगा 20-25k अनुरोध (4 कोर बॉक्स पर), इसलिए मैं अभी भी थ्रेडिंग के साथ खेलना चाहता हूं। – Daniel