क्या हम ठीक से कतारबद्ध और क्रमबद्ध हैं?


13

हम विभिन्न सेवाओं के माध्यम से संदेशों को संसाधित करते हैं (एक संदेश शायद 9 सेवाओं को छूने से पहले होगा, प्रत्येक एक विशिष्ट IO- संबंधित फ़ंक्शन कर रहा है)। अभी हमारे पास प्रदर्शन के लिए सबसे खराब स्थिति (XML डेटा अनुबंध क्रमांकन) और सर्वश्रेष्ठ-केस (इन-मेमोरी MSMQ) का संयोजन है।

संदेश की प्रकृति का अर्थ है कि हमारा क्रमबद्ध डेटा लगभग 12-15 किलोबाइट समाप्त हो जाता है, और हम प्रति सप्ताह लगभग 4 मिलियन संदेशों को संसाधित करते हैं। MSMQ में लगातार संदेश हमारे लिए बहुत धीमे थे, और जैसे-जैसे डेटा बढ़ता है हम MSMQ की मेमोरी मैप की गई फाइलों से दबाव महसूस कर रहे हैं। सर्वर 16GB मेमोरी के उपयोग और बढ़ते हुए, सिर्फ कतार के लिए है। मेमोरी का उपयोग अधिक होने पर प्रदर्शन भी प्रभावित होता है, क्योंकि मशीन स्वैप करना शुरू कर देती है। हम पहले से ही MSMQ स्व-सफाई व्यवहार कर रहे हैं।

मुझे लगता है कि एक हिस्सा है जो हम यहाँ गलत कर रहे हैं। मैंने मेसेज को जारी रखने के लिए रैवेनडीबी का उपयोग करने की कोशिश की और सिर्फ एक पहचानकर्ता को कतार में खड़ा किया, लेकिन वहां प्रदर्शन बहुत धीमा था (1000 संदेश प्रति मिनट, सबसे अच्छा)। मुझे यकीन नहीं है कि अगर यह विकास संस्करण या क्या उपयोग करने का परिणाम है, लेकिन हमें निश्चित रूप से उच्चतर थ्रूपुट [1] की आवश्यकता है। सिद्धांत में अवधारणा ने बहुत अच्छा काम किया लेकिन प्रदर्शन कार्य तक नहीं था।

उपयोग पैटर्न में एक राउटर के रूप में एक सेवा कार्य होता है, जो सभी को पढ़ता है। अन्य सेवाएं अपने तृतीय पक्ष हुक के आधार पर जानकारी संलग्न करेंगी, और राउटर पर वापस भेज देंगी। अधिकांश वस्तुओं को 9-12 बार छुआ जाता है, हालांकि लगभग 10% को इस प्रणाली में थोड़ी देर के लिए लूप करने के लिए मजबूर किया जाता है जब तक कि 3 पार्टियां उचित रूप से जवाब नहीं देती हैं। अभी सेवाएं इसके लिए जिम्मेदार हैं और इसमें उपयुक्त नींद का व्यवहार है, क्योंकि हम इस कारण से संदेश के प्राथमिकता वाले क्षेत्र का उपयोग करते हैं।

तो, मेरा सवाल यह है कि सी # / विंडोज वातावरण में असतत-लेकिन-लान्ड मशीनों के बीच गुजरने वाले संदेश के लिए एक आदर्श स्टैक क्या है? मैं सामान्य रूप से XML क्रमांकन के बजाय BinaryFormatter के साथ शुरू करूंगा, लेकिन यह एक खरगोश छेद है अगर एक बेहतर तरीका दस्तावेज़ संग्रह के लिए क्रमांकन को ऑफ़लोड करना है। इसलिए, मेरा सवाल।

[१]: हमारे व्यवसाय की प्रकृति का अर्थ है जितनी जल्दी हम संदेशों को संसाधित करते हैं, उतने ही अधिक पैसे कमाते हैं। हमने अनुभवजन्य रूप से साबित कर दिया है कि सप्ताह में बाद में एक संदेश को संसाधित करने का मतलब है कि हम उस पैसे को बनाने की संभावना कम है। जबकि "1000 प्रति मिनट" का प्रदर्शन बहुत तेज़ लगता है, हमें वास्तव में 10k / मिनट के ऊपर की संख्या की आवश्यकता होती है। सिर्फ इसलिए कि मैं प्रति सप्ताह संदेशों में नंबर दे रहा हूं इसका मतलब यह नहीं है कि हमारे पास उन संदेशों को संसाधित करने के लिए एक पूरा सप्ताह है।

=============== संपादित करें:

अतिरिक्त जानकारी

टिप्पणियों के आधार पर, मैं कुछ स्पष्टीकरण जोड़ूंगा:

  • मुझे यकीन नहीं है कि क्रमबद्धता हमारी अड़चन है। मैंने एप्लिकेशन को बेंचमार्क किया है, और जबकि सीरियलाइज़ेशन हीट ग्राफ में दिखाई देता है, यह केवल सेवा के CPU उपयोग के 2.5-3% के लिए जिम्मेदार है।

  • मैं ज्यादातर अपने संदेशों की स्थायित्व और MSMQ के संभावित दुरुपयोग के बारे में चिंतित हूं। हम गैर-ट्रांजेक्शनल, गैर-निरंतर संदेशों का उपयोग कर रहे हैं ताकि हम कतारबद्ध प्रदर्शन को बनाए रख सकें, और मैं वास्तव में कम से कम लगातार संदेश देना चाहूंगा ताकि वे एक रिबूट से बचे रहें।

  • अधिक रैम जोड़ना एक स्टॉपगैप उपाय है। मशीन पहले से ही 4GB -> 16GB RAM से जा चुकी है और इसे और अधिक जोड़ना जारी रखने के लिए इसे लेना कठिन और कठिन होता जा रहा है।

  • आवेदन के स्टार रूटिंग पैटर्न के कारण, एक वस्तु के आधे समय पॉप होने के बाद एक कतार में धकेल दिया जाता है जो बिल्कुल भी नहीं बदलता है। यह खुद को फिर से (IMO) उधार देता है और इसे किसी प्रकार के कुंजी-मूल्य स्टोर में कहीं और संग्रहीत करता है और केवल संदेश पहचानकर्ता को पास करता है।

  • स्टार रूटिंग पैटर्न एप्लिकेशन का अभिन्न अंग है और यह परिवर्तित नहीं होगा। हम इसे सेंटीपीड नहीं कर सकते, क्योंकि हर टुकड़ा रास्ते में अतुल्यकालिक रूप से (एक पोलिंग फैशन में) संचालित होता है और हम एक ही स्थान पर रिट्रीट व्यवहार को केंद्रीकृत करना चाहते हैं।

  • अनुप्रयोग तर्क C # में लिखा गया है, ऑब्जेक्ट अपरिवर्तनीय POCOs हैं, लक्ष्य परिनियोजन वातावरण Windows Server 2012 है, और हमें अतिरिक्त मशीनों को खड़ा करने की अनुमति दी जाती है यदि किसी विशेष सॉफ़्टवेयर का केवल लिनक्स में समर्थन किया जाता है।

  • मेरा लक्ष्य स्मृति पदचिह्न को कम करते हुए और पूंजी के न्यूनतम परिव्यय के साथ दोष सहिष्णुता को बढ़ाते हुए वर्तमान थ्रूपुट को बनाए रखना है।


संबंधित बिंदुओं को प्रश्न में शामिल किए जाने पर टिप्पणियों को साफ किया गया था।
ChrisF

यह कतार की सबसिस्टम स्वैपिंग के बारे में चिंता करने से पहले सबसे अधिक दबाव वाली समस्या को हल करने के लिए समझ में आता है (हालांकि यह अभी भी अंततः करने लायक हो सकता है)। तथ्य यह है कि स्मृति नियंत्रण से बाहर हो रही है, यह बताता है कि अभी भी कहीं न कहीं लीक हैं। क्या (यदि कोई हो) मेमोरी प्रोफाइलिंग की गई है?
दान ल्यों

@ डॅनलीन्स: एकमात्र मेमोरी ग्रोथ MSMQ में है। कोई भी वास्तव में इसके बारे में बात नहीं करता है, लेकिन ऐसा लगता है कि गैर-लगातार संदेशों के कारण होता है जो सभी मेमोरी-मैपेड हैं। चूंकि हम बहुत सारे डेटा को क्रमबद्ध कर रहे हैं, यह स्मृति की पर्याप्त मात्रा को आवंटित करता है। मैसेज का उपभोग किया जाता है और अंततः MSMQ की आंतरिक सफाई होती है।
ब्रायन बोएचर

जवाबों:


1

यहां कुछ कतार बेंचमार्क हैं, जिनमें आपकी रुचि हो सकती है। MSMQ को प्रति सेकंड 10K संदेशों को संभालने में सक्षम होना चाहिए। क्या यह एक कॉन्फ़िगरेशन समस्या हो सकती है या शायद क्लाइंट कतार को पढ़ने के साथ नहीं रख रहे हैं? यह भी ध्यान दें कि ज़ीरो क्यूक्यू उन बेंचमार्क में कितना तेज है (लगभग 100K संदेश प्रति सेकंड), यह एक दृढ़ता विकल्प की पेशकश नहीं करता है, लेकिन यह आपको वहां पहुंचना चाहिए जहां आप प्रदर्शन बुद्धिमान होना चाहते हैं।


4

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

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

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

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

यदि आप रुचि रखते हैं, तो मैं VMQueueकक्षा स्रोत कोड साझा कर सकता हूं ताकि आप इसके साथ खेल सकें। कतार किसी भी वर्ग को स्वीकार करेगी जो कि सीरियल के रूप में चिह्नित है। कतार के निर्माण पर आप तत्वों की संख्या में पृष्ठ का आकार स्थापित करते हैं। वर्ग इंटरफ़ेस वस्तुतः एक मानक कतार वर्ग के समान है। हालांकि कोड बहुत पुराना है, (.net 1.1) इसलिए कोई भी सामान्य इंटरफ़ेस दुर्भाग्य से मौजूद नहीं है।

मुझे पता है कि सिद्ध MSMQ तकनीक से आगे बढ़ना एक बहुत बड़ा दांव है, हालाँकि यह कतार लगभग 6 वर्षों से मज़बूती से काम कर रही है और हमें उन परिदृश्यों से बचने और उबरने की अनुमति दे रही है जहाँ निर्माता मशीन कई हफ्तों से ऑफ़लाइन है! कृपया मुझे सूचित करें यदि आपकी रूचि हो। :)


1

HP ProLiant ML350G5 सिस्टम 82k लेनदेन प्रति मिनट मिलता है - अर्थात इसमें 8x से अधिक "10k / मिनट" का उल्लेख किया गया है।

प्रदर्शन: 82,774 tpmC

इसके अलावा, ईमानदार होने के लिए, मैं सिर्फ 64 या 128 जीबी की रैम के साथ गया होगा - रैम सस्ता है। ग्रीनस्पून "थ्रो रैम इस पर" और "इसे अनुकूलित करने के लिए एक स्मार्ट एमआईटी-शिक्षित आदमी मिलता है" के बीच अंतर को इंगित करता है, और रैम जीतता है।

उन्होंने 64 जीबी रैम और ASP.NET पृष्ठों पर चलने वाली फ्रंट-एंड मशीनों की एक मुट्ठी भर SQL सर्वर मशीन के साथ समाप्त किया ... साइट, swaptree.com, 400,000 से अधिक उपयोगकर्ताओं (तेजी से बढ़ते) की अपनी वर्तमान सदस्यता को संभालती है कठिनाई के बिना...

नोट "मशीन पहले से ही 16 जीबी रैम तक चली गई है" काफी दूर है, एक लेख में एक सर्वर को इंगित किया गया है जो 64 जीबी रैम पर 400k उपयोगकर्ताओं को संभाल रहा था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.