2009-12-18 8 views
5

हमारे पास एक वेब सेवा है जो बड़ी एमपी 3 फ़ाइलों की एक निश्चित सूची के छोटे, मनमाने ढंग से खंडों की सेवा करती है। एमपी 3 फाइलें एक अजगर आवेदन द्वारा ऑन-द-फ्लाई उत्पन्न होती हैं। मॉडल है, एक यूआरएल को एक जीईटी अनुरोध दें जो निर्दिष्ट करता है कि आप कौन से सेगमेंट चाहते हैं, प्रतिक्रिया में audio/mpeg स्ट्रीम प्राप्त करें। यह एक महंगी प्रक्रिया है।क्या HTTP पर एक महंगी, अवरुद्ध पायथन प्रक्रिया के परिणामों की सेवा करने का कोई बेहतर तरीका है?

हम Nginx का उपयोग फ्रंट एंड अनुरोध हैंडलर के रूप में कर रहे हैं। Nginx सामान्य अनुरोधों के लिए कैशिंग प्रतिक्रियाओं का ख्याल रखता है।

हमने शुरू में नर्गिनक्स से अनुरोधों को संभालने के लिए बैकडोडो का उपयोग करने की कोशिश की। जैसा कि आप उम्मीद करेंगे, अवरुद्ध एमपी 3 ऑपरेशन ने टोरनाडो को अपनी चीज (एसिंक्रोनस I/O) करने से रोक दिया था। तो, हम multithreaded गए, जो अवरोधन समस्या हल किया, और काफी अच्छा प्रदर्शन किया। हालांकि, इसने एक सूक्ष्म दौड़ की स्थिति (असली दुनिया के भार के तहत) पेश की है कि हम अभी तक निदान या पुन: उत्पन्न करने में सक्षम नहीं हैं। दौड़ की स्थिति हमारे एमपी 3 आउटपुट को दूषित करती है।

इसलिए हमने अपाचे/mod_wsgi (अभी भी w/Nginx ऊपर सामने) के पीछे एक सरल डब्लूएसजीआई हैंडलर के रूप में अपना आवेदन सेट करने का निर्णय लिया। यह अवरुद्ध करने की समस्या और दौड़ की स्थिति को समाप्त करता है, लेकिन वास्तविक दुनिया की स्थितियों के तहत सर्वर पर एक कैस्केडिंग लोड बनाता है (यानी अपाचे बहुत अधिक प्रोसेसर बनाता है)। हम अभी अपाचे/mod_wsgi ट्यूनिंग पर काम कर रहे हैं, लेकिन फिर भी एक परीक्षण-और-त्रुटि चरण में। (अपडेट करें: हमने टोरनाडो में वापस स्विच किया है। नीचे देखें।)

अंत में, प्रश्न: क्या हम कुछ याद कर रहे हैं? HTTP पर सीपीयू-महंगे संसाधनों की सेवा करने का कोई बेहतर तरीका है?

अद्यतन: ग्राहम के सूचित आलेख के लिए धन्यवाद, मुझे पूरा यकीन है कि यह एक अपाचे ट्यूनिंग समस्या है। मध्य समय में, हम टोरनाडो का उपयोग करने के लिए वापस चले गए हैं और डेटा भ्रष्टाचार के मुद्दे को हल करने की कोशिश कर रहे हैं।

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

उत्तर

1

क्या आप अपाचे/mod_wsgi के एम्बेडेड मोड का उपयोग करने की गलती कर रहे हैं? पढ़ें:

http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html

आप अपाचे/mod_wsgi का उपयोग कर यदि डेमॉन मोड का उपयोग सुनिश्चित करें।

+0

उत्कृष्ट लेख। धन्यवाद। यह चाल चल रहा है। –

+0

असल में, मैं इस लिंक को सबसे अच्छे उत्तर के रूप में स्वीकार करने जा रहा हूं, क्योंकि समस्या अपाचे ट्यूनिंग समस्या प्रतीत होती है। –

1

आप AJAX अधिसूचना विधियों के साथ एक क्यूइंग सिस्टम पर विचार कर सकते हैं।

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

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

वेबपृष्ठ पीढ़ी की प्रगति का पता लगाने के लिए AJAX कॉल कर सकता है और फ़ाइल उपलब्ध होने के बाद एक लिंक दे सकता है।

इस प्रकार बड़ी मीडिया साइटें काम करती हैं - जिन्हें विशेष रूप से वीडियो से निपटना होता है। हालांकि यह आपके एमपी 3 काम के लिए अधिक हो सकता है।

वैकल्पिक रूप से, भार वितरित करने के लिए कुछ मशीनों को चलाने में देखें। अपाचे पर आपके थ्रेड अभी भी ब्लॉक होंगे, लेकिन कम से कम आप वेब सर्वर पर संसाधनों का उपभोग नहीं करेंगे।

+0

हम बड़ी एमपी 3 फ़ाइलों की एक निश्चित सूची के छोटे, मनमाना सेगमेंट की सेवा कर रहे हैं। मॉडल है, एक यूआरएल को एक जीईटी अनुरोध दें जो निर्दिष्ट करता है कि आप कौन से सेगमेंट चाहते हैं, प्रतिक्रिया में 'ऑडियो/एमपीईजी' स्ट्रीम प्राप्त करें, इसलिए AJAX काम नहीं करेगा। :) –

+1

ठीक है, तो हम वापस मेरे दूसरे बिंदु पर हैं: लोड वितरित करें। लिनक्स मशीन सस्ते हैं। –

0

ऐसा लगता है कि आप सही काम कर रहे हैं - केवल CPU पावर की कमी: क्या आप यह निर्धारित कर सकते हैं कि इन एमपी 3 को उत्पन्न करने की प्रक्रिया में सीपीयू लोडिंग क्या है?

मुझे लगता है कि आपको अगली चीज़ों को एमपी 3 को अन्य मशीनों पर प्रस्तुत करने के लिए और अधिक हार्डवेयर जोड़ना है। या वह प्री-रेंडर एमपी 3 वितरित करने का कोई तरीका ढूंढ सकता है (शायद आप अपने कुछ मीडिया को देख सकते हैं?)

बीटीडब्लू, वेब के लिए स्केलिंग इस वर्ष पीकॉन ब्रासिल पर जैकब कपलन-मॉस द्वारा एक मुख्य व्याख्यान का विषय था , और यह एक बंद समस्या होने से बहुत दूर है। प्रौद्योगिकियों के ढेर को संभालने की जरूरत है - (मुझे प्रस्तुति के लिए ऑनलाइन प्रतिलिपि नहीं मिल सका, हालांकि - इसके लिए क्षमा करें)

+0

जब हम टोरनाडो से सेवा कर रहे थे तो हमें निश्चित रूप से अधिक हार्डवेयर की आवश्यकता नहीं थी। समस्या बस अपाचे को ट्यून कर सकती है। –

2

क्या आपने Spawning को आजमाया है? यह थ्रेडिंग मोड के लचीले वर्गीकरण के साथ एक डब्लूएसजीआई सर्वर है।

+0

दिलचस्प। मुझे इसमें देखना होगा। –

1

कृपया "कैस्केडिंग लोड" को परिभाषित करें, क्योंकि इसका कोई सामान्य अर्थ नहीं है।

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

इस तरह के लोड के लिए, सुनिश्चित करें कि आप प्रीफ़र्क एमपीएम का उपयोग कर रहे हैं, और सुनिश्चित करें कि आप स्वयं को प्रक्रियाओं की एक उचित संख्या तक सीमित कर रहे हैं (प्रति CPU एक से कम नहीं, दो से अधिक नहीं)।

+0

"कैस्केडिंग लोड" से मेरा मतलब है कि अपाचे प्रक्रियाओं को खराब कर रहा था। Obfuscation के लिए खेद है। ग्राहम का लिंक स्थिति को अच्छी तरह से समझाता है। –

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

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