QoSを導入したネットワークではフレームやパケットを判別し重要度に応じた取り扱いをしてくれます。全ての通信を平等に扱うのをとりやめ一定の規則に基づいた不公平を導入します。たとえば重要度が高く遅延 に敏感ですぐに送信しなければならないアプリケーションのフレームやパケットは送信待ちのほかの種類のものより先に送ります。
また同じアプリケーションを使っていてもユーザの種類や場所によって優先度を変えることもあります。逆に重要度が低くかつ今すぐ送信しなくてもよいフレー ムやパケットがあれば後回しにします。さらに必要に応じ重要度の低いフレームやパケットを廃棄し他の重要度の高い通信を守ります。
QoSを導入することでネットワークの帯域が増大するわけではありません。もし全てのアプリケーションの優先度が同じであれば不公平な取り扱いはできませ んからQoSを適用できません。しかし現実のネットワークでは重要度や遅延と廃棄に対する敏感さはアプリケーションやユーザの種類によって大きく異なって います。この性質を利用して故意に不公平な取り扱いをしてネットワークの限られた帯域をやりくりすることがQoSの役割です。
■Catalyst QoSの実装
CatalystのQoSの実装、アーキテクチャは機種ごとに異なり大きくわけて以下の3つに分類されます。
- Catalyst6500
- Catalyst4500
- Catalyst2960/3560/3750
また、Catalyst QoSの共通の特徴として以下が挙げられます。
- ハードウェア処理される (CPU負荷などには影響はない)
- ルータの輻輳制御のように必要時のみ発動するの ではなく設定をいれた時点で動作が変わる
- トラフィックが混雑していない環境で導入しても 意味はない
ここではCatalyst6500を前提にQoSを紹介します。
Catalyst6500では、ラインカード やPFC ( データプレーン ) / DFC ( 分散フォワーディングカード ) などの構成によってアーキテクチャが異なります。6500上ではQoS処理はPFCが実施することになります。一言でPFCといっても様々な種類があり、 ラインカードごとでキューの数も異なるので6500でQoS処理をかける場合は都度構成を確認する必要があり3750や2960でQoSを実施する場合と比較して非常に手間がかかります。
■Catalyst QoSのフロー
図で表しますと以下のようになります。
一般的かどうかわかりませんが、Catalystで帯域制限を行うことはできなくはないですが、あまり実務でやったことがありません。Catalyst側では優先制御、ルータ側では帯域制御というようにルータ・スイッチで役割分担をしながら導入することが多いです。
■クラス分け / マーキング
フレームまたはパケットをクラス分けする際に基準とするのが以下のものです。
- CoS ( Layer2 3bit )
- IP Precedence ( Layer3 3bit )
- DSCP ( Layer3 6bit )
- ACL ( Access Control List )
CoSについてはLayer2のフレームに付加される のでパケットでは伝えることができません。なおかつタグ付きのフレーム(Trunk)に限定されます。また、上記の値をフレーム(パケット)が到達した時点のものを使用するか上書きするか選択することができます。既に値 付けされたものを信用する(Trust)設定と上書きをするACLを用いたPolicy-Mapの両方を行うことが可能で す。
4つの選択基準がありますが、基本的にはどれを使用してもOKです。要件次第という部分もあるかと思いますが、Layer2レベルでの優先制御で Trunk接続しているのであればCoSでやればいいですしLayer3レベルであればIP PrecedenceかDSCPのどちらでも構いません。混在させることも可能ですがあまり意味はなく、policy-mapが設定されていれば Trustなどが設定されていても上書きされます。
■6500のQoS設定例
6500のQoS設定はSup2Tを境目に大幅に設定方法が変更されています。ここではSup2Tを前提に記載致します。
まず、6500ではデフォルトの状態でQoSは有効と なっています。そのため各物理インターフェイスではデフォルトでTrust DSCPの状態であり、3750や2960のように明示的にTrust設定を入れる必要はありません。但し、優先制御や帯域制御などのキューイング設定は行われなずキュー1しか使われない状態なので、これらは手動で設定を実施する必要があります。
6500でてっとり早くQoSの優先制御等をかけたい場合は以下の1行を追加するだけで設定が有効となります。下記の設定でPQが有効となり、その他のキューも有効となります。そしてPQに入ってきたパケットは意図しなくても優先制御がかかるようになります。また、旧来からの6500のQoS関係のコマ ンドを使用したい場合も以下が必要です。
(config)# auto qos default |
上述したようにSup2TではデフォルトでTrust DSCPです。これは無効化することはできません。CoS値を5にセットしDSCPよりも優先させる場合は以下のように設定を行います。
(config)# interface GigabitEthernet2/1 (config-if)# switchport access vlan 100 (config-if)# switchport mode access (config-if)# platform qos cos 5 (config-if)# paltform qos cos override |
Trust DSCPではなくTrust CoSにするには以下のように設定します。
(config)# interface GigabitEthernet2/1 (config-if)# switchport access vlan 100 (config-if)# switchport mode access (config-if)# platform qos trust cos |
policy-mapを使った設定例です。イ ンターフェイスGi0/1に着信するパケットはすべてDSCPをef ( 46 ) にセットしています。下記では物理インターフェイスに適用していますが、Port-Channelインターフェイスがある場合は、それに適用することも可能です。
(config)# access-list 100 permit ip any any (config)# class-map match-all QoS (config-cmap)# match access-group 100 (config)# policy-map QoS (config-pmap)# class QoS (config-pmap-c)# set dscp ef (config)# interface GigabitEthernet2/1 (config-if)# switchport access vlan 100 (config-if)# switchport mode access (config-if)# service-policy input QoS |
その他、DSCPやip precedenceで指定できる値は下記のようになります。
(config-pmap-c)# set dscp ? <0-63> Differentiated services codepoint value af11 Match packets with AF11 dscp (001010) af12 Match packets with AF12 dscp (001100) af13 Match packets with AF13 dscp (001110) af21 Match packets with AF21 dscp (010010) af22 Match packets with AF22 dscp (010100) af23 Match packets with AF23 dscp (010110) af31 Match packets with AF31 dscp (011010) af32 Match packets with AF32 dscp (011100) af33 Match packets with AF33 dscp (011110) af41 Match packets with AF41 dscp (100010) af42 Match packets with AF42 dscp (100100) af43 Match packets with AF43 dscp (100110) cs1 Match packets with CS1(precedence 1) dscp (001000) cs2 Match packets with CS2(precedence 2) dscp (010000) cs3 Match packets with CS3(precedence 3) dscp (011000) cs4 Match packets with CS4(precedence 4) dscp (100000) cs5 Match packets with CS5(precedence 5) dscp (101000) cs6 Match packets with CS6(precedence 6) dscp (110000) cs7 Match packets with CS7(precedence 7) dscp (111000) default Match packets with default dscp (000000) ef Match packets with EF dscp (101110) |
(config-pmap-c)# set ip precedence ? <0-7> Precedence value critical Match packets with critical precedence (5) flash Match packets with flash precedence (3) flash-override Match packets with flash override precedence (4) immediate Match packets with immediate precedence (2) internet Match packets with internetwork control precedence (6) network Match Packets with network control precedence (7) priority Match packets with priority precedence (1) routine Match packets with routine precedence (0) |
■キューイング
Catalyst6500ではラインカードによってキューの数やプライオリティキューの有無などが異なります。ラインカードごとの仕様についてはシスコの HPから確認する必要があるのですが、せっかくなので以下にまとめてみました。
ラインカード | RX | TX | スケジューラ |
VS-2T-10G | 2q4t | 1p3q4t | DWRR |
WS-X6708-10G | 3q4t | 1p7q4t | DWRR, WRED, SRR |
WS-X6716-10G | 1p7q2t ( 8q4t ) | 1p7q4t | DWRR, WRED, SRR |
WS-X6716-10T | 1p7q2t ( 8q4t ) | 1p7q4t | DWRR, WRED, SRR |
WS-X6748-GE-TX | 1q8t | 1p3q8t | DWRR |
WS-X6748-SFP | 2q8t | 1p3q8t | DWRR |
WS-X6724-SFP | 2q8t | 1p3q8t | DWRR |
RX / TXの1p3q4tという表記はpがpriority queueで優先キューの数、qはqueueでキューの数、tはthresholdで閾値の数を表します。これらの数によって設定出来る内容が異なってきます。例えば各ラインカードのTXのpriority queueの数は1個なので優先キューに設定できるのは共通して1個までです。また、PQを含めたキューの数 ( 4または8 ) だけMQCでclassを定義できるということになります。
下記は6500のキュー配置の一例です。共通して全てのラインカードのTXにはPQがあり、これ以外のキューでDWRRが実施されます。
実際にどのような配置になっているかは以下のコマンドで確認頂けます。配置を任意に変更することも可能ですが以下の状態で最適化されているため変更の必要はありません。
# show queueing interface GiX/Y <省略> Transmit queues [type = 1p3q8t]: Queue Id Scheduling Num of thresholds ----------------------------------------- 01 WRR 08 02 WRR 08 03 WRR 08 04 Priority 01 <省略> WRED disabled queues: queue thresh cos-map --------------------------------------- 1 1 0 1 2 1 1 3 1 4 1 5 1 6 1 7 1 8 2 1 2 2 2 3 4 2 3 2 4 2 5 2 6 2 7 2 8 3 1 6 7 3 2 3 3 3 4 3 5 3 6 3 7 3 8 4 1 5 <省略> |
■スケジューリング
6500のスケジューリングは主にDWRR ( Defict Weighted Round Robin ) が採用されています。ラインカードによってはこれに加えてWREDやSRRもサポートしている場合があります。
WRRはラウンドロビン方式で各キューの重み付けを行う最低保証帯域方式です。デフォルトではpriority-queue 以外の3つのキューでそれぞれ重み付けがされており、帯域幅をそれぞれのキューで重み付けに従い出力を行うという方式です。重みについては以下のコマンドで確認可能です。
# show queueing interface GiX/Y <省略> WRR bandwidth ratios: 100[queue 1] 150[queue 2] 200[queue 3] <省略> |
上の出力を例にとってみますと、以下 の計算式になります。
Q1 = weight1 / ( weight1 + weight2 + weight3 ) = 100 / ( 100+150+200 ) = 100/450 ≒ 222M
Q2 = weight2 / ( weight1 + weight2 + weight3 ) = 150 / ( 100+150+200 ) = 150/450 ≒ 333M
Q3 = weight3 / ( weight1 + weight2 + weight3 ) = 200 / ( 100+150+200 ) = 200/450 ≒ 444M
これらの値を任意に変更する場合はauto qos defaultが有効となっている必要があり、以下のように設定を実施します。( 値は一例です。 ) また、スケジューリング/キューイングはPort-Channelインターフェイスがあってもそれに適用することは出来ず必ず物理インターフェイスに 適用することになります。
(config)# interface GigabitEthernetX/Y (config-if)# wrr-queue bandwidth 22 33 45 |
wrr-queueコマンドは旧来からの6500のQoSコマンドですが、Sup2Tからは上記の設定に加え、ルータなどでよくおこなうMQC ( Modular QoS CLI ) で設定を行うことが可能です。下記はCoS5にマッチしたパケットを最優先させCoS0と1にマッチしたパケットに全体の10%の重みをつける設定です。cos値を指定していますが、この他にもdscp, ip-precedenceも指定可能です。また、priorityコマンドを指定できるクラスはラインカードのPQの数ということになりますので1個のみ指定可能です。
(config)# class-map type lan-queuing match-all CoS5 (config-class)# match cos 5 (config)# class-map type lan-queuing match-all CoS0 (config-class)# match cos 0 1 (config)# policy-map lan-queuing QoS (config-pmap)# class CoS5 (config-pmap-c)# priority (config-pmap)# class CoS0 (config-pmap-c)# bandwidth percent 10 (config)# interface GigabitEthernetX/Y (config-if)# service-policy type lan-queuing output QoS |
ちなみに上記設定を行わなくても、auto qos defaultを設定していればPQにパケットが配置されれば6500では自動的に優先制御がかかりますのでauto qos defaultが有効であれば不要な設定ということになります。
■帯域制御
6500ラインカードのWS-X67XXではshapingをかけることができます。shapeコマンドでは帯域幅を%で指定します。但し、いずれも直接帯域を指定するのではなくパーセンテージで指定する必要があります。注意点としてshapeコマンドは priorityコマンドとは併用できません。下記ではCoS値が2-4にマッチするパケットの帯域を20%に絞る設定です。
(config)# class-map type lan-queuing match-all CoS2 (config-class)# match cos 2 3 4 (config)# policy-map lan-queuing QoS (config-pmap)# class CoS2 (config-pmap-c)# shape average percent 20 (config)# interface GigabitEthernetX/Y (config-if)# service-policy type lan-queuing output QoS |
■バッファチューニング設定
QoSを有効にし物理ポートのキューが4つに分割された際に、各キューに対してバッファが割り当てられています。これもラインカードによりデフォルト値は異なりますが、以下のコマンドにて確認可能です。
# show queueing interface GiX/Y <省略> queue-limit ratios: 50[queue 1] 20[queue 2] 15[queue 3] 15[Pri Queue] <省略> |
これを任意の値に変更するときは以下のコマンドを実行します。注意点としてこれらはポートグループ単位で指定する必要があります。ポートグループ単位というのはASIC単位のことです。例えばポート1の設定を変更したい場合はポート1-12までを同じ設定にする必要があります。
(config)# interface range GigabitEthernetX/1-12 (config-if)# wrr-queue queue-limit 65 10 10 |
上記は従来からの6500の設定方法ですがSup2TからのMQCによる設定も可能です。各classに設定できるのは一つのみであり、設定例は下記となります。
(config)# class-map type lan-queuing match-all CoS6 (config-class)# match cos 6 7 (config)# class-map type lan-queuing match-all CoS2 (config-class)# match cos 2 3 4 (config)# policy-map lan-queuing QoS (config-pmap)# class CoS6 (config-pmap-c)# queue-buffers ratio 10 (config-pmap)# class CoS2 (config-pmap-c)# queue-buffers ratio 15 (config)# interface GigabitEthernet0/1 (config-if)# service-policy type lan-queuing output QoS |
■Tail-Dropの閾値調整
6500ではデフォルトでTail-Dropが採用されています。この閾値に達するとパケットは全てドロップされます。 PQを除く各キューごとに8つの閾値が設定されていますが、8つという数字はラインカードにより異なります。デフォルトで以下のように設定されています。
# show queueing interface GiX/Y <省略> queue tail-drop-thresholds -------------------------- 1 70[1] 100[2] 100[3] 100[4] 100[5] 100[6] 100[7] 100[8] 2 70[1] 100[2] 100[3] 100[4] 100[5] 100[6] 100[7] 100[8] 3 100[1] 100[2] 100[3] 100[4] 100[5] 100[6] 100[7] 100[8] <省略> |
これらの閾値を任意に変更するには以下のコマンドを実施します。注意点としてこれもASIC単位で設定する必要があります。ポート1の設定を変更したい場合はポート1-12までを同じ設定にする必要があります。
(config)# interface range GigabitEthernetX/1-12 (config-if)# wrr-queue threshold 1 100 100 100 100 100 100 100 100 100 (config-if)# wrr-queue threshold 2 100 100 100 100 100 100 100 100 100 (config-if)# wrr-queue threshold 3 100 100 100 100 100 100 100 100 100 (config-if)# wrr-queue threshold 4 100 100 100 100 100 100 100 100 100 |
これらをMQCで設定すると下記のようになります。下記ではcosを指定していますが、DSCPやip-precedenceを指定することも可能です。また、ひとつのクラスの中で複数の定義を行うことも可能でありますが、閾値を指定できる数はclass-map内でラインカードの閾値の数 ( 4または8 ) までとなります。
(config)# class-map type lan-queuing match-all CoS6 (config-class)# match cos 6 7 (config)# policy-map lan-queuing QoS (config-pmap)# class CoS6 (config-pmap-c)# queue-limit cos 6 percent 100 (config-pmap-c)# queue-limit cos 7 percent 100 (config)# interface GigabitEthernet0/1 (config-if)# service-policy type lan-queuing output QoS |
■WRED ( Weighted Random Early Detection ) で輻輳回避
デフォルトではTail-Dropが採用されており、優先度に関係なくランダムにパケットをドロップしていきますので、TCP 通信などにおいてはパフォーマンスが著しく低下することが起こりえます。そこでWREDではCoSやDSCPの値に応じて優先度の低いものから順にパケットをドロップするという仕組みを提供します。デフォルトでは以下のように設定されています。
# show queueing interface GiX/Y <省略> queue random-detect-min-thresholds ---------------------------------- 1 40[1] 70[2] 70[3] 70[4] 70[5] 70[6] 70[7] 70[8] 2 40[1] 70[2] 70[3] 70[4] 70[5] 70[6] 70[7] 70[8] 3 70[1] 70[2] 70[3] 70[4] 70[5] 70[6] 70[7] 70[8] queue random-detect-max-thresholds ---------------------------------- 1 70[1] 100[2] 100[3] 100[4] 100[5] 100[6] 100[7] 100[8] 2 70[1] 100[2] 100[3] 100[4] 100[5] 100[6] 100[7] 100[8] 3 100[1] 100[2] 100[3] 100[4] 100[5] 100[6] 100[7] 100[8] <省略> |
PQを除く各キューごとに8つの閾値が設定されています。8つという数字はラインカードにより異なります。min-thresholdsとはパケットが破棄され始める値でmax-thresholdsはこの値を下回るまで全てのパケットが破棄という値になります。最初のクラス分けの際にはキュー番号だけでなく、この閾値も合わせてキュー配置が決まります。
これらの閾値を任意に変更するには以下のコマンドを実施します。thresholdの次の数字がキューIDでそれ以降が閾値です。注意点としてqueue-limitと同様にこれもASIC単位で設定する必要があります。ポート1の設定を変更したい場合はポート1-12までを同じ設定にする必要があります。
(config)# interface range GigabitEthernetX/1-12 (config-if)# wrr-queue random-detect min-threshold 1 50 80 80 80 80 80 80 80 (config-if)# wrr-queue random-detect min-threshold 2 50 80 80 80 80 80 80 80 (config-if)# wrr-queue random-detect min-threshold 3 50 80 80 80 80 80 80 80 (config-if)# wrr-queue random-detect max-threshold 1 100 100 100 100 100 100 100 100 (config-if)# wrr-queue random-detect max-threshold 2 100 100 100 100 100 100 100 100 |
これらをMQCで設定すると下記のようになります。下記ではcosを指定していますが、DSCPやip-precedenceを指定することも可能です。また、ひとつのクラスの中で複数の定義を行うことも可能でありますが、random-detectを指定できる数はclass-map内でラインカードの閾値の数 ( 4または8 ) までとなります。
(config)# class-map type lan-queuing match-all CoS6 (config-class)# match cos 6 (config)# policy-map lan-queuing QoS (config-pmap)# class CoS6 (config-pmap-c)# random-detect cos 6 percent 50 100 (config-pmap-c)# random-detect cos 7 percent 30 100 (config)# interface GigabitEthernet0/1 (config-if)# service-policy type lan-queuing output QoS |
■QoS のshowコマンド
[ 参考 ] ※最後の部分でドロップのカウンタを確認することが可能です。
# show queueing interface Gi2/1 Interface GigabitEthernet2/1 queueing strategy: Weighted Round-Robin Port QoS is enabled Trust boundary disabled Port is untrusted Extend trust state: not trusted [COS = 0] Default COS is 0 Queueing Mode In Tx direction: mode-cos Transmit queues [type = 1p3q8t]: Queue Id Scheduling Num of thresholds ----------------------------------------- 01 WRR 08 02 WRR 08 03 WRR 08 04 Priority 01 WRR bandwidth ratios: 100[queue 1] 150[queue 2] 200[queue 3] queue-limit ratios: 50[queue 1] 20[queue 2] 15[queue 3] 15[Pri Queue] queue tail-drop-thresholds -------------------------- 1 70[1] 100[2] 100[3] 100[4] 100[5] 100[6] 100[7] 100[8] 2 70[1] 100[2] 100[3] 100[4] 100[5] 100[6] 100[7] 100[8] 3 100[1] 100[2] 100[3] 100[4] 100[5] 100[6] 100[7] 100[8] queue random-detect-min-thresholds ---------------------------------- 1 40[1] 70[2] 70[3] 70[4] 70[5] 70[6] 70[7] 70[8] 2 40[1] 70[2] 70[3] 70[4] 70[5] 70[6] 70[7] 70[8] 3 70[1] 70[2] 70[3] 70[4] 70[5] 70[6] 70[7] 70[8] queue random-detect-max-thresholds ---------------------------------- 1 70[1] 100[2] 100[3] 100[4] 100[5] 100[6] 100[7] 100[8] 2 70[1] 100[2] 100[3] 100[4] 100[5] 100[6] 100[7] 100[8] 3 100[1] 100[2] 100[3] 100[4] 100[5] 100[6] 100[7] 100[8] WRED disabled queues: queue thresh cos-map --------------------------------------- 1 1 0 1 2 1 1 3 1 4 1 5 1 6 1 7 1 8 2 1 2 2 2 3 4 2 3 2 4 2 5 2 6 2 7 2 8 3 1 6 7 3 2 3 3 3 4 3 5 3 6 3 7 3 8 4 1 5 Queueing Mode In Rx direction: mode-cos Receive queues [type = 1q8t]: Queue Id Scheduling Num of thresholds ----------------------------------------- 01 WRR 08 WRR bandwidth ratios: 100[queue 1] queue-limit ratios: 100[queue 1] queue tail-drop-thresholds -------------------------- 1 100[1] 100[2] 100[3] 100[4] 100[5] 100[6] 100[7] 100[8] queue thresh cos-map --------------------------------------- 1 1 0 1 2 3 4 5 6 7 1 2 1 3 1 4 1 5 1 6 1 7 1 8 Packets dropped on Transmit: BPDU packets: 0 queue dropped [cos-map] --------------------------------------------- 1 0 [0 1 ] 2 0 [2 3 4 ] 3 0 [6 7 ] 4 0 [5 ] Packets dropped on Receive: BPDU packets: 0 queue dropped [cos-map] --------------------------------------------- 1 0 [0 1 2 3 4 5 6 7 ] |