Ciscoルータ QoS

スポンサーリンク

■ルータ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-allmatch-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
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする