2011-12-09 13 views
16

मैं Google प्रोटोकॉल बफर संदेशों को भेजने के लिए एक बेहद कुशल टीसीपी क्लाइंट चाहता हूं। मैं सर्वर/क्लाइंट विकसित करने के लिए नेटटी लाइब्रेरी का उपयोग कर रहा हूं।उच्च प्रदर्शन कैसे लिखें नेटी क्लाइंट

परीक्षणों में सर्वर प्रति सेकंड 500k लेनदेन को संभालने में सक्षम होता है, बिना किसी समस्या के, लेकिन ग्राहक प्रति सेकंड 180k लेन-देन की चोटी पर जाता है।

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

क्या मेरा ग्राहक एकाधिक चैनल बनाए रखता है, या क्या मुझे एक चैनल के साथ उच्च थ्रूपुट प्राप्त करने में सक्षम होना चाहिए?

+2

समय वास्तव में * ध्वनि * क्लाइंट की प्रतिक्रिया के लिए इंतजार कर रहा है ... बस एक विचार - क्योंकि यह काफी सरल सेवा की तरह लगता है, क्या आपने कच्चे सॉकेट का उपयोग करने की कोशिश की है? –

+1

अगर किसी ने इस तरह के क्लाइंट के लिए समस्या हल की है, तो क्या आप कृपया क्लाइंट कोड साझा कर सकते हैं उदाहरण के लिए नेटटी संस्करण किस प्रकार उपयोग करता है? वर्तमान में मैं संस्करण परिवर्तन –

उत्तर

17

1) यदि ग्राहक केवल भेजने, प्राप्त करने में नहीं में रुचि रखता है, तो आप हमेशा की तरह नीचे

channel.setReadable(false); 

2) आप प्रवाह क्षमता बढ़ा सकते हैं चैनल से पढ़ने बहुत आसानी से प्रति कई ग्राहक चैनलों होने से अक्षम कर सकते हैं ग्राहक, और यह भी स्केल कर सकते हैं।

3) और आप (पढ़ें/लिखें के लिए सामान्य रूप में प्रदर्शन में सुधार करने के लिए) में तोड़ मरोड़ निम्न कर सकते हैं

  • इसके OrderdMemoryAwareThreadPoolExecutor के साथ एक EXecutionHandler, जोड़कर pipline की तरह एक SEDA के लिए बेहतर (न्यूनतम के साथ, इष्टतम मूल्य के साथ अधिकतम चैनल स्मृति)

    bootstrap.setPipelineFactory(new ChannelPipelineFactory() { 
        @Override 
        public ChannelPipeline getPipeline() throws Exception { 
         return Channels.pipeline(
           executionHandler1,//sharable 
           new MessageDecoderHandler(), 
           new MessageEncoderHandler(), 
           executionHandler2,//sharable 
           new BusinessLogicHandler1(), 
           new BusinessLogicHandler2()); 
        } 
    }); 
    
  • इष्टतम मूल्य (करने के लिए चैनल की writeBufferHighWaterMark स्थापना सुनिश्चित करें कि एक बड़ा मान सेट भीड़ नहीं बनाएगा करें)

    bootstrap.setOption("writeBufferHighWaterMark", 10 * 64 * 1024);

  • SO_READ, SO_WRITE बफर आकार

    bootstrap.setOption("sendBufferSize", 1048576); bootstrap.setOption("receiveBufferSize", 1048576);

  • टीसीपी को सक्षम करने से कोई देरी स्थापना

    bootstrap.setOption("tcpNoDelay", true);

+0

धन्यवाद के साथ अटक गया हूं, प्वाइंट 2 पर एक प्रश्न)। ऐसा करने का सबसे अच्छा तरीका क्या है, क्या मुझे कई चैनल बनाना चाहिए, और अनुरोधों को संसाधित करने के लिए किसी प्रकार की कार्यकर्ता कतार में हैंडलर रखना चाहिए? – Dave

+0

@ डेव इस जवाब पर एक नज़र डालें कि क्लाइंट एकाधिक कनेक्शन का उपयोग कैसे कर सकता है http://stackoverflow.com/a/7905761/596720 – Abe

+0

मुझे पता चला है कि 'सेट रीडेबल (झूठा)' शायद आपके पास एक अच्छा विचार नहीं है यह जानने का एक तरीका है कि रिमोट एंड चैनल को पढ़ने की कोशिश किए बिना डिस्कनेक्ट हो गया है।रिमोट एंड लटका हुआ है जब 'पढ़ें() 'रिटर्न' -1'। –

3

मैं अगर यकीन नहीं है "tcpNoDelay "सुधार करने में मदद करता है थ्रूपुट प्रदर्शन में सुधार करने के लिए देरी है। कोई भी कम नहीं, मैंने कोशिश की और देखा कि थ्रूपुट वास्तव में 90% से अधिक गिर गया है।

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