लिनक्स पर देरी और गिरा पैकेट का अनुकरण करें


246

मैं एक आवेदन के प्रदर्शन को मापने के लिए पैकेट देरी और नुकसान के लिए UDPऔर TCPलिनक्स पर अनुकरण करना चाहूंगा । क्या ऐसा करने के लिए एक सरल तरीका है?


यह भी देखें /
डुबकी

1
OS X के लिए देखें: superuser.com/questions/173882/…
लेनार होयट

जवाबों:


323

नेटेम नेटवर्क का अनुकरण करने के लिए पहले से ही लिनक्स और यूजरस्पेस उपयोगिताओं में निर्मित कार्यक्षमता का लाभ उठाता है। यह वास्तव में मार्क के जवाब को एक अलग नाम से संदर्भित करता है।

उनके मुखपृष्ठ पर उदाहरण पहले से ही दिखाते हैं कि आपने जो मांगा है, उसे कैसे प्राप्त कर सकते हैं:

उदाहरण

विस्तृत क्षेत्र नेटवर्क देरी का अनुकरण

यह सबसे सरल उदाहरण है, यह सिर्फ स्थानीय ईथरनेट से बाहर जाने वाले सभी पैकेटों में देरी की एक निश्चित राशि जोड़ता है।

# 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


2
मूल वेबसाइट में वह त्रुटि है, मैंने सीधे उस पाठ की प्रतिलिपि बनाई है। लेकिन हाँ, 2 ^ (- 32) = 2.33e-10
इपमीकिएन्ट

34
ध्यान दें कि tc -p qdisc ls dev eth0वर्तमान परिभाषित नियमों को सूचीबद्ध करेगा, और tc qdisc del dev eth0 rootउन्हें हटा देगा
क्वामिस

1
एक गैर-मौजूदा प्रविष्टि को बदलने की कोशिश करते समय त्रुटि को इंगित करने के लिए upvoted
Neo

क्या आप जानते हैं कि मुझे ये त्रुटियां क्यों हैं? ubuntu @ anmol-vm1-new: / home / hadoop / threadpp / workloads / परिणाम $ sudo tc qdisc add dev eth0 root netem delay 100ms RTNETLINK उत्तर: फ़ाइल मौजूद है: ubuntu @ anmol-vm1-new: / home / hadoop / workloads / workloads / परिणाम $ sudo tc qdisc परिवर्तन देव eth0 रूट नेटम विलंब 100ms RTNETLINK उत्तर: अमान्य तर्क serverfault.com/questions/743885/…
मोना जलाल

कम स्पीड लिंक को अनुकरण करने के लिए संपूर्ण इंटरफेस को सीमित करने के तरीके का विवरण शामिल करना शायद एक अच्छा विचार होगा
Pavel P

91

गिरा पैकेट के लिए मैं बस iptables और सांख्यिकीय मॉड्यूल का उपयोग करेगा ।

iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

ऊपर एक आने वाले पैकेट को 1% संभावना के साथ छोड़ देगा। सावधान रहें, 0.14 के बारे में ऊपर कुछ भी और आप में से अधिकांश टीसीपी कनेक्शन सबसे अधिक संभावना पूरी तरह से स्टाल करेंगे।

मैन iptables पर एक नज़र डालें और अधिक जानकारी के लिए "स्टेटिस्टिक" खोजें।


6
टीसीपी कनेक्शन 14% से अधिक की किसी भी चीज पर स्टाल क्यों करेगा?
डेविड वोलेवर

2
@DavidWolever: जिस तरह से टीसीपी स्लाइडिंग विंडो का आकार समायोजित किया जाता है। लेकिन 14% अनुभव से विशुद्ध रूप से है, इसे स्वयं आज़माएं और आप देखेंगे कि ssh 14% और उससे अधिक पर अनुपयोगी हो जाता है, लेकिन वास्तव में पैकेट ड्रॉप दर के निम्न स्तर पर काफी अच्छी तरह से काम करता है।
Bjarke Freund-Hansen

12
सुरक्षा के लिए, संभवतः केवल पोर्ट (ओं) पर लागू होने के लिए नियम को सीमित करना सबसे अच्छा है, जिसे आप परीक्षण करना चाहते हैं: iptables-एक INPUT --dport FOO -m आँकड़े .... इस तरह, आपके ssh और अन्य कनेक्शन होंगे अनमना रहें और आप ब्याज की सेवा के लिए ड्रॉप-रेट को टक्कर दे सकते हैं ताकि किसी भी समस्या को तेजी से हल कर सकें।
मिखाइल टी।

5
ध्यान दें कि DROPपर आउटबाउंड कनेक्शन नहीं बल्कि हास्यास्पद का कारण बनता है send()आपरेशनों वापसी के लिए EPERM, बल्कि फिर बस पैकेट छोड़ने (जैसे कि यह चाहिए)।
फेक नेम

2
क्या यह सब उस आदेश को पूर्ववत करने के लिए आवश्यक है? iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
jcalfee314

6

मेरे एक सहयोगी ने ऐसा करने के लिए tc का उपयोग किया। अधिक जानकारी के लिए मैन पेज देखें। आप यहां इसके उपयोग का एक उदाहरण देख सकते हैं ।


मुझे लगता है कि iptables का उपयोग करना अधिक आसान है :)
c4f4t0r

यकीन है, लेकिन tc iptables की तुलना में बहुत अधिक तेज है
Teknoraver

5

iptables (8) में एक सांख्यिकीय मिलान मॉड्यूल होता है जिसका उपयोग प्रत्येक nth पैकेट से मिलान करने के लिए किया जा सकता है। इस पैकेट को छोड़ने के लिए, बस -j DROP संलग्न करें ।


3

नेटवर्किंग भौतिकी सिमुलेशन के इस ट्यूटोरियल में यूडीपी कनेक्शन में विलंबता और पैकेट हानि अनुकरण के लिए नमूना कोड में C ++ वर्ग शामिल है और यह मार्गदर्शन का हो सकता है। डाउनलोड करने योग्य स्रोत कोड के Connection.h फ़ाइल में पाए गए कनेक्शन वर्ग के सार्वजनिक विलंबता और पैकेट लेवल देखें ।


1

स्वयं इसे आज़माया नहीं गया, लेकिन इस पृष्ठ में प्लग इन मॉड्यूल की एक सूची है जो लिनक्स में 'iptables IP फ़िल्टरिंग सिस्टम' में निर्मित है। मॉड्यूल में से एक को "एनटीटी" कहा जाता है, और आपको एक नियम स्थापित करने की अनुमति मिलती है जो पैकेट के एक विन्यास दर को गिरा देगा। कम से कम शुरू करने के लिए एक अच्छी जगह हो सकती है।


1

आप कोशिश कर सकते हैं http://snad.ncsl.nist.gov/nistnet/ यह काफी पुराना NIST प्रोजेक्ट है (अंतिम रिलीज़ 2005), लेकिन यह मेरे लिए काम करता है।


1

नेटवर्क फॉल्ट इंजेक्शन टूल का उपयोग करने का एक आसान सबोटूर है । यह अनुकरण कर सकता है:

  • कुल नेटवर्क विभाजन
  • मृत सेवा (अपेक्षित पोर्ट पर नहीं सुन)
  • देरी
  • पैकेट लॉस-टीसीपी कनेक्शन टाइमआउट (जैसा कि अक्सर होता है जब दो सिस्टम एक स्टेटफुल फ़ायरवॉल द्वारा अलग हो जाते हैं)

1
अफसोस की बात यह है कि उस परियोजना के लिए अंतिम प्रतिबद्धता 28 अगस्त 2015 को थी, यानी लगभग 4 साल पहले। खुले मुद्दे अब 5 साल पुराने हैं।
अली

1

उस उद्देश्य के लिए वैज्ञानिक समुदाय में सबसे अधिक इस्तेमाल किया जाने वाला उपकरण डमीनेट है । एक बार जब आप 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

यहाँ अधिक जानकारी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.