मैं निम्नलिखित सेटअप के प्रदर्शन को निर्धारित करने के लिए लोड परीक्षणों का एक सेट चला रहा हूं:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
संक्षेप में, नोड.जेएस परीक्षण सूट एक एक्सट्रास उदाहरण के लिए हर सेकंड में मीट्रिक की एक निर्धारित राशि भेजता है जो दूसरे सर्वर पर स्थित है। इसके बाद StatsD बारी-बारी से हर सेकेंड मैट्रिक्स को उसी सर्वर पर स्थित ग्रेफाइट इंस्टेंस पर फ्लश करता है। मैं तब देखता हूं कि परीक्षण सूट द्वारा वास्तव में कितने मेट्रिक्स भेजे गए थे और ग्रेफाइट द्वारा कितने प्राप्त किए गए थे जो टेस्ट सूट और ग्रेफाइट के बीच पैकेट नुकसान का निर्धारण करते हैं।
हालाँकि मैंने देखा कि मुझे कभी-कभी बहुत बड़े पैकेट ड्रॉप रेट (ध्यान दें कि इसे यूडीपी प्रोटोकॉल के साथ भेजा जा रहा है), 20-50% से लेकर। इसलिए जब मैंने यह देखना शुरू किया कि इन पैकेटों को कहां गिराया जा रहा है, यह देखते हुए कि यह StatsD के साथ कुछ प्रदर्शन का मुद्दा हो सकता है। इसलिए मैंने सिस्टम के हर हिस्से में मेट्रिक्स को लॉग करना शुरू कर दिया, ताकि यह पता चल सके कि यह ड्रॉप कहां से आई। और यह वह जगह है जहां चीजें अजीब होती हैं।
मैं कैप्चर फ़ाइल बनाने के लिए tcpdump का उपयोग कर रहा हूं, जिसे मैं परीक्षण चलाने के बाद निरीक्षण करता हूं। लेकिन जब भी मैं tcpdump के साथ परीक्षण चलाता हूं, तो पैकेट का नुकसान लगभग न के बराबर होता है! ऐसा लग रहा है कि tcpdump किसी तरह मेरे परीक्षणों के प्रदर्शन को बढ़ा रहा है और मैं यह पता नहीं लगा सकता कि यह क्यों और कैसे करता है। मैं सर्वर और क्लाइंट दोनों पर tcpdump संदेशों को लॉग करने के लिए निम्न कमांड चला रहा हूं:
tcpdump -i any -n port 8125 -w test.cap
एक विशेष परीक्षण के मामले में मैं 40000 मेट्रिक्स / एस भेज रहा हूं। Tcpdump को चलाने के दौरान परीक्षण में लगभग 4% का पैकेट नुकसान होता है, जबकि बिना पैकेट के लगभग 20% का नुकसान होता है
दोनों प्रणालियां निम्नलिखित सेटअप के साथ एक्सएमएन वीएम के रूप में चल रही हैं:
- Intel Xeon E5-2630 v2 @ 2.60GHz
- 2 जीबी रैम
- उबंटू 14.04 x86_64
संभावित कारणों के लिए पहले से ही जाँच की गई चीज़ें:
- यूडीपी बफर बढ़ाने / भेजने का आकार।
- सीपीयू लोड परीक्षण को प्रभावित करता है। (अधिकतम लोड 40-50%, दोनों क्लाइंट और सर्वर साइड)
- 'किसी' के बजाय विशिष्ट इंटरफेस पर tcpdump चलाना।
- चल मोड को निष्क्रिय करने के लिए '-p' के साथ रनिंग tcpdump।
- केवल सर्वर पर tcpdump चल रहा है। इसके परिणामस्वरूप पैकेट में 20% की हानि हुई और यह परीक्षणों को प्रभावित नहीं करता है।
- केवल क्लाइंट पर tcpdump चल रहा है। इससे प्रदर्शन में वृद्धि हुई।
- बढ़ रही netdev_max_backlog और netdev_budget से 2 ^ 32-1। इससे कोई फर्क नहीं पड़ा।
- प्रत्येक मोड पर प्रत्येक सेटिंग (सर्वर ऑन और क्लाइंट ऑफ, सर्वर ऑफ और क्लाइंट ऑन, दोनों ऑफ) दोनों पर हर संभव सेटिंग की कोशिश की। इससे कोई फर्क नहीं पड़ा।
ifconfig eth0 promisc
सक्षम और ifconfig eth0 -promisc
अक्षम करता है। यदि यह अंतर करता है, तो दोनों मशीनों पर प्रोमिस के 4 संभावित संयोजनों की तुलना करके देखें। यह समस्याओं के स्रोत को इंगित करने में मदद कर सकता है।
-p
करने के लिए कि क्या यह एक फर्क पड़ता है देखने के लिए छोड़ विकल्प पारित करना चाहते हो सकता है ।