दो ubuntu सर्वर मशीनों के बीच धीमी गति से कनेक्शन का अनुकरण करें


9

मैं निम्नलिखित परिदृश्य का अनुकरण करना चाहता हूं: यह देखते हुए कि मेरे पास 4 ubuntu सर्वर मशीनें हैं ए, बी, सी और डी। मैं मशीन ए और मशीन सी के बीच 20% तक नेटवर्क बैंडविड्थ को कम करना चाहता हूं और ए और बी के बीच 10% कैसे। क्या यह नेटवर्क सिमुलेशन / थ्रॉटलिंग टूल्स का उपयोग कर रहा है?


iptables में थ्रॉटलिंग क्षमता हो सकती है। मैंने कभी इसका इस्तेमाल नहीं किया, लेकिन देखने लायक था।
माइकल मार्टिनेज

@MichaelMartinez नहीं यह नहीं है। tcजब iptables अंकन के साथ प्रयोग किया जाता है।
जेवियर लुकास

@XavierLucas जानकर अच्छा लगा!
माइकल मार्टिनेज

जवाबों:


15

ऐसा करने के लिए आप फ़िल्टर के tcसाथ अकेले का उपयोग कर सकते हैं u32या iptables अंकन के साथ संयुक्त हो सकता है (शायद अधिक सीधा अगर आप जटिल फ़िल्टर सिंटैक्स सीखना नहीं चाहते हैं)। मैं निम्नलिखित पोस्ट में पूर्व समाधान का विवरण दूंगा।


अपने सेटअप का अनुकरण करना

एक उदाहरण के रूप में, आइए A, B, C और D 10 Mbit / s वर्चुअल इंटरफेस पर विचार करें।

आप मूल रूप से चाहते हैं:

  • A <==> B: 9 Mbit / s को ग्रहण के लिए आकार देना
  • A <==> C: 8 Mbit / s को ग्रहण के लिए आकार देना

इसे अनुकरण करने के लिए मैं एक पुल में प्लग किए गए 4 नेटवर्क नेमस्पेस और वर्चुअल ईथरनेट इंटरफेस बनाएगा।

बेशक, आपके मामले में आप वास्तविक एनआईसी के साथ काम करेंगे और पुल आपके बुनियादी ढांचे के आधार पर आपका प्रवेश द्वार या स्विच होगा।

तो मेरे सिमुलेशन में हमारे पास निम्न सेटअप होगा, 10.0.0.0/24 नेटवर्क में:

                                  10.0.0.254            

                                  +-------+                     
                                  |       |                     
                                  |  br0  |                     
                                  |       |                   
                                  +---+---+                     
                                      |                         
                                      | veth{A..D}.peer        
                                      |                      
                  +------------+------+-----+------------+     
                  |            |            |            |      
            vethA |      vethB |      vethC |      vethD |      
              +---+---+    +---+---+    +---+---+    +---+---+  
              |       |    |       |    |       |    |       |   
              |   A   |    |   B   |    |   C   |    |   D   |   
              |       |    |       |    |       |    |       |  
              +-------+    +-------+    +-------+    +-------+    

              10.0.0.1      10.0.0.2     10.0.0.3     10.0.0.4           

सबसे पहले, सेटअप फासिस ताकि आप समझ सकें कि यह किस चीज से बना है, इसे छोड़ दें यदि आप इससे अपरिचित हैं, तो कोई बड़ी बात नहीं है। हालाँकि आपको जो पता होना चाहिए वह यह है कि कमांड ip netns exec <namespace> <command>एक नेटवर्क नेमस्पेस (यानी पिछले ड्रा के बॉक्स में से एक में) को कमांड निष्पादित करने की अनुमति देता है। इसका उपयोग अगले भाग में भी किया जाएगा।

# Create the bridge
ip link add br0 type bridge

# Create network namespaces and veth interfaces and plug them into the bridge
for host in {A..D} ; do 
    ip link netns add ${host}
    ip link add veth${host} type veth peer name veth${host}.peer
    ip link set dev veth${host}.peer master br0
    ip link set dev veth${host} netns ${host}
    ip netns exec ${host} ip link set veth${host} up
done

# Assign IPs
ip addr add 10.0.0.254/24 dev br0
ip netns exec A ip addr add 10.0.0.1/24 dev vethA
ip netns exec B ip addr add 10.0.0.2/24 dev vethB
ip netns exec C ip addr add 10.0.0.3/24 dev vethC
ip netns exec D ip addr add 10.0.0.4/24 dev vethD

तो इस बिंदु पर हमारे पास पहले से वर्णित सेटअप है।


ट्रैफ़िक को आकार देना

आप जो चाहते हैं उसे पाने के लिए ट्रैफिक कंट्रोल में लगने का समय आ गया है। tcउपकरण आप कतार विषयों को जोड़ने के लिए अनुमति देता है:

  • ईगर्शन के लिए: एक बार कर्नेल को पैकेट भेजने की जरूरत होती है और एनआईसी ड्राइवर को एक्सेस करने से पहले।
  • प्रवेश के लिए: NIC ड्राइवर तक पहुँचने से पहले और कर्नेल रूट से पहले प्राप्त पैकेट पर चलाए जाते हैं।

यह 3 धारणाओं के साथ आता है: क्यूडीस्क , कक्षाएं और फिल्टर । उन धारणाओं का उपयोग जटिल पैकेट प्रवाह प्रबंधन को सेटअप करने के लिए किया जा सकता है और जो भी मानदंड / मापदंड आप चाहते हैं, उसके आधार पर ट्रैफ़िक को प्राथमिकता दें।

संक्षेप में :

  • Qdiscs ऐसी संरचनाएँ हैं जहाँ पैकेटों को सनातन / विकृत किया जाएगा।
  • विशिष्ट व्यवहार के साथ काम करने वाले क्यूडीस्क के लिए कक्षाएं कंटेनर हैं।
  • फिल्टर कक्षाओं के बीच पैकेटों को रूट करने के तरीके हैं, उनमें से कई को प्रसंस्करण के दौरान प्राथमिकताओं के साथ एक ही प्रवेश बिंदु पर परिभाषित किया जा सकता है।

ये सभी आमतौर पर एक पेड़ के रूप में काम करते हैं जहां पत्ते क्यूडीस्क हैं और कक्षाएं नोड्स हैं। एक पेड़ या सबट्री की जड़ को घोषित किया जाएगा <id>:और बच्चों को नोड घोषित किया जाएगा <parent_id>:<children_id>। इस वाक्य-विन्यास को ध्यान में रखें।

अपने मामले के लिए, आइए A को लें और उस वृक्ष को प्रस्तुत करें जिसे आप स्थापित करना चाहते हैं tc:

                                     1:
                                      |
                                      |
                                      |
                                     1:1
                                   /  |  \
                                  /   |   \
                                 /    |    \
                               1:10  1:20  1:30
                                |     |     |
                                |     |     |
                               :10   :20   :30

स्पष्टीकरण:

  • 1:जड़ डिवाइस vethA से जुड़ी qdisc, यह के रूप में स्पष्ट रूप ले जाया जाएगा है htbपदानुक्रम टोकन बाल्टी (एक डिवाइस के डिफ़ॉल्ट qdisc है के लिए pfifoया pfifo_fastओएस के आधार पर)। यह प्रबंधन के लिए विशेष रूप से उपयुक्त है। इस स्तर पर परिभाषित फिल्टरों से मेल नहीं खाने वाले पैकेट 1:30कक्षा में जाएंगे ।
  • 1:1htb10 Mbit / s तक डिवाइस के पूरे ट्रैफ़िक को सीमित करने वाला एक वर्ग होगा ।
  • 1:10htb9 Mbit / s (10 Mbit / s का 90%) के लिए उत्पादन यातायात को सीमित करने वाला एक वर्ग होगा ।
  • 1:20htb8 Mbit / s (10 Mbit / s का 80%) के लिए उत्पादन यातायात को सीमित करने वाला एक वर्ग होगा ।
  • 1:30htb10 Mbit / s (फॉलबैक) पर यातायात को सीमित करने वाला एक वर्ग होगा ।
  • :10, :20, :30sfqस्टोकेस्टिक फेयरनेस क्युइंग के लिए क्यूडिस्क हैं । दूसरे शब्दों में, ये क्यूडिस्क प्रवाह के आधार पर ट्रांसमिशन शेड्यूलिंग में निष्पक्षता सुनिश्चित करेंगे।

यह पूरी चीज़ निम्नलिखित कमांड द्वारा सेटअप की गई है:

ip netns exec A tc qdisc add dev vethA root handle 1: htb default 30
ip netns exec A tc class add dev vethA parent 1: classid 1:1 htb rate 10mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:10 htb rate 9mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:20 htb rate 8mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:30 htb rate 10mbit burst 15k
ip netns exec A tc qdsic add dev vethA parent 1:10 handle 10: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:20 handle 20: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:30 handle 30: sfq perturb 10

आखिरी बात हम की जरूरत है फिल्टर तो गंतव्य के साथ IP पैकेट आईपी के बराबर होती है बी के लिए जाना जाएगा जोड़ने 1:10वर्ग और IP पैकेट गंतव्य के साथ आईपी के बराबर होती है सी के लिए जाना जाएगा 1:20वर्ग:

ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 1 u32 match ip dst 10.0.0.2/32 flowid 1:10
ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 2 u32 match ip dst 10.0.0.3/32 flowid 1:20

अब जब आपको यह विचार मिलता है, तो आपको tcबी और सी के समान नियमों को जोड़ना होगा, इसलिए इन रिसावों से ए की ओर प्रसारण भी आकार का है।


परिक्षण

अब इसे टेस्ट करते हैं। इसके लिए मुझे व्यक्तिगत रूप से खेलने के लिए इस्तेमाल किया जाता है iperf, इसमें बस एक एकल बाइनरी होता है जिसे या तो क्लाइंट या सर्वर के रूप में चलाया जा सकता है और स्वचालित रूप से दोनों मेजबानों के बीच जितना संभव हो उतना ट्रैफ़िक भेजेगा।

A और B के बीच:

 $ ip netns exec B iperf -s -p 8001
  ...
 $ ip netns exec A iperf -c 10.0.0.2 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.2, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 58191 connected with 10.0.0.2 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  2.0- 4.0 sec  2.12 MBytes  8.91 Mbits/sec
[  5]  4.0- 6.0 sec  2.00 MBytes  8.39 Mbits/sec
[  5]  6.0- 8.0 sec  2.12 MBytes  8.91 Mbits/sec
[  5]  8.0-10.0 sec  2.00 MBytes  8.39 Mbits/sec
[  5]  0.0-10.1 sec  10.8 MBytes  8.91 Mbits/sec

हम अपने 9 Mbit / s बैंडवाइथ की सीमा प्राप्त करते हैं।

A और C के बीच:

$ ip netns exec C iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.3 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.3, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 58522 connected with 10.0.0.3 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  2.0- 4.0 sec  1.75 MBytes  7.34 Mbits/sec
[  5]  4.0- 6.0 sec  1.88 MBytes  7.86 Mbits/sec
[  5]  6.0- 8.0 sec  1.88 MBytes  7.86 Mbits/sec
[  5]  8.0-10.0 sec  1.75 MBytes  7.34 Mbits/sec
[  5]  0.0-10.1 sec  9.62 MBytes  7.98 Mbits/sec

हमें अपनी 8 Mbit / s बैंडवाइथ सीमा मिलती है।

ए और डी के बीच:

$ ip netns exec D iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.4 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.4, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 40614 connected with 10.0.0.4 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.62 MBytes  11.0 Mbits/sec
[  5]  2.0- 4.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  4.0- 6.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  6.0- 8.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  8.0-10.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  0.0-10.2 sec  12.0 MBytes  9.89 Mbits/sec

यहाँ हमारे पास 10 Mbit / s तक की वर्चुअल इंटरफ़ेस पूर्ण गति है ।

ध्यान दें कि प्रत्येक रन के पहले माप के फटने htbको पर्याप्त पैरामीटर को समायोजित करके कक्षाओं में बेहतर तरीके से नियंत्रित किया जा सकता है ।


सफाई करना

दूर करना :

  • पर प्राथमिकता 1 के फिल्टर 1:: tc filter del dev vethA parent 1: prio 1 u32
  • सभी पर फिल्टर 1:: tc filter del dev vethA parent 1:
  • कक्षा 1:20और उसके बच्चे tc class del dev vethA parent 1:1 classid 1:20:।
  • पूरा पेड़ tc qdisc del dev vethA:।

सिमुलेशन सेट को साफ करने के लिए:

# Remove veth pairs and network namespaces
for host in {A..D} ; do
    ip link del dev veth${host}.peer
    ip netns del ${host}
done

# Remove the bridge
ip link del dev br0

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

1
@ याहियाजाकारिया मैंने इस जानकारी को अपने पोस्ट के उत्तरार्ध में जोड़ा है।
जेवियर लुकास

0

उबंटू में फ्रीबीएसडी से आईपीएफडब्ल्यू पोर्ट किया गया है, और आईपीएफडब्ल्यू में ड्यूमनेट है जो विभिन्न नेटवर्क मापदंडों - बैंडविड्थ, देरी, पैकेट के नुकसान की दर, आदि का प्रबंधन करने की अनुमति देता है।


0

सबसे अच्छा है अब एकीकृत (उबंटू सर्वर में) कम से कम नेटम मॉड्यूल के साथ टीसी टूल्स का उपयोग करना। आप इस लेख में Stackoverflow से अधिक जानकारी पा सकते हैं ।


नेटम आरटेट और कंजेशन इम्यूलेशन के बारे में है, बैंडवाथ के बारे में नहीं।
जेवियर लुकास

1
@XavierLucas, आप सही हैं, बैंडविड्थ के लिए आपको सिर्फ tc की जरूरत है, वो भी बिना netem के।
ल्यूक Stepniewski

0

ट्रिकल अच्छा काम करता है।

यह चर्चा कुछ सीमाएँ दिखाती है: /unix/109973/how-to-change-speed-limit-of-running-trickle-instance


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

छल का उपयोग कनेक्शन के एक समूह (केवल एक कनेक्शन नहीं) का अनुकरण करने के लिए किया जा सकता है। वास्तव में प्रश्न को "सभी कनेक्शन होस्ट-टू-होस्ट" के रूप में व्याख्या किया जा सकता है।
मैथ्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.