मैं एक आवेदन के प्रदर्शन को मापने के लिए पैकेट देरी और नुकसान के लिए UDP
और TCP
लिनक्स पर अनुकरण करना चाहूंगा । क्या ऐसा करने के लिए एक सरल तरीका है?
मैं एक आवेदन के प्रदर्शन को मापने के लिए पैकेट देरी और नुकसान के लिए UDP
और TCP
लिनक्स पर अनुकरण करना चाहूंगा । क्या ऐसा करने के लिए एक सरल तरीका है?
जवाबों:
नेटेम नेटवर्क का अनुकरण करने के लिए पहले से ही लिनक्स और यूजरस्पेस उपयोगिताओं में निर्मित कार्यक्षमता का लाभ उठाता है। यह वास्तव में मार्क के जवाब को एक अलग नाम से संदर्भित करता है।
उनके मुखपृष्ठ पर उदाहरण पहले से ही दिखाते हैं कि आपने जो मांगा है, उसे कैसे प्राप्त कर सकते हैं:
उदाहरण
विस्तृत क्षेत्र नेटवर्क देरी का अनुकरण
यह सबसे सरल उदाहरण है, यह सिर्फ स्थानीय ईथरनेट से बाहर जाने वाले सभी पैकेटों में देरी की एक निश्चित राशि जोड़ता है।
# tc qdisc add dev eth0 root netem delay 100ms
अब स्थानीय नेटवर्क पर होस्ट करने के लिए एक साधारण पिंग टेस्ट में 100 मिलीसेकंड की वृद्धि दिखाई जानी चाहिए। देरी कर्नेल (हर्ट्ज) के क्लॉक रिज़ॉल्यूशन द्वारा सीमित है। अधिकांश 2.4 सिस्टम पर, सिस्टम क्लॉक 100 हर्ट्ज पर चलता है जो 10 एमएस की वेतन वृद्धि में देरी की अनुमति देता है। 2.6 पर, मान 1000 से 100 हर्ट्ज तक एक कॉन्फ़िगरेशन पैरामीटर है।
बाद के उदाहरण qdisc को पुनः लोड किए बिना सिर्फ पैरामीटर बदलते हैं
वास्तविक विस्तृत क्षेत्र नेटवर्क परिवर्तनशीलता दिखाते हैं ताकि यादृच्छिक भिन्नता को जोड़ना संभव हो।
# tc qdisc change dev eth0 root netem delay 100ms 10ms
यह अतिरिक्त विलंब का कारण 100 the 10 एमएस है। नेटवर्क विलंब भिन्नता विशुद्ध रूप से यादृच्छिक नहीं है, इसलिए यह अनुकरण करने के लिए कि सहसंबंध मूल्य भी है।
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
यह अगले विलम्बित तत्व के साथ 100 ms 10 एमएस होने की देरी का कारण बनता है जो पिछले एक पर 25% निर्भर करता है। यह सच सांख्यिकीय सहसंबंध नहीं है, लेकिन एक अनुमान है।
वितरण में देरी
आमतौर पर, एक नेटवर्क में देरी एक समान नहीं है। देरी में भिन्नता का वर्णन करने के लिए सामान्य वितरण जैसी किसी चीज़ का उपयोग करना अधिक आम है। गैर-समान वितरण को निर्दिष्ट करने के लिए नेटेम अनुशासन एक तालिका ले सकता है।
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
वास्तविक तालिकाओं (सामान्य, पारेतो, पेरेंटोनॉर्मल) को iproute2 संकलन के भाग के रूप में उत्पन्न किया जाता है और / usr / lib / tc में रखा जाता है; इसलिए यह प्रायोगिक डेटा के आधार पर अपने स्वयं के वितरण को बनाने के कुछ प्रयासों के साथ संभव है।
पैकेट खो गया
यादृच्छिक पैकेट हानि प्रतिशत में 'tc' कमांड में निर्दिष्ट है। सबसे छोटा संभव गैर-शून्य मान है:
2 0.0032 = 0.0000000232%
# tc qdisc change dev eth0 root netem loss 0.1%
इससे 1/10 प्रतिशत का प्रतिशत (यानी 1000 में से 1) पैकेट बेतरतीब ढंग से गिरा दिया जाता है।
एक वैकल्पिक सहसंबंध भी जोड़ा जा सकता है। यह यादृच्छिक संख्या जनरेटर को कम यादृच्छिक बनाता है और पैकेट फटने के नुकसान का अनुकरण करने के लिए इस्तेमाल किया जा सकता है।
# tc qdisc change dev eth0 root netem loss 0.3% 25%
यह 0.3% पैकेट खो जाएगा, और प्रत्येक संभावित संभावना पिछले एक पर एक चौथाई द्वारा निर्भर करती है।
शायद n = 0.25 × prob n-1 + 0.75 × यादृच्छिक
ध्यान दें कि आपको tc qdisc add
उस इंटरफ़ेस के लिए कोई नियम नहीं है या tc qdisc change
यदि आपके पास उस इंटरफ़ेस के लिए पहले से ही नियम हैं, तो आपको इसका उपयोग करना चाहिए । tc qdisc change
बिना नियम के इंटरफ़ेस पर उपयोग करने का प्रयास त्रुटि देगा RTNETLINK answers: No such file or directory
।
tc -p qdisc ls dev eth0
वर्तमान परिभाषित नियमों को सूचीबद्ध करेगा, और tc qdisc del dev eth0 root
उन्हें हटा देगा
गिरा पैकेट के लिए मैं बस iptables और सांख्यिकीय मॉड्यूल का उपयोग करेगा ।
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
ऊपर एक आने वाले पैकेट को 1% संभावना के साथ छोड़ देगा। सावधान रहें, 0.14 के बारे में ऊपर कुछ भी और आप में से अधिकांश टीसीपी कनेक्शन सबसे अधिक संभावना पूरी तरह से स्टाल करेंगे।
मैन iptables पर एक नज़र डालें और अधिक जानकारी के लिए "स्टेटिस्टिक" खोजें।
DROP
पर आउटबाउंड कनेक्शन नहीं बल्कि हास्यास्पद का कारण बनता है send()
आपरेशनों वापसी के लिए EPERM
, बल्कि फिर बस पैकेट छोड़ने (जैसे कि यह चाहिए)।
iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
मेरे एक सहयोगी ने ऐसा करने के लिए tc का उपयोग किया। अधिक जानकारी के लिए मैन पेज देखें। आप यहां इसके उपयोग का एक उदाहरण देख सकते हैं ।
नेटवर्किंग भौतिकी सिमुलेशन के इस ट्यूटोरियल में यूडीपी कनेक्शन में विलंबता और पैकेट हानि अनुकरण के लिए नमूना कोड में C ++ वर्ग शामिल है और यह मार्गदर्शन का हो सकता है। डाउनलोड करने योग्य स्रोत कोड के Connection.h फ़ाइल में पाए गए कनेक्शन वर्ग के सार्वजनिक विलंबता और पैकेट लेवल देखें ।
स्वयं इसे आज़माया नहीं गया, लेकिन इस पृष्ठ में प्लग इन मॉड्यूल की एक सूची है जो लिनक्स में 'iptables IP फ़िल्टरिंग सिस्टम' में निर्मित है। मॉड्यूल में से एक को "एनटीटी" कहा जाता है, और आपको एक नियम स्थापित करने की अनुमति मिलती है जो पैकेट के एक विन्यास दर को गिरा देगा। कम से कम शुरू करने के लिए एक अच्छी जगह हो सकती है।
आप कोशिश कर सकते हैं http://snad.ncsl.nist.gov/nistnet/ यह काफी पुराना NIST प्रोजेक्ट है (अंतिम रिलीज़ 2005), लेकिन यह मेरे लिए काम करता है।
नेटवर्क फॉल्ट इंजेक्शन टूल का उपयोग करने का एक आसान सबोटूर है । यह अनुकरण कर सकता है:
- कुल नेटवर्क विभाजन
- मृत सेवा (अपेक्षित पोर्ट पर नहीं सुन)
- देरी
- पैकेट लॉस-टीसीपी कनेक्शन टाइमआउट (जैसा कि अक्सर होता है जब दो सिस्टम एक स्टेटफुल फ़ायरवॉल द्वारा अलग हो जाते हैं)
उस उद्देश्य के लिए वैज्ञानिक समुदाय में सबसे अधिक इस्तेमाल किया जाने वाला उपकरण डमीनेट है । एक बार जब आप ipfw
कर्नेल मॉड्यूल को स्थापित कर लेते हैं, तो 2 मशीनों के बीच 50ms प्रसार विलंब को शुरू करने के लिए बस इन कमांडों को चलाएं:
./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2
50% पैकेट के नुकसान का भी परिचय देने के लिए:
./ipfw pipe 1 config plr 0.5
यहाँ अधिक जानकारी।