2009-01-03 34 views
13

मेरे पास क्लाइंट और सर्वर प्रोग्राम हैं जो अब टीसीपी के माध्यम से संवाद करते हैं। मैं इसके बजाए POSIX संदेश कतारों का उपयोग करने का प्रयास कर रहा हूं (ऐसे मामलों में जहां क्लाइंट और सर्वर एक ही मशीन पर हैं)। मेरी आशा है कि यह प्रदर्शन में सुधार करेगा (विशेष रूप से कम विलंबता के माध्यम से)।टीसीपी सॉकेट के बजाय POSIX संदेश कतारों का उपयोग करना - "कनेक्शन" कैसे स्थापित करें?

मैंने इसमें से अधिकांश काम किया है, लेकिन मुझे एक चीज़ के बारे में निश्चित नहीं है: "कनेक्शन" कैसे स्थापित करें। सर्वर तो मैं TCP कनेक्शन का अनुकरण करने की तो जैसे प्रक्रिया की स्थापना के लिए परीक्षा रहा हूँ, समवर्ती एकाधिक ग्राहकों से कनेक्शन स्वीकार करता है:

  1. सर्वर लगातार इसे से एक प्रसिद्ध नाम के साथ एक कतार खोलता है और पढ़ता है (यह select(2) उपयोग कर सकते हैं टीसीपी के साथ)।
  2. ग्राहक तीन कतार खोलता है: मनमानी नामों के साथ दो (कुछ विशिष्टता सहित पीआईडी ​​जैसे टकराव से बचने के लिए), और सर्वर द्वारा उपयोग किए जाने वाले जाने-माने नाम के साथ।
  3. ग्राहक ग्राहक की कतार में एक "कनेक्ट" संदेश पोस्ट करता है, जिसमें ग्राहक के कतार नाम शामिल हैं (एक क्लाइंट-टू-सर्वर ट्रैफ़िक के लिए नामित है और दूसरा बातचीत के लिए)।
  4. सर्वर क्लाइंट के कनेक्ट संदेश में नामित कतार खोलता है और क्लाइंट-टू-सर्वर एक से पढ़ना (चयन) शुरू करता है।
  5. क्लाइंट प्रसिद्ध नाम के साथ सर्वर कतार को बंद कर देता है। क्लाइंट द्वारा नामित दो कतारों का उपयोग करके दो-तरफा संचार आय (प्रत्येक दिशा के लिए एक)।

आप शायद देख सकते हैं कि यह योजना आम टीसीपी विधि के समान कैसे है, और यह कोई दुर्घटना नहीं है। हालांकि, मैं जानना चाहता हूं:

  1. क्या आप इसे करने का बेहतर तरीका सोच सकते हैं?
  2. क्या आप मेरी विधि के साथ कोई संभावित समस्याएं देखते हैं?
  3. क्या आपके पास कोई अन्य विचार है, जिसमें एक ही मशीन पर टीसीपी की बजाय संदेश कतारों का उपयोग करने की संभावना शामिल है, वास्तव में प्रदर्शन (विलंबता) में सुधार होगा?

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

उत्तर

6

मैं यह मूल रूप से लागू करने के रूप में मैं वर्णित है, कुछ संवर्द्धन के साथ समाप्त हो गया:

  • चरण 2 में, मैं कतार नामों के लिए GUIDs इस्तेमाल किया बजाय ग्राहक की पीआईडी ​​शामिल ।
  • चरण 4 में, मैंने सर्वर से क्लाइंट से "स्वीकार" संदेश भेजने को जोड़ा।
  • जब कोई भी पक्ष संचार समाप्त करना चाहता है, तो यह "डिस्कनेक्ट" संदेश भेजता है।

हैंडशेकिंग टीसीपी से सरल है, लेकिन पर्याप्त लगता है।

विलंबता के लिए: यह बहुत बेहतर है। उसी मशीन पर टीसीपी के बजाय POSIX संदेश कतारों का उपयोग करके लगभग 75% कम विलंबता। मेरे संदेश प्रत्येक 100 बाइट्स के क्रम में हैं।

7
  1. आप यह करने के लिए एक बेहतर तरीका है के बारे में सोच सकते हैं?

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

  2. क्या आप मेरी विधि के साथ कोई संभावित समस्याएं देखते हैं?

    सिस्टम वी संदेश कतार और फीफो नामित पाइप बिल्कुल ठीक हैं। फीफो पाइप नियमित पाइप की तरह हैं ताकि आप न्यूनतम कोड परिवर्तनों के साथ() और लिख सकें() पढ़ सकें।सिस्टम वी संदेश कतारों को डेटा को संरचना में डालने और msgstr "() का आविष्कार करने की आवश्यकता होती है। हालांकि या तो दृष्टिकोण ठीक होगा।

  3. क्या आपके पास कोई अन्य विचार है, जिसमें एक ही मशीन पर टीसीपी की बजाय संदेश कतारों का उपयोग करने की संभावना शामिल है, वास्तव में प्रदर्शन (विलंबता) में सुधार होगा?

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

    मुझे नहीं पता कि कौन सी तकनीक आपको अपने सॉफ़्टवेयर में सबसे इष्टतम थ्रूपुट प्रदान करती है। यह वास्तव में सिस्टम वी संदेश कतारों का उपयोग करने लायक नहीं हो सकता है लेकिन केवल आप ही निर्णय ले सकते हैं।

Philluminati

+0

आप कहते हैं कि मेरे "प्रश्न में कोई बदलाव नहीं है कि आप यह परिवर्तन क्यों कर रहे हैं।" मैंने इसका जिक्र किया: प्रदर्शन (विलंबता)। क्या सिस्टम वी संदेश पंक्तियों को POSIX से कार्यक्षमता में अलग करता है? जो पॉज़िक्स मैं उपयोग कर रहा हूं (उदा। Mq_open (3)) आपके द्वारा उल्लेख किए गए "चुनिंदा" संदेशों का समर्थन नहीं करते हैं। –

+0

मैंने अब नामित पाइप का उपयोग करने का प्रयास किया है। वे POSIX संदेश कतारों की तुलना में धीमे (कम से कम छोटे संदेश पास करने के लिए) धीमे हैं। –

0

संदेश कतारों पर चयन नहीं करते समय आप यह कैसे करते हैं? क्या यह Sys वी या POSIX है? पीआईडी ​​लुकअप टेबल पर GUID बनाने में अतिरिक्त प्रयास क्यों करें जब पीआईडी ​​अद्वितीय होने की गारंटी है, और छोटा भंडारण (पूर्णांक) है?

/Blee/

+0

यह वास्तव में मेरे उत्तर पर एक टिप्पणी होना चाहिए। वैसे भी: चयन करें POSIX संदेश कतारों के साथ काम करता है, जो मैं उपयोग कर रहा हूं। पीआईडी ​​लुकअप टेबल के लिए कोई GUID नहीं है - GUID प्रक्रियाओं के बीच संवाद किया जाता है और पीआईडी ​​का कभी भी उपयोग नहीं किया जाता है। पीआईडी ​​अद्वितीय नहीं हैं - वे ज्यादातर प्रणालियों पर पुनर्नवीनीकरण कर रहे हैं। –

1

मैं वही समस्या मिले हैं, मैं वास्तविक समय आवेदन को विकसित करने और सॉकेट कार्यक्षमता और न्यूनतम विलंबता के लिए इसी तरह के साथ भारतीय दंड संहिता तकनीक की जरूरत है।

क्या आपने यूनिक्स स्थानीय सॉकेट या टीसीपी सॉकेट के साथ अपने POSIX-MQ आधारित समाधान की तुलना की है?

धन्यवाद

+1

मैंने उन्हें टीसीपी (उसी मशीन पर, निश्चित रूप से) और नामित पाइप (फीफो) के साथ तुलना की। एमक्यू उन दोनों की तुलना में तेज़ था। मैंने यूनिक्स डोमेन सॉकेट की तुलना नहीं की, लेकिन जब आप करते हैं तो परिणाम सुनना निश्चित रूप से होगा! –

3

मैं POSIX MQ के प्रदर्शन और टीसीपी/आईपी सॉकेट की एक जोड़ी की तुलना में।

डेमो प्रोग्राम में लेखन के लिए दो धागे हैं और दूसरा पढ़ने के लिए है।

परिणाम,

  • MQ 460000 टीपीएस
  • 400000 टीपीएस
-1

तुम भी प्रोग्राम हैं जो विभिन्न मशीनों पर निवास में भारतीय दंड संहिता के लिए संदेश कतार का उपयोग कर सकते socketpair, कि POSIX MQ तेजी से होता है है ऐसे मामलों में आप ज़ीरोएमक्यू (http://www.zeromq.org) या अन्य संदेश कतार API का उपयोग कर सकते हैं, मैं आपको उन पर विचार करने और उन्हें भी परीक्षण करने का सुझाव देता हूं।