DynagenでCCIEを目指す
Weighted Random Early Detection
最終更新:
it_certification
-
view
1. 目的
- WRED(Weighted Random Early Detection)の設定方法について確認します。
2. 構成
2.1. 設定概要
- 初期設定はIPアドレスのみです。
- Host OS側でApacheを起動させます。
- Guest OS, R1間は10Mで接続する事で、わざと輻輳を発生させます。
2.2. 構成図

2.3. netファイル
model = 3620 [localhost] [[3620]] image = C:\Program Files\Dynamips\images\c3620-j1s3-mz.123-18.bin ram = 128 [[ROUTER R1]] f0/0 = NIO_gen_eth:\Device\NPF_{8B89D910-5ED3-4A43-9DE9-6A272A3D7592} e1/0 = NIO_gen_eth:\Device\NPF_{5933302A-7AAA-475C-A8FE-A6B82B0C0F98}
2.4. 初期設定
- R1
! version 12.3 service timestamps debug datetime msec service timestamps log datetime msec no service password-encryption ! hostname R1 ! boot-start-marker boot-end-marker ! ! no aaa new-model ip subnet-zero ! ! no ip domain lookup ! ip cef ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! interface FastEthernet0/0 ip address 192.168.200.1 255.255.255.0 duplex auto speed auto ! interface Ethernet1/0 ip address 192.168.201.1 255.255.255.0 half-duplex ! interface Ethernet1/1 no ip address shutdown half-duplex ! interface Ethernet1/2 no ip address shutdown half-duplex ! interface Ethernet1/3 no ip address shutdown half-duplex ! ip http server ip classless ! ! no cdp run ! ! ! ! ! ! line con 0 line aux 0 line vty 0 4 ! ! end
2.5. Apache 設定
ホストOSにApacheをインストールし、ポートベースのバーチャルホストを定義します。構築方法はトップページ/手順書 サーバ系/Apache HTTP Server バーチャルホストの設定を参考にして下さい。
この検証例で実際に使用したhttpd.confの要所となる部分を以下に記載します。
この検証例で実際に使用したhttpd.confの要所となる部分を以下に記載します。
Listen 10880 Listen 10881 Listen 10882 NameVirtualHost *:10880 NameVirtualHost *:10881 NameVirtualHost *:10882 <VirtualHost *:10880> DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs" </VirtualHost> <VirtualHost *:10881> DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs10881" </VirtualHost> <VirtualHost *:10882> DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs10882" </VirtualHost>
2.6. サーバ側 ルーティング設定
- Host OS
route add 192.168.201.0 mask 255.255.255.0 192.168.200.1
- Guest OS
route add -net 192.168.200.0/24 gw 192.168.201.1
3. [準備] Markingの設定
3.1. ip precedenceの設定
WFQはip precedenceの値を元に優先度を決めるキューです。事前準備として、以下のmarkingをFa0/0のinput方向で行います。
通信 | ip precedence |
---|---|
SSH | 5(critical) |
tcp10880を使用したHTTP | 3(flash) |
tcp10881を使用したHTTP | 1(priority) |
tcp10882を使用したHTTP | 0(routine) |
投入するconfigは以下の通りです。
R1(config)#ip access-list extended ACL_SSH R1(config-ext-nacl)#permit tcp any any eq 22 R1(config-ext-nacl)#exit R1(config)# R1(config)#ip access-list extended ACL_10880 R1(config-ext-nacl)#permit tcp any eq 10880 any R1(config-ext-nacl)#exit R1(config)# R1(config)#ip access-list extended ACL_10881 R1(config-ext-nacl)#permit tcp any eq 10881 any R1(config-ext-nacl)#exit R1(config)# R1(config)#ip access-list extended ACL_10882 R1(config-ext-nacl)#permit tcp any eq 10882 any R1(config-ext-nacl)#exit R1(config)# R1(config)# R1(config)#class-map CLASS_SSH R1(config-cmap)#match access-group name ACL_SSH R1(config-cmap)#exit R1(config)# R1(config)#class-map CLASS_10880 R1(config-cmap)#match access-group name ACL_10880 R1(config-cmap)#exit R1(config)# R1(config)#class-map CLASS_10881 R1(config-cmap)#match access-group name ACL_10881 R1(config-cmap)#exit R1(config)# R1(config)#class-map CLASS_10882 R1(config-cmap)#match access-group name ACL_10882 R1(config-cmap)#exit R1(config)# R1(config)# R1(config)#policy-map POLICY_F00_IN R1(config-pmap)#class CLASS_SSH R1(config-pmap-c)#set ip precedence critical R1(config-pmap-c)#exit R1(config-pmap)# R1(config-pmap)#class CLASS_10880 R1(config-pmap-c)#set ip precedence flash R1(config-pmap-c)#exit R1(config-pmap)# R1(config-pmap)#class CLASS_10881 R1(config-pmap-c)#set ip precedence priority R1(config-pmap-c)#exit R1(config-pmap)# R1(config-pmap)#class CLASS_10882 R1(config-pmap-c)#set ip precedence routine R1(config-pmap-c)#exit R1(config-pmap)#exit R1(config)# R1(config)# R1(config)#interface FastEthernet 0/0 R1(config-if)#service-policy in POLICY_F00_IN
4. [検証] WRED (検証失敗 設定方法のみ)
4.1. WREDの設定
e1/0でWREDを設定します。
R1(config)#interface Ethernet 1/0 R1(config-if)#random-detect
4.2. テストトラフィックの送信
Host OSからGuest OSへssh接続い、以下要領のwgetコマンドを3つ同時に実行します。
ip precedenceの値が小さいものほどdropされやすいので通信速度が遅くなるはずですが、下記3つのHTTP通信について速度の差は見られませんでした。
ip precedenceの値が小さいものほどdropされやすいので通信速度が遅くなるはずですが、下記3つのHTTP通信について速度の差は見られませんでした。
[root@localhost ~]# wget -O /dev/null http://192.168.200.100:10880/large.html --2010-11-13 16:08:44-- http://192.168.200.100:10880/large.html Connecting to 192.168.200.100:10880... connected. HTTP request sent, awaiting response... 200 OK Length: 23016000 (22M) [text/html] Saving to: `/dev/null' 17% [=======> ] 4,069,424 7.31K/s eta 37m 6s [root@localhost ~]# wget -O /dev/null http://192.168.200.100:10881/large.html --2010-11-13 16:08:37-- http://192.168.200.100:10881/large.html Connecting to 192.168.200.100:10881... connected. HTTP request sent, awaiting response... 200 OK Length: 23016000 (22M) [text/html] Saving to: `/dev/null' 19% [========> ] 4,587,520 10.2K/s eta 34m 45s [root@localhost ~]# wget -O /dev/null http://192.168.200.100:10882/large.html --2010-11-13 16:08:32-- http://192.168.200.100:10882/large.html Connecting to 192.168.200.100:10882... connected. HTTP request sent, awaiting response... 200 OK Length: 23016000 (22M) [text/html] Saving to: `/dev/null' 20% [========> ] 4,684,872 7.68K/s eta 34m 55s
4.3. showコマンドによる確認
show queueing random-detectコマンドでdropされる確率やdropされるたパケット数を確認できます。
(show queueing random-detect interface Ethernet 1/0のように入力すると、指定したI/Fのみの情報が得られます)
(show queueing random-detect interface Ethernet 1/0のように入力すると、指定したI/Fのみの情報が得られます)
R1#show queueing random-detect Current random-detect configuration: Ethernet1/0 Queueing strategy: random early detection (WRED) Random-detect not active on the dialer Exp-weight-constant: 9 (1/512) Mean queue depth: 0 class Random drop Tail drop Minimum Maximum Mark pkts/bytes pkts/bytes thresh thresh prob 0 0/0 0/0 20 40 1/10 1 0/0 0/0 22 40 1/10 2 0/0 0/0 24 40 1/10 3 0/0 0/0 26 40 1/10 4 0/0 0/0 28 40 1/10 5 0/0 0/0 31 40 1/10 6 0/0 0/0 33 40 1/10 7 0/0 0/0 35 40 1/10 rsvp 0/0 0/0 37 40 1/10 R1#
5. [検証] WREDの詳細設定 (検証失敗 設定方法のみ)
5.1. drop率の算出
WREDは以下の3つのパラメータを用いてdropされる確率をチューニングする事ができます。
項目 | 説明 |
---|---|
min thresh | 平均最小キュー。この値を上回るパケットがキューに格納されるとパケットがドロップされ始めます。 |
max thresh | 平均最大キュー。この値を上回るパケットがキューに格納されるとパケットが全てドロップされます。 |
mark drop | パケットがドロップされる確率です。 |
キューに格納されたパケット数がmin threshに達するとパケットがドロップされ始めます(パケット数がmin thredhの場合は、ドロップされる確率は0%です)。キューに格納されたパケットが増えパケット数がmax threshに達すると、mark dropで定義された確率でdropされます。キューに格納されたパケットがmax threshを超えると、パケットは完全にドロップされるようになります。
キューに格納されたパケット数とドロップされる確率を表したグラフは以下の通りです。
TODO グラフ
5.2. drop率の設定
dropされる確率を以下の通り設定変更する事もできます。
R1(config)#interface Ethernet 1/0 R1(config-if)#random-detect precedence 0 1 5 100 R1(config-if)#random-detect precedence 1 1 5 50
5.3. drop率の確認
show queueing random-detectにより設定を確認します。ip precedence 0, 1の設定が変わった事を確認します。
R1#show queueing random-detect interface Ethernet 1/0 Current random-detect configuration: Ethernet1/0 Queueing strategy: random early detection (WRED) Random-detect not active on the dialer Exp-weight-constant: 9 (1/512) Mean queue depth: 0 class Random drop Tail drop Minimum Maximum Mark pkts/bytes pkts/bytes thresh thresh prob 0 0/0 0/0 1 5 1/100 <- 設定が変わった事を確認します。 1 0/0 0/0 1 5 1/50 <- 設定が変わった事を確認します。 2 0/0 0/0 24 40 1/10 3 0/0 0/0 26 40 1/10 4 0/0 0/0 28 40 1/10 5 0/0 0/0 31 40 1/10 6 0/0 0/0 33 40 1/10 7 0/0 0/0 35 40 1/10 rsvp 0/0 0/0 37 40 1/10 R1#
6. [検証] dcspによるdrop
6.1. dcsp マーキング
デフォルトではip precedenceによってドロップされる確率が変動しますが、dscpに基づいたドロップを行う事も可能です。
まずは、動作確認の準備として、Fa0/0でdscpを用いたマーキングを設定します。
まずは、動作確認の準備として、Fa0/0でdscpを用いたマーキングを設定します。
R1(config)#policy-map POLICY_F00_IN R1(config-pmap)#class CLASS_SSH R1(config-pmap-c)#no set ip precedence R1(config-pmap-c)#set dscp ef R1(config-pmap-c)#class CLASS_10880 R1(config-pmap-c)#no set ip precedence R1(config-pmap-c)#set dscp af31 R1(config-pmap-c)#class CLASS_10881 R1(config-pmap-c)#no set ip precedence R1(config-pmap-c)#set dscp af21 R1(config-pmap-c)#class CLASS_10882 R1(config-pmap-c)#no set ip precedence R1(config-pmap-c)#set dscp af11
6.2. DSCPによるWRED
dscpによるWREDを行うよう設定を変更します。
R1(config)#interface Ethernet 1/0 R1(config-if)#random-detect dscp-based R1(config-if)#random-detect dscp af11 1 2 100
上記設定が反映された事を確認します。
R1#show queueing interface Ethernet 1/0 Interface Ethernet1/0 queueing strategy: random early detection (WRED) Random-detect not active on the dialer Exp-weight-constant: 9 (1/512) Mean queue depth: 0 dscp Random drop Tail drop Minimum Maximum Mark pkts/bytes pkts/bytes thresh thresh prob af11 0/0 0/0 1 2 1/100 af12 0/0 0/0 28 40 1/10 af13 0/0 0/0 24 40 1/10 af21 0/0 0/0 33 40 1/10 af22 0/0 0/0 28 40 1/10 af23 0/0 0/0 24 40 1/10 af31 0/0 0/0 33 40 1/10 af32 0/0 0/0 28 40 1/10 af33 0/0 0/0 24 40 1/10 af41 0/0 0/0 33 40 1/10 af42 0/0 0/0 28 40 1/10 af43 0/0 0/0 24 40 1/10 cs1 0/0 0/0 22 40 1/10 cs2 0/0 0/0 24 40 1/10 cs3 0/0 0/0 26 40 1/10 cs4 0/0 0/0 28 40 1/10 cs5 0/0 0/0 31 40 1/10 cs6 0/0 0/0 33 40 1/10 cs7 0/0 0/0 35 40 1/10 ef 0/0 0/0 37 40 1/10 rsvp 0/0 0/0 37 40 1/10 default 0/0 0/0 20 40 1/10 R1#
7. [補足] TCP global synchronization (検証失敗)
7.1. TCP global synchronization
TCP global synchronizationとは、輻輳発生時、全てのコンピュータが同時に送信速度を過度に遅めたり早めたりする現象です。このような現象が発生してしまうと、ネットワークを効率的に使用する事ができません。
RED/WREDを使用する目的の1つとして、このようなTCP global synchronizationを回避する事が挙げられます。
RED/WREDを使用する目的の1つとして、このようなTCP global synchronizationを回避する事が挙げられます。
この補足説明では、「TCP global synchronizationが本当に起こっているのか」「WREDによってTCP global synchronizationが回避できているのか」を確認します。
7.2. パケットカウンタ取得スクリプトの実装
TCP global synchronizationを確認するために、1秒毎の通信速度を取得する方法を考えます。
まずは、I/Fカウンタをsnmp経由で取得できるよう、コミュニティ名を定義します。
まずは、I/Fカウンタをsnmp経由で取得できるよう、コミュニティ名を定義します。
R1(config)#snmp-server community CCIE ro
サーバ側で、1秒毎にI/Fカウンタを取得するスクリプトを実装します。実装例は以下の通りです(IPアドレスやOIDは環境に応じて適宜変更して下さい)。
[root@localhost ~]# cat get_counter.sh file=$1 echo "output file is ${file}" while true do count=`snmpwalk -v 1 -c CCIE 192.168.201.1 IF-MIB::ifInOctets.1 | sed -e "s/.*Counter32: //g"` && echo `date`,${count} | tee -a ${file} & sleep 1 done [root@localhost ~]#
実行例は以下の通りです。私の場合は、第一引数に出力ファイル名を指定するように実装しました。
[root@localhost ~]# sh get_counter.sh count.csv output file is count.csv Sat Nov 13 16:54:14 JST 2010,125790252 Sat Nov 13 16:54:15 JST 2010,125790306
7.3. 動作確認
テストケースとしては、「WREDが無効の場合」「WREDが有効の場合」の2パターンを考えます。
それぞれのパターンで、以下wgetコマンドを実行し、3分間のI/Fカウンタの様子を取得します。
[root@localhost ~]# wget -O /dev/null http://192.168.200.100:10880/large.html --2010-11-13 16:39:33-- http://192.168.200.100:10880/large.html Connecting to 192.168.200.100:10880... connected. HTTP request sent, awaiting response... 200 OK Length: 23016000 (22M) [text/html] Saving to: `/dev/null' 24% [===========> ] 5,668,864 7.05K/s eta 34m 25s
7.4. 集計結果
上記の集計結果をexcelなどを用いて集計します。どちらもTCP global synchronizationは発生しているようでした。
1秒毎に集計した通信速度について以下のような分析を行いましたが、大きな差は見られません。
1秒毎に集計した通信速度について以下のような分析を行いましたが、大きな差は見られません。
指標 | WRED無効 | WRED有効 |
---|---|---|
平均 | 817 Kbps | 764 Kbps |
標準偏差 | 140 kbps | 114 kbps |
最大 | 1298 kbps | 1142 kbps |
最小 | 581 kbps | 475 kbps |
WREDについては、うまく設定が反映されていないようですので、機会を見てやりなおしたいと思います。
添付ファイル