■ルータQoSの実装
CatalystのQoSと比較してルータのQoSでは以下のような特徴が挙げられます。
- ハードウェア処理ではなくソフトウェア処理
- そのため発動時にはCPU負荷が上昇する
- 輻輳時のみ発動する
- 機種ごとに設定が異なることはない
Catalystではどちらかというと優先制御が主であり、ルータでは帯域制御、輻輳制御がメインになってくると思っています。。帯域制御、輻輳制御には以下のようなものがあります。
輻輳制御 | PQ ( Priority Queuing ) |
CQ ( Custom Queing ) | |
WFQ ( Weighted Fair Queing ) | |
CBWFQ ( Class Based WFQ ) | |
LLQ ( Low Latency Queuing ) | |
帯域制御 | GTS ( Generic Traffic Shaping ) |
CB-Shaping ( Class Based Shaping ) | |
CAR ( Commited Access Rate ) | |
輻輳回避 | WRED ( Weighted Random Early Detection ) |
ここでは実務でよく利用するCBWFQ / LLQ / CB-Shaping / WREDについてメモ書きを残します。
■CBWFQのパケットの分類
Catalystにおいてもルータにおいてもまずパケットを分類という作業から始まります。Catalystにおいてクラス分けの基準となるのは以下のものでした。
- CoS ( Layer2 3bit )
- IP Precedence ( Layer3 3bi t)
- DSCP ( Layer3 6bit )
- ACL ( Access Control List )
分類についてはルータであっても同様なのですが、CoSやDSCPで分類をするということはあまり現場でみかけません。大半はACLを用いたPolicy Mapを用いることが多いです。
ACLを用いた分類の設定例が以下です。
(config)# access-list 100 permit ip any any (config)# class-map match-all QoS (config-cmap)# match access-group 100 (config-cmap)# match ip precedence 0 |
(config)# access-list 100 permit ip any any (config)# class-map match-any QoS (config-cmap)# match access-group 100 (config-cmap)# match ip precedence 0 |
class-mapを定義する際はmatch-allとmatch-anyの二つあります。match-allはmatchで定義した条件全てを満たす必要があります。match-anyはmatchで定義した条件のいずれかを満たせばよいという意味です。
matchで使用できる条件は主にACL / CoS(Dot1q Subinterface) / DSCP / IP Precedenseになります。(厳密にはこれだけではありませんが) また、CatalystのようにCoSやDSCPなどをTrustするという設定はルータにはありません。
■CBWFQの輻輳制御
シスコルータの輻輳制御は輻輳発生時のみ発動します。ネットワークが混雑していない環境下で将来的にも輻輳が発生しない場合、輻輳制御を設定してもそれは意味がないということになります。
上記のパケットを分類後、分類されたパケットに対して帯域制御、帯域保証等の制御を加えることが可能です。加えることの出来る主な制御は以下の通りです。
in / out | set ip precedense |
set dscp | |
out | shaping (帯域制御) |
bandwidth (帯域保証) | |
set cos |
以下、設定例です。
(config)# access-list 100 permit tcp 172.16.0.0 0.15.255.255 any eq 80 (config)# access-list 101 permit tcp 192.168.0.0 0.0.255.255 any eq 80 (config)# class-map match-all QoS1 (config-cmap)# match access-group 100 (config)# class-map match-all QoS2 (config-cmap)# match access-group 101 (config)# policy-map QoS (config-pmap)# class QoS1 (config-pmap-c)# bandwidth 1000 (config-pmap)# class QoS2 (config-pmap-c)# bandwidth 2000 (config)# interface Ethernet0/1 (config-if)# service-policy output QoS |
上記のclassで定義されたトラフィックが単一のフローとして認識され同一Queueに格納されます。上記では
- 172.16.0.0/12から任意のHTTPアクセスに対するパケット全て
- 192.168.0.0/16から任意のHTTPアクセスに対するパケット全て
に対してQoS処理を実施しています。
Catalyst2960や3750ではoutput queueはハードウェア的な仕様で4つと決まっていましたがルータにおけるキューは上記のclassがキューになり、ソフトウェア的に任意に作成することが可能です。このclassの中では特別な区別はなくFIFOで処理されます。
bandwidthコマンドは最低帯域保証のコマンドで単位はKbpsです。上記はトラフィックが輻輳した際にclass QoS1が1Mbps,、QoS2が2Mbpsの帯域が保証されるという動きになります。輻輳は起きずに帯域に余裕がある場合は上記のbandwidthで設定した値を基準に各classに余剰帯域を割り当てることになります。
帯域全体=10M
QoS1に1M、QoS2に2Mで合計3Mが帯域保証で指定されている
残っている帯域=10M-3M=7M
QoS1に割り当てられた割合=7M * ( 1M / 1M+2M ) + 1M = 約3.3M
QoS2に割り当てられた割合=7M * ( 2M / 1M+2M ) + 2M = 約6.6M
という計算になり単に帯域が保証されるだけではなく、指定した値を基準に各キューに対して帯域が割り振られることになります。但し、これらはいずれも輻輳時に限った話で輻輳が起きていなければ発動することはありません。あと、注意頂きたいのはこれらCBWFQはoutboundのみで使用可能でinboundで適用することは仕様上不可です。
設定内容の確認やパケット数を見るには以下のコマンドで確認可能です。
# show policy-map interface fa0/0 FastEthernet0/0 Service-policy output: QoS Class-map: QoS1 (match-all) 0 packets, 0 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: access-group 100 Queueing Output Queue: Conversation 265 Bandwidth 1000 (kbps)Max Threshold 64 (packets) (pkts matched/bytes matched) 0/0 (depth/total drops/no-buffer drops) 0/0/0 Class-map: QoS2 (match-all) 0 packets, 0 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: access-group 101 Queueing Output Queue: Conversation 266 Bandwidth 2000 (kbps)Max Threshold 64 (packets) (pkts matched/bytes matched) 0/0 (depth/total drops/no-buffer drops) 0/0/0 Class-map: class-default (match-any) 28 packets, 2888 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: any |
■LLQの輻輳制御
上記のCBWFQに対してpriorityコマンドを付加したのがLLQです。分類に関しては全く同じでパケットに対する制御が以下のようになります。
in / out | set ip precedense |
set dscp | |
out | shaping (帯域制御) |
bandwidth (帯域保証) | |
priority (帯域保証/帯域制限) | |
set cos |
例えば以下のような設定例の場合。
(config)# access-list 100 permit tcp 172.16.0.0 0.15.255.255 any eq 80 (config)# access-list 101 permit tcp 192.168.0.0 0.0.255.255 any eq 80 (config)# class-map match-all QoS1 (config-cmap)# match access-group 100 (config)# class-map match-all QoS2 (config-cmap)# match access-group 101 (config)# policy-map QoS (config-pmap)# class QoS1 (config-pmap-c)# priority 1000 (config-pmap)# class QoS2 (config-pmap-c)# bandwidth 2000 (config-pmap)# class class-default (config-pmap-c)# bandwidth 4500 (config)# interface Ethernet0/1 (config-if)# service-policy output QoS # show policy-map interface |
class QoS1は最優先キューとなり、輻輳時にはこのキューのパケットが最優先して送信されます。なおかつ、帯域の上限は1000Kbps(1M)となっており、輻輳時にこの上限を超えようとするとパケットはドロップ ( ポリシング ) されます。また、上記ではclass-defaultでclass QoS1/QoS2のいずれにも該当しないトラフィックに4.5Mの帯域を割り当てています。
上記設定のshow policy-mapの出力は以下のようになります。
#show policy-map interface fa0/0 FastEthernet0/0 Service-policy output: QoS Class-map: QoS1 (match-all) 0 packets, 0 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: access-group 100 Queueing Strict Priority Output Queue: Conversation 264 Bandwidth 1000 (kbps) Burst 25000 (Bytes) (pkts matched/bytes matched) 0/0 (total drops/bytes drops) 0/0 Class-map: QoS2 (match-all) 0 packets, 0 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: access-group 101 Queueing Output Queue: Conversation 266 Bandwidth 2000 (kbps)Max Threshold 64 (packets) (pkts matched/bytes matched) 0/0 (depth/total drops/no-buffer drops) 0/0/0 Class-map: class-default (match-any) 75 packets, 7537 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: any Queueing Output Queue: Conversation 265 Bandwidth 4500 (kbps)Max Threshold 64 (packets) (pkts matched/bytes matched) 0/0 (depth/total drops/no-buffer drops) 0/0/0 |
■CB-Shaping ( 帯域制御 )
上記のCBWFQと組み合わせることの出来る帯域制御です。要はclass別にshpage averageで制限したい帯域を指定します。
(config)# access-list 100 permit ip 172.16.0 0.15.255.255 any eq 80 (config)# access-list 101 permit ip 192.168.0.0 0.0.255.255 any eq 80 (config)# class-map match-all QoS1 (config-cmap)# match access-group 100 (config)# class-map match-all QoS2 (config-cmap)# match access-group 101 (config)# policy-map QoS (config-pmap)# class QoS1 (config-pmap-c)# shapge average 5000000 (config-pmap)# class QoS2 (config-pmap-c)# shapge average 5000000 (config)# interface Ethernet0/1 (config-if)# service-policy output QoS # show policy-map interface |
上記でclass QoS1 / QoS2に対してそれぞれ5Mの制限がかかります。bandwidthと違って単位はbpsです。またキューイングはFIFOが適用されます。上記ではshape averageのみ記載していますがbandwidthを合わせて記載することも可能です。
このときのpolicy-mapの出力は以下のようになります。
# show policy-map interface fa0/0 FastEthernet0/0 Service-policy output: QoS Class-map: QoS1 (match-all) 0 packets, 0 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: access-group 100 Traffic Shaping Target/Average Byte Sustain Excess Interval Increment Rate Limit bits/int bits/int (ms) (bytes) 5000000/5000000 31250 125000 125000 25 15625 Adapt Queue Packets Bytes Packets Bytes Shaping Active Depth Delayed Delayed Active - 0 0 0 0 0 no Class-map: QoS2 (match-all) 0 packets, 0 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: access-group 101 Traffic Shaping Target/Average Byte Sustain Excess Interval Increment Rate Limit bits/int bits/int (ms) (bytes) 5000000/5000000 31250 125000 125000 25 15625 Adapt Queue Packets Bytes Packets Bytes Shaping Active Depth Delayed Delayed Active - 0 0 0 0 0 no Class-map: class-default (match-any) 128 packets, 13133 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: any |
■WRED ( Weighted Random Early Detection ) で輻輳回避
WREDとは輻輳回避の技術です。帯域以上のパケットを出力する場合、当然キュー溢れが発生し、限界を越えるとそれらのパケットは全てドロップされます。これをTail-Dropと呼びます。
これに対しREDはキューが限界に到達する以前に予め定められた閾値を越えるとランダムにパケットをドロップする方式です。ただ、あくまでランダムなのでパケットに付与された重要度というのは関係ありません。重要度に応じてパケットをドロップする方式がこのWREDというわけです。
設定例は下記のようになります。基本は物理インターフェイスに対して設定を行います。
(config-if)# random-detect (config-if)# random-detect [ precedence | dscp ] value min max mark |
random-detectだけで有効となり、閾値についてはデフォルトで設定されていますがこれらを変更する場合はip-precedenceまたはdscpの特定の値に対してmin / max / markの値を設定します。minはパケットが破棄され始める値、maxは全てのパケットが破棄され始める値、markはmaxに達した時にドロップする割合を示します。例えばmarkに10を設定すると10パケットに1パケットをドロップするということになります。
random-detectのみを有効にした場合のshowコマンドが以下です。
(config)# interface FastEthernet0/0 (config-if)# random-detect # show queueing random-detect Current random-detect configuration: FastEthernet0/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 |
これらを任意に変更する際にはそれぞれの値を個別に指定します。
(config)# interface FastEthernet0/0 (config-if)# random-detect (config-if)# random-detect precedence 0 30 50 20 # show queueing random-detect Current random-detect configuration: FastEthernet0/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 30 50 1/20 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 |
上記では物理インターフェイスに適用していますが、class内で定義することも可能です。但し、class内で設定する際にはbandwidthが設定されているのが前提条件となりますのでCBWFQの併用として可能なんだと思います。
(config)# access-list 100 permit tcp 172.16.0.0 0.15.255.255 any eq 80 (config)# access-list 101 permit tcp 192.168.0.0 0.0.255.255 any eq 80 (config)# class-map match-all QoS1 (config-cmap)# match access-group 100 (config)# class-map match-all QoS2 (config-cmap)# match access-group 101 (config)# policy-map QoS (config-pmap)# class QoS1 (config-pmap-c)# bandwidth 1000 (config-pmap-c)# random-detect (config-pmap)# class QoS2 (config-pmap-c)# bandwidth 2000 (config-pmap-c)# random-detect (config)# interface Ethernet0/1 (config-if)# service-policy output QoS |