দুটি উবুন্টু সার্ভার মেশিনের মধ্যে ধীর সংযোগ অনুকরণ করুন


9

আমি নিম্নলিখিত দৃশ্যের অনুকরণ করতে চাই: যে আমার 4 টি উবুন্টু সার্ভার মেশিন রয়েছে এ, বি, সি এবং ডি পেয়ে আমি মেশিন এ এবং মেশিন সি এর মধ্যে 20% এবং এ এবং বি এর মধ্যে 10% কমিয়ে দিতে চাই কীভাবে এটি কি নেটওয়ার্ক সিমুলেশন / থ্রোটলিং সরঞ্জামগুলি ব্যবহার করে?


iptables থ্রোটলিং ক্ষমতা থাকতে পারে। আমি কখনই এটি ব্যবহার করিনি, তবে সন্ধান করার মতো।
মাইকেল মার্টিনেজ

পছন্দ করেছেন tciptables চিহ্নিত সঙ্গে ব্যবহৃত যখন না।
জাভিয়ের লুকাস

@ জাভিয়ারলুকাস জেনে ভাল!
মাইকেল মার্টিনেজ

উত্তর:


15

এটি করার জন্য আপনি tcএকা u32ফিল্টারগুলি ব্যবহার করতে পারেন বা আইপটিবলস চিহ্নিতকরণের সাথে একত্রিত করতে পারেন (যদি আপনি জটিল ফিল্টারগুলির বাক্য গঠনটি শিখতে না চান তবে আরও সহজবোধ্য)। আমি নিম্নলিখিত পোস্টে সাবেক সমাধান বিস্তারিত করব।


আপনার সেটআপ অনুকরণ

উদাহরণ হিসাবে, আসুন 10, Mbit / s ভার্চুয়াল ইন্টারফেস চলমান A, B, C এবং D বিবেচনা করুন।

আপনি মূলত চান:

  • এ <==> বি: 9 এমবিট / এস ঠিকানাটির জন্য শেপিং
  • এ <==> সি: 8 এমবিট / এস ঠিকানাটির জন্য শেপিং

এটি অনুকরণ করার জন্য আমি একটি সেতুতে প্লাগ করা 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           

প্রথমে সেটআপ ফাসিস যাতে আপনি এটি কী তৈরি তা বুঝতে পারেন, আপনি যদি এটার সাথে পরিচিত না হন তবে এড়িয়ে যান big তবে আপনাকে যা জানতে হবে তা হ'ল 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টুল আপনি কিউয়িং নিয়মানুবর্তিতা যোগ করার জন্য অনুমতি দেয়:

  • উদাহরণস্বরূপ: একবার কার্নেলের প্যাকেটগুলি প্রেরণ করতে হবে এবং এনআইসি ড্রাইভার অ্যাক্সেস করার আগে।
  • এনগ্রেসের জন্য: এনআইসি ড্রাইভার অ্যাক্সেস করার পরে এবং প্রাপ্ত প্যাকেটগুলির পরে কার্নেল রুটিনগুলি চালিত হওয়ার আগে।

এটি 3 টি ধারণার সাথে আসে: কিউডিস্ক , ক্লাস এবং ফিল্টার । এই ধারণাগুলি জটিল প্যাকেট ফ্লো পরিচালনা সেটআপ করতে এবং ট্র্যাফিকের যেকোন মানদণ্ড / মানদণ্ডের উপর ভিত্তি করে ট্র্যাফিককে অগ্রাধিকার দিতে ব্যবহার করা যেতে পারে।

সংক্ষেপে :

  • কিউডিস্কগুলি এমন এক কাঠামো যেখানে প্যাকেটগুলি ক্রমাগত সারিবদ্ধ করা / প্রতীকযুক্ত করা হবে।
  • ক্লাসগুলি সুনির্দিষ্ট আচরণের সাথে অভিনয় করে কিউডিস্কের ধারক।
  • ফিল্টারগুলি ক্লাসগুলির মধ্যে প্যাকেটগুলি রুট করার উপায়, সেগুলির একাধিক প্রক্রিয়া চলাকালীন অগ্রাধিকারগুলির সাথে একই প্রবেশ বিন্দুতে সংজ্ঞায়িত করা যায়।

এগুলি সাধারণত একটি গাছ হিসাবে কাজ করে যেখানে পাতাগুলি Qdiscs এবং শ্রেণিগুলি নোড হয়। একটি গাছ বা সাবট্রির মূল হিসাবে ঘোষণা করা হবে <id>:এবং বাচ্চাদের নোড হিসাবে ঘোষণা করা হবে <parent_id>:<children_id>। এই বাক্য গঠনটি মাথায় রাখুন।

আপনার ক্ষেত্রে, আসুন A নিন এবং আপনি যে গাছটি সেট আপ করতে চান তা রেন্ডার করুন tc:

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

ব্যাখ্যা:

  • 1:root ডিভাইস vethA সংযুক্ত qdisc, এটা যেমন স্পষ্টভাবে নেয়া হবে হয় htbশ্রেণীক্রম টোকেন বাকেট (একটি ডিভাইস এর ডিফল্ট qdisc জন্য pfifoঅথবা pfifo_fastঅপারেটিং সিস্টেম উপর নির্ভর করে)। এটি ব্যান্ডউইথ পরিচালনার জন্য বিশেষভাবে উপযুক্ত। এই স্তরে সংজ্ঞায়িত ফিল্টারগুলির সাথে মেলে না এমন প্যাকেটগুলি 1:30ক্লাসে যাবে।
  • 1:1htbডিভাইসের পুরো ট্র্যাফিক 10 এমবিট / সেকেন্ডে সীমাবদ্ধ করা একটি শ্রেণি হবে ।
  • 1:10htb9 Mbit / s (10 Mbit / s এর 90%) এর মধ্যে আউটপুট ট্র্যাফিক সীমাবদ্ধ করা একটি শ্রেণি হবে ।
  • 1:20htb8 Mbit / s (10 Mbit / s এর 80%) এর মধ্যে আউটপুট ট্র্যাফিক সীমাবদ্ধ করা একটি শ্রেণি হবে ।
  • 1:30htb10 Mbit / s (ফ্যালব্যাক) এ ট্র্যাফিক সীমাবদ্ধ করা একটি শ্রেণি হবে ।
  • :10, :20, :30হয় sfqস্টচাস্টিক ফর্সা কিউইং জন্য qdisc। অন্য কথায় এই কিডিস্কগুলি প্রবাহের উপর ভিত্তি করে সংক্রমণ শিডিয়ুলিংয়ের ন্যায্যতা নিশ্চিত করবে।

এই সম্পূর্ণ জিনিসটি নিম্নলিখিত আদেশগুলি দ্বারা সেটআপ করা হয়েছে:

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

আমাদের শেষ জিনিসটি ফিল্টার যুক্ত করা দরকার যাতে গন্তব্য আইপি সমান আইপি প্যাকেটগুলি বি 1:10শ্রেণিতে যাবে এবং গন্তব্য আইপি সমান আইপি প্যাকেট সি 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 এমবিট / গুলি ব্যান্ডউইথ সীমা পাই ।

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 এমবিট / গুলি ব্যান্ডউইথ সীমা পাই ।

এ এবং ডি এর মধ্যে:

$ 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 এমবিট / গুলি পৌঁছেছে।

নোট করুন যে প্রতিটি রানের প্রথম পরিমাপের বিস্ফোরণ 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

উবুন্টুতে আইপিএফডাব্লুটি ফ্রিবিএসডি থেকে পোর্ট করা আছে এবং আইপিএফডাব্লুতে ডাম্মাইনেট রয়েছে যা বিভিন্ন নেটওয়ার্ক পরামিতি - ব্যান্ডউইথ, বিলম্ব, প্যাকেটের ক্ষতির হার ইত্যাদি পরিচালনা করতে দেয় etc.


0

সর্বাধিক হ'ল টিসি সরঞ্জামগুলি এখন সংহত (কমপক্ষে উবুন্টু সার্ভারে) নীটম মডিউল দিয়ে ব্যবহার করা। আপনি এই নিবন্ধে স্ট্যাকওভারফ্লো থেকে আরও তথ্য পেতে পারেন ।


নেটম আরটিটি এবং কনজেশন এমুলেশন সম্পর্কে, ব্যান্ডউইথ সম্পর্কে নয়।
জাভিয়ের লুকাস

1
@ জাভিয়ারলুস, আপনি ঠিক বলেছেন, ব্যান্ডউইদথের জন্য আপনার কেবলমাত্র এনসিএম প্রয়োজন, এমনকি নেটিম ছাড়াই।
লস স্টেপনিউস্কি

0

ট্রিকল ভাল কাজ করে।

এই আলোচনাটি কিছু সীমাবদ্ধতা দেখায়: /unix/109973/how-to- بدل-speed-limit-of-running-trickle- instance


ট্রিকল একটি নির্দিষ্ট প্রোগ্রামের জন্য নেটওয়ার্ক ব্যান্ডউইথ অনুকরণ করতে ব্যবহৃত হয়। ওপি হোস্টের সুযোগে একটি সমাধান চাইছে বলে মনে হচ্ছে।
জাভিয়ের লুকাস

ট্রিকলড সংযোগের একটি গ্রুপ (কেবল একটি সংযোগ নয়) সিমুলেট করতে ব্যবহার করা যেতে পারে। প্রকৃতপক্ষে প্রশ্নটি "সমস্ত সংযোগ হোস্ট থেকে হোস্ট" হিসাবে ব্যাখ্যা করা যেতে পারে।
ম্যাথিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.