2011-04-18 16 views
6

मैं परीक्षण उद्देश्यों के लिए अपने रेडिस पर कुछ भारी भार लगाने की कोशिश कर रहा था और किसी भी ऊपरी सीमा का पता लगा रहा था। सबसे पहले मैंने इसे 32,000 अक्षरों के आकार के साथ 32,000 अक्षरों के 50,000 और 100,000 कुंजी के साथ लोड किया। यह दोनों प्रमुख आकारों में 8-15 सेकंड से अधिक नहीं लिया। अब मैं प्रत्येक कुंजी के लिए 4 केबी डेटा को मूल्य के रूप में रखने की कोशिश करता हूं। पहले 10000 कुंजी सेट करने के लिए 800 मिली सेकंड लेते हैं। लेकिन उस बिंदु से यह धीरे-धीरे धीमा हो जाता है और पूरे 50,000 कुंजियों को सेट करने में 40 मिनट लगते हैं। मैं node_redis (Mranney) के साथ नोडजेज़ का उपयोग कर डेटाबेस लोड कर रहा हूं। क्या कोई गलती है जो मैं कर रहा हूं या रेडिस बस आकार 4 के बड़े मूल्यों के साथ धीमा है?रेडिस प्रदर्शन के मुद्दों?

एक और चीज जो मुझे मिली है, वह तब है जब मैं वर्तमान क्लाइंट के समानांतर एक और क्लाइंट चलाता हूं और अपडेट करता हूं कि यह दूसरा क्लाइंट 8 सेकंड के भीतर 500k कुंजी को 4kb मानों के साथ लोड करता है जबकि पहला क्लाइंट अभी भी इसकी चीज़ हमेशा के लिए करता है। क्या यह नोड या रेडिस लाइब्रेरी में एक बग है? यह उत्पादन के लिए खतरनाक और स्वीकार्य नहीं है।

+0

क्या आप किराए पर ले रहे हैं? – generalhenry

+0

हम्म .. मैंने किराए पर रखा है लेकिन मुझे नहीं पता कि यह प्रोग्राम में स्वचालित रूप से लोड हो जाता है जब मुझे आवश्यकता होती है ('redis')। क्या यह मुद्दा है? – Lalith

+0

यह सत्यापित करने के लिए कि क्या आपके पास किराए पर रखा गया मॉड्यूल स्थापित है, आप नोड चला सकते हैं, और फिर 'आवश्यकता ("किराए पर") '। –

उत्तर

5

आपको नोड से रेडिस में थोक लिखने के लिए कुछ प्रकार का पिछला दबाव प्राप्त करने की आवश्यकता होगी। डिफ़ॉल्ट रूप से, नोड सभी लिखने के लिए कतारबद्ध होगा और आउटगोइंग कतार आकार पर ऊपरी बाउंड लागू नहीं करेगा।

node_redis में एक "नाली" घटना है जिसे आप कुछ प्राथमिक बैक प्रेशर को लागू करने के लिए सुन सकते हैं।

+0

हाय मैट, मैंने client.command_queue.length को देखने की कोशिश की और मुझे "नाली" घटना मिलने तक रोक दिया। लेकिन client.command_queue.length हमेशा 0 है। इसलिए मैं क्लाइंट.ऑफलाइन_क्यू.लेन्थेंस की जांच कर रहा था जो मुझे उचित संख्या देता है लेकिन नाली की घटना केवल एक बार निकाल दी जाती है। मैं इसे फिर से कोशिश करूंगा और कोड के साथ वापस आऊंगा। धन्यवाद। – Lalith

+0

मैंने संलग्न किया है यहां कोड https://gist.github.com/945441 है। यह बैप्रप्रेसर का उचित तरीका प्रतीत नहीं होता है? – Lalith

+2

यहां कुछ अलग-अलग मुद्दे हैं।पहला यह है कि प्री-कनेक्शन कमांड कतारबद्ध हैं। दूसरा यह है कि एक बार आपके पास कनेक्शन होने के बाद, भेजे गए आदेशों के लिए एक और कतार बनाए रखा जाता है, जिसके लिए एक उत्तर अभी तक प्राप्त नहीं हुआ है। मैंने यहां दोनों मामलों से निपटने के लिए एक सामान्य तरीके का एक उदाहरण जोड़ा है: https://github.com/mranney/node_redis/blob/master/examples/backpressure_drain.js –

3

डिफ़ॉल्ट रेडिस कॉन्फ़िगरेशन उस प्रकार के उपयोग के लिए अनुकूलित नहीं है। मुझे संदेह है कि आपने 32 बाइट्स के पेज आकार के साथ डिस्क पर स्वैप किया है, जिसका अर्थ है कि प्रत्येक कुंजी को 128 निशुल्क मुक्त पृष्ठ मिलना पड़ता है और सिस्टम वीएम का उपयोग करके समाप्त हो सकता है या स्वैप फ़ाइल का विस्तार करने की आवश्यकता हो सकती है।

जब आप कोई कुंजी अपडेट करते हैं, तो स्थान पहले ही आवंटित किया जाता है ताकि आपको कोई प्रदर्शन समस्या दिखाई न दे।

+0

यह केवल परीक्षण उद्देश्यों के लिए है इसलिए मुझे ज्यादा परवाह नहीं है। लेकिन क्या होगा यदि वास्तविक समय में ऐसी मांग होती है और मेरे आवेदन को इतना डेटा स्टोर करने की आवश्यकता है? क्या मेरी आवश्यकता से मेल खाने के लिए कोई विन्यास बदल सकता है? – Lalith

+0

पहले ग्राहक ने सभी 50000 कुंजी बनाने से पहले भी यदि मैं दूसरे क्लाइंट को चलाता हूं तो यह आगे बढ़ता है और पहले से पहले समाप्त होता है। तो आपने जो कहा वह समस्या नहीं हो सकती है। – Lalith

+3

पेज आकार और मेमोरी उपयोग कॉन्फ़िगर करने योग्य हैं - redis.conf में टिप्पणियों की जांच करें। दूसरा क्लाइंट परिष्करण आवश्यक रूप से उस परिदृश्य को रद्द नहीं करता है - कम स्मृति स्थितियों और समेकन का संयोजन काफी जटिल हो सकता है, खासकर यदि टाइमआउट और स्वचालित रीट्री शामिल हैं। उदाहरण के लिए, क्या यह हर पिछली कुंजी को हर बार त्रुटि में चलाए जा सकता है? –

0

चूंकि मैं नोडजेस में बहुत से सेट (कुंजी मान) कर रहा था जो असीमित रूप से किया जाता है, बहुत सारे सॉकेट कनेक्शन समवर्ती रूप से खुले होते हैं। नोडजेस सॉकेट लिखने वाला बफर ओवरलोड हो सकता है और जीसी नोड प्रक्रिया के साथ आ सकता है और खराब हो सकता है।

पीएस: मैंने टॉम के सुझाव के रूप में रेडिस मेमोरी कॉन्फ़िगरेशन बदल दिया लेकिन यह अभी भी वही प्रदर्शन कर रहा था।

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