◆ CBWFQ(Class-Based WFQ)とは
CBWFQは、管理者が定義したクラスごとに個別のキューが割り振られるキューイング方式です。CBWFQ
における「クラス」とはACLなどで定義した「トラフィックグループ」を指します。
CBWFQは、CQとWFQの機能の2つの要素を持っています。CQではキューごとに帯域幅をバイトカウント
により指定していましたが、CBWFQではキューごとに「bandwidth」コマンドによって最低保証帯域幅を
設定することができます。WFQではキューごとに格納するパケットの優先度に基づき、キューのウェイト
付けが行われましたが、CBWFQでもbandwidthコマンドの定義により、実質的にはキューのウェイト付け
が行われます。また、CBWFQで手動作成した各キューの中にあるパケットは小さいものから排出されます。
上図の注意点として、CBWFQで手動作成するキューは、そのキュー内部でのパケット処理はFIFO同様に
先入れ先出し処理がされます。ただし、class-defaultとして定義するキューについてはそのキュー内部の
パケット処理はFIFOまたはWFQのどちらかを指定できます。また、bandwidthコマンドによって帯域幅を
指定しても、それが厳密に保証されるわけではないのでご注意下さい。CBWFQやLLQを実装することに
なった場合、導入前には必ず負荷試験を実施してbandwidthコマンドの動作確認することをお勧めします。
CBWFQを理解するために下図もご参考下さい。トラフィックグループをACLで定義して、それに合致する
トラフィックが各クラスのキューに転送されていきますが、全てのクラスに合致しない場合はclass-default
と呼ばれるクラスで転送処理されます。そのため、class-defaultのキューはdefault queueとも呼ばれます。
◆ CBWFQ - Ciscoルータのコンフィグ設定
CBWFQではMQC(Modular QoS CLI)と呼ばれる機能で設定します。MQCでは、共通のコマンド構文を定義
したりすることで簡単にCiscoルータやCatalystスイッチでQoS設定ができる設計となっています。MQCでは
以下の3つのステップでコンフィグレーションします。
Step1:class-mapコマンドでトラフィッククラスを定義
Step2:policy-mapコマンドで1つまたは複数のQoS機能をトラフィッククラスに関連付け、ポリシーを作成
Step3:service-policyコマンドでインターフェースにトラフィックポリシーを割り当て
Step1:class-mapコマンドでトラフィックの分類
◆ class-mapの設定
(config)# class-map [ match-any | match-all ] name
(config-cmap)# match 合致条件
コマンド引数 |
説明 |
match-any |
複数の合致条件が指定されている時に、いずれか1つに合致すればmatchしたと見なす。
|
match-all |
デフォルト値。複数の合致条件が指定されている時に、全ての条件に合致すればmatchしたと見なす。
|
合致条件 |
トラフィッククラスの合致条件をACL、プロトコル、DSCP値などで指定。主なものは以下のとおり。
match access-group acl-number
match input-interface interface-id
match ip precedence value
match ip dscp value
match protocol protocol-name
|
Step2:policy-mapコマンドで各クラスに割り当てる保証帯域幅を次の3つのいずれかの方法で指定
◆ policy-mapの設定
(config)# policy-map name
(config-pmap)# class name
(config-pmap-c)# bandwidth [ kbps | percent percentage | remaining percent percentage ]
コマンド引数 |
説明 |
bandwidth kbps |
キューに割り当てる保証帯域幅を「kbps」の単位で指定。
|
bandwidth percent percentage |
キューに割り当てる保証帯域幅を物理I/Fのリンクレートの割合「%」で指定
|
bandwidth remaining
percent percentage |
キューに割り当てる保証帯域幅を他のクラスに割り当てられていない帯域幅の「%」で指定
|
※ bandwidthで理論上の最低保証帯域幅を設定しても、輻輳が発生せず利用可能な帯域があれば設定値以上の帯域幅の使用も可能。
※ 上記の3つのコマンドは排他的なので、各クラスで設定するbandwidthコマンドは上記のどれか1つに統一させる必要があります。
◆ policy-map - オプション設定(各クラスのキューリミットの設定)
(config-pmap-c)# queue-limit value
コマンド引数 |
説明 |
value |
キューが保持できる最大パケット数(キューの深さ)。デフォルト値は機種により異なる。
|
※ queue-limitで一定の値を指定した意図的なテールドロップ、またはrandom-detectによるパケットドロップの手法があります。
◆ policy-map - オプション設定(class-defaultのキューイング設定)
(config-pmap)# class class-default
(config-cmap-c)# fair-queue dynamic-queue-number
コマンド引数 |
説明 |
fair-queue |
class-defaultのキューをWFQとして動作させたい場合は「fair-queue」と指定
|
dynamic-queue-number |
class-defaultのキューをWFQとして動作させる時に、動的に作成されるキューの最大数を指定 |
Step3:service-policyコマンドで出力インターフェースにポリシーを適用
◆ service-policyコマンドの設定
(config)# interface interface-id
(config-if)# service-policy output policy-name
◆ CBWFQ、LLQ - 75%ルール(レガシーなルール)
CBWFQの全てのclass-mapの合計で利用できる帯域幅は、物理インターフェースの帯域幅の75%を上限
としています。これがCBWFQやLLQの仕様です。※ 正確には show interface の「BW」を見ています。
残りの 25% はルーティングトラフィックやキープアライブパケットなどで使用する、ということですが
CBWFQが開発されていると時の利用可能な帯域幅と、現在のいわゆる利用可能な帯域幅は大きく変化
しており、設計上この値の変更が必要な場合、出力インターフェースで以下のコマンドで変更できます。
◆ 利用可能な帯域幅の上限値の変更
(config)# interface interface-id
(config-if)# max-reserved-bandwidth percent
max-reserved-bandwidthでデフォルト「75」から値を変更する場合、念のために事前検証をしましょう。
|