2012-11-30 20 views
7

पृष्ठभूमिकुशल डिकोडिंग (पैकेट)

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

enter image description here

वास्तविक विचार एक बेहतर समाधान, तेजी से समानांतर और कुशल, एक डेटा एग्रीगेटर/भंडारण के रूप में प्रयोग की जाने वाली तैयार करना है।

आवश्यकताओं

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

  • इंटरैक्टिव डिकोडर: डिकोडिंग तर्क आसानी से क्रम में बदला जा सकता है वर्तमान डिजाइन के अनुसार पैकेट डिकोडर के कई जायके (dissectors) कर रहे हैं। प्रोटोकॉल डेवलपर्स के लिए ऐसा दृष्टिकोण काफी उपयोगी हो सकता है - डिकोडिंग गति महत्वपूर्ण नहीं है, लेकिन लचीलापन और तेज़ परिणाम अधिक महत्वपूर्ण हैं
  • एम्बेड करने योग्य डिकोडर्स: लाइब्रेरी के रूप में उपयोग किया जा सकता है। इस प्रकार का अच्छा प्रदर्शन होना चाहिए और सभी उपलब्ध CPUs और कोर
  • डीकोडर्स सेवा के रूप में उपयोग करने के लिए पर्याप्त लचीला रहें: एक स्वच्छ API के माध्यम से पहुंचा जा सकता है। इस प्रकार नस्ल प्रदर्शन और कार्यकुशलता का सबसे अच्छा प्रदान करना चाहिए

परिणाम

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

  • इंटरएक्टिव डिकोडर: ग्रूवी पर लागू
  • एम्बेड करने योग्य डिकोडर: जावा पर लागू
  • डिकोडर्स एक सेवा के रूप में: बिलाव + अनुकूलन + एम्बेड होने डिकोडर एक सर्वलेट में लिपटे (में द्विआधारी, एक्सएमएल आउट)

हल करने की समस्या

  • ग्रूवी अधिक शक्ति और सब कुछ करने के लिए तरीका प्रदान करता है, लेकिन इस विशेष मामले में अभिव्यक्ति की Lucks एक वृक्ष संरचना में
  • डिकोडिंग प्रोटोकॉल एक मृत अंत है - बहुत ज्यादा संसाधनों बस बर्बाद हो जाते हैं
  • मेमोरी की खपत कुछ हद तक है नियंत्रण करने के लिए मुश्किल है।ज्यादा भूमि के ऊपर (मुख्य रूप से कनेक्शन हैंडलिंग) को

मैं ठीक कर रहा हूँ हर जगह JVM का उपयोग कर रहा रूपरेखा के साथ कई अनुकूलन, लेकिन अभी भी खुश नहीं विभिन्न घंटियाँ और सीटी के साथ परिणाम

  • बिलाव अभी भी परिचय किया था? क्या आप प्रारंभिक लक्ष्य को प्राप्त करने के लिए कोई अन्य अच्छा और सुरुचिपूर्ण तरीका देखते हैं: अत्यधिक स्केलेबल और कुशल प्रोटोकॉल डिकोडर्स लिखने में आसानी से लिखना?

    प्रोटोकॉल, परिणामों का प्रारूप इत्यादि तय नहीं हैं।

  • +1

    क्या आप अपना प्रश्न संकीर्ण कर सकते हैं? यह अविश्वसनीय रूप से खुला है। मैं वास्तव में नहीं जानता कि आप किस प्रकार के उत्तरों की तलाश में हैं। –

    +0

    मैं @ जॉन कुगेलमैन से सहमत हूं, यह एक अच्छा सवाल हो सकता है, लेकिन जैसा कि कहा गया है कि यह बहुत व्यापक है। मैं जितना संभव हो उतना हटाने की कोशिश करता हूं और जो जानकारी आप वास्तव में पूछ रहे हैं उससे प्रासंगिक जानकारी रखने की कोशिश करते हैं (प्रोटोकॉल फ्रेम को डीकोड करने के बारे में)। आप अतिरिक्त सामानों और आपके असली प्रश्न के साथ केवल 1 वाक्य के बारे में बात करते हुए 4 पैरागफ और 2 बुलेट सूचियां खर्च करते हैं। – durron597

    +0

    मैंने मूल्यवान विवरण प्रदान करने और कुछ अन्य सामान हटाने के प्रश्न को संपादित किया है। कोई भी और एकमात्र समाधान नहीं है। कई या शायद बहुत सारे मूल्यवान उत्तरों का प्रस्ताव दिया जा सकता है, दिलचस्प अंतर्दृष्टि प्रदान करना, असामान्य तकनीकों का वर्णन करना और अच्छे वास्तुशिल्प समाधानों को हाइलाइट करना। –

    उत्तर

    7

    मैंने पाया कई संभावित सुधार:

    इंटरएक्टिव डिकोडर

    ग्रूवी अभिव्यक्ति बहुत ग्रूवी वाक्य रचना का विस्तार AST Transformations का उपयोग करके सुधार किया जा सकता। इसलिए डिकोडर्स को अभी भी अच्छा प्रदर्शन प्रदान करने के लिए सरल बनाना संभव होगा। एएसटी (सार सिंटेक्स ट्री के लिए खड़ा है) एक संकलन-समय तकनीक है।

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

    मैं पहिया अभी तक परिभाषित/एक प्रोटोकॉल संरचना का वर्णन करने के लिए एक भाषा शुरू एक नए अंदाज़ में नहीं करना चाहते हैं (यह ASN.1 है करने के लिए पर्याप्त है)।विचार कुछ तेजी से प्रोटोटाइप तकनीक प्रदान करने के लिए डीकोडर्स विकास को सरल बनाना है। असल में, किसी प्रकार का डीएसएल पेश किया जाना है।

    Further reading

    एम्बेड करने योग्य डिकोडर

    जावा कुछ अतिरिक्त भूमि के ऊपर लागू कर सकते हैं।

    enter image description here

    सच कहूं बोल रहा जावा को छोड़कर किसी भी अन्य विकल्प दिखाई नहीं देता: वहाँ है कि मुद्दे के समाधान के लिए कई पुस्तकालय हैं वें के लिए परत है एक सेवा के रूप

    डिकोडर्स

    कोई जावा इस परत पर की जरूरत है। अंत में मेरे पास जाने का अच्छा विकल्प है लेकिन कीमत काफी अधिक है। GWan वास्तव में अच्छा लग रहा है।

    enter image description here

    कुछ अतिरिक्त पोर्टिंग की आवश्यकता होगी, लेकिन यह निश्चित रूप से इसके लायक है।

    3

    यह समस्या कई उच्च-प्रदर्शन I/O कार्यान्वयन समस्याओं की समान विशेषता साझा करती प्रतीत होती है, जो कि स्मृति प्रतियों की संख्या प्रदर्शन पर हावी है। इस सिद्धांत से एसिंक्रोनस I/O के लिए स्कैटर-इकट्ठा इंटरफ़ेस पैटर्न का पालन करें। तितर-इकट्ठा होने के साथ, मेमोरी के ब्लॉक जगह पर संचालित होते हैं। जब तक प्रोटोकॉल डिकोडर्स बाइट स्ट्रीम के बजाए ब्लॉक स्ट्रीम को इनपुट के रूप में लेते हैं, तो आप बाइट स्ट्रीम एब्स्ट्रक्शन को संरक्षित करने के लिए चारों ओर मेमोरी चलने के बहुत सारे प्रदर्शन ओवरहेड को समाप्त कर देंगे। बाइट स्ट्रीम इंजीनियरिंग समय बचाने के लिए एक बहुत अच्छा अमूर्त है, लेकिन उच्च प्रदर्शन I/O के लिए इतना अच्छा नहीं है।

    संबंधित समस्या में, मैं केवल मूल प्रकार String के कारण JVM से सावधान रहूंगा। मैं नहीं कह सकता कि मैं कैसे परिचित हूं कि String को JVM में कार्यान्वित किया गया है, लेकिन मुझे लगता है कि स्मृति प्रतिलिपि किए बिना ब्लॉक सूची से स्ट्रिंग बनाने का कोई तरीका नहीं है। दूसरी तरफ, मूल प्रकार की स्ट्रिंग जो कर सकती थी, और जो JVM String के साथ अंतःक्रियात्मक रूप से अंतर को विभाजित करने का एक तरीका हो सकता है।


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

    +0

    स्ट्रिंग्स अक्सर लंबे समय तक रहने वाले पूल में प्रशिक्षित होते हैं, लेकिन हमेशा नहीं होते हैं। स्ट्रिंग्स को स्ट्रिंगबिल्डर (http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html) के साथ पूर्व-संयुक्त किया जा सकता है। – claj

    1

    नेटवर्क यातायात बढ़ रहा है (some analytics), इसलिए प्रति सेकंड अधिक से अधिक डेटा संसाधित करने की आवश्यकता होगी।

    इसे प्राप्त करने का एकमात्र तरीका अधिक CPU पावर का उपयोग करना है, लेकिन CPU आवृत्ति स्थिर है। केवल कोर की संख्या बढ़ रही है। ऐसा लगता है कि उपलब्ध कोर का उपयोग अधिक कुशलतापूर्वक और स्केल बेहतर करने का एकमात्र तरीका है।

    enter image description here

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