मैं लूपबैक (127.0.0.1) पर लिनक्स पर एक अनुकूलित जावा एनआईओ चयनकर्ता के साथ कुछ मानक कर रहा हूं।जावा एनआईओ चयनकर्ता न्यूनतम संभव विलंबता
मेरा परीक्षण बहुत सरल है:
- एक कार्यक्रम किसी अन्य प्रोग्राम है कि इसे वापस भेजने वाले और राउंड ट्रिप समय की जाती है के लिए गूँज के लिए एक यूडीपी पैकेट भेजता है। अगला पैकेट केवल तभी भेजा जाता है जब पिछला एक लगाया जाता है (जब यह लौटाता है)। बेंचमार्क किए जाने से पहले कुछ लाख संदेशों के साथ उचित गर्मजोशी से आयोजित किया जाता है। संदेश में 13-बाइट हैं (यूडीपी हेडर की गणना नहीं)।
राउंड ट्रिप समय मैं निम्नलिखित परिणाम प्राप्त के लिए:
- मिन समय: 13 माइक्रो
- औसत समय: 19 माइक्रो
- 75% प्रतिशतक: 18,567 nanos
- 90% प्रतिशत: 18,78 9 नैनो
- 99% प्रतिशत: 1 9, 184 नैनो
- 99.9% प्रतिशत: 1 9, 64 नैनो
- 99.99% प्रतिशतक: 19,310 nanos
- 99.999% प्रतिशतक: 19,322 nanos
लेकिन यहाँ पकड़ है कि मैं 1 लाख संदेशों कताई कर रहा हूँ।
- मिन समय:: 41 माइक्रो
- औसत समय: 160 माइक्रो
- 75% प्रतिशतक: 150,701 nanos
- 90% प्रतिशतक
अगर मैं केवल 10 संदेशों स्पिन मैं बहुत अलग परिणाम प्राप्त : 155,274 nanos
- 99% प्रतिशतक: 159,995 nanos
- 99.9% प्रतिशतक: 159,995 nanos ,210
- 99.99% प्रतिशतक: 159,995 nanos
- 99.999% प्रतिशतक: 159,995 nanos
मुझे सही अगर मैं गलत हूँ, लेकिन मुझे लगता है कि एक बार हम कताई NIO चयनकर्ता प्राप्त प्रतिक्रिया समय इष्टतम हो जाते हैं। हालांकि अगर हम उनके बीच पर्याप्त पर्याप्त अंतराल के साथ संदेश भेज रहे हैं, तो हम चयनकर्ता को जागने की कीमत का भुगतान करते हैं।
यदि मैं सिर्फ एक संदेश भेजने के साथ खेलता हूं तो मुझे 150 से 250 माइक्रोस्कोस के बीच कई बार मिलता है।
तो समुदाय के लिए मेरे सवाल कर रहे हैं:
1 - 19 माइक्रो इस राउंड ट्रिप पैकेट परीक्षण के लिए इष्टतम की औसत के साथ 13 माइक्रो के मेरी न्यूनतम समय है। ऐसा लगता है कि मैं ZeroMQ को अब तक मार रहा हूं इसलिए मुझे यहां कुछ याद आ रहा है।इस बेंचमार्क यह ZeroMQ की तरह लग रहा से एक मानक कर्नेल पर एक 49 माइक्रो औसत समय (99% प्रतिशतक) है =>http://www.zeromq.org/results:rt-tests-v031
2 - क्या मैं जब मैं स्पिन एक या बहुत चयनकर्ता प्रतिक्रिया समय में सुधार करने के कुछ कर सकते हैं कुछ संदेश? 150 माइक्रोस अच्छा नहीं दिखता है। या मुझे लगता है कि प्रोड पर्यावरण पर चयनकर्ता काफी नहीं होगा?
selectNow() के आसपास व्यस्त कताई करके मैं बेहतर परिणाम प्राप्त करने में सक्षम हूं। कुछ पैकेट भेजना अभी भी कई पैकेट भेजने से भी बदतर है, लेकिन मुझे लगता है कि अब मैं चयनकर्ता प्रदर्शन सीमा को मार रहा हूं। मेरे परिणाम:
- एक ही पैकेट भेजना मुझे एक सतत 65 माइक्रोस राउंड ट्रिप टाइम मिलता है।
- दो पैकेट भेजना मुझे औसतन 39 माइक्रोस राउंड ट्रिप टाइम मिलता है।
- 10 पैकेट भेजना मुझे औसतन 17 माइक्रोस राउंड ट्रिप टाइम मिलता है।
- 10,000 पैकेट भेजना मुझे औसतन 10,0 9 8 नैनो राउंड ट्रिप टाइम मिलता है।
- 1 मिलियन पैकेट भेजना मुझे औसतन 9, 9 77 नैनो राउंड ट्रिप टाइम मिलता है।
निष्कर्ष
तो यह यूडीपी पैकेट राउंड ट्रिप के लिए शारीरिक बाधा की तरह दिखता है 10 माइक्रोसेकंड हालांकि मैं 8 माइक्रो में कुछ यात्रा कर पैकेट मिला है (न्यूनतम समय) के एक औसत है ।
व्यस्त कताई (धन्यवाद पीटर) के साथ मैं औसत पर 200 माइक्रोसॉफ्ट से एक ही पैकेट के लिए औसतन 65 माइक्रोसॉफ्ट तक जाने में सक्षम था।
यह सुनिश्चित नहीं है कि ZeroMQ 5 times slower क्यों है। (संपादित करें: हो सकता है कि क्योंकि मैं लूपबैक और ZeroMQ के माध्यम से एक ही मशीन पर यह परीक्षण कर रहा हूँ दो अलग-अलग मशीनों का उपयोग कर रहा है?)
मुझे लगता है कि इनमें से अधिकतर चयनकर्ताओं के व्यवहार के बजाय हॉटस्पॉट जेवीएम वार्मअप समय के कारण है। – EJP
धन्यवाद @EJP, लेकिन मैंने जेवीएम इन-सर्वर मोड में कुछ गर्मजोशी की। मैंने संदेश भेजने से पहले कुछ मिलियन संदेश भेजे थे जो बेंचमार्क को ट्रिगर करेंगे। आपको ऐसा क्यों लगता है कि यह हो रहा है => "अगर मैं सिर्फ एक संदेश भेजने के साथ खेलता हूं तो मुझे 150 से 250 माइक्रोसॉफ्ट के बीच कई बार मिलता है।" – Julie
मुझे पागल कहें लेकिन क्यों आप सी में अपने विवरण (विवरण से) लघु कार्यक्रम को फिर से लागू नहीं करते हैं और प्रदर्शन देखते हैं। – NoSenseEtAl