↓ メインコンテンツへスキップ
  1. ネットワーク 記事一覧/
  2. MPLS記事一覧/

MPLSのQoSの帯域制御とキューイング(policer / shaper / priority)

目次

MPLSのQoSの帯域制御とキューイング(policer / shaper / priority)

MPLS網で流量を抑える方法は2つあります。policerは超えた分をその場で捨て、shaperはいったん貯めて送り出す時間を延ばします。捨てるか遅らせるかの違いは、実際にパケットを流すと損失と遅延の差になって出ます。さらに、クラスごとにキューを分ければ、優先するトラフィックだけ遅延を小さく保てます。この記事ではIOS XRでの書き方を解説し、XRv9000のラボで損失と遅延を測ります。

ラベルのEXP(RFC 5462の正式名はTC)と出口PEの3モードはMPLSのQoS(EXPとuniform / pipe / short-pipe)で解説しています。

policerとshaper

項目policershaper
超えた分捨てる(またはマークを下げる)キューに貯めて後で送る
効き方損失として出る遅延として出る
IOS XRの書き方police rate <値>shape average <値>
使える方向入力・出力とも出力のみ

policerはconform(範囲内)とexceed(超過)でカウンタが分かれ、超えた分は既定で捨てられます。shaperは超えた分をキューに入れるため、キューの深さを超えない限り捨てません。

クラスごとにキューを分ける

親でshapeして全体の上限を決め、子でクラスを分けると、限られた帯域の中での優先度を決められます。

コマンド動作
priority level 1他のクラスより先に送る(優先キュー)
police rate <値>(priorityと併用)優先キューが帯域を占有しないよう上限を付ける
bandwidth remaining percent <割合>優先キューが使った残りの配分

コア側の出力ではパケットにラベルが付いているので、クラス分けはmatch dscpではなくmatch mpls experimental topmostで行います。IPヘッダーはラベルの内側にあるためで、実際にコア側の出力でmatch dscpのクラスを作ったときは一致が0件でした。

検証構成

CE1 - PE1 - P1 - PE2 - CE2の5台で、コアはOSPF + LDP、PE間はiBGP vpnv4です。PE1 / P1 / PE2はXRv9000、CE1 / CE2はXRdを使います。

検証構成

負荷はCE1からCE2へのpingで、1パケット1400バイト、10ミリ秒間隔です。XRdを挟む区間では1500バイトを超えるパケットが通らないため、この大きさにしています。

検証の全体像

STEP操作確かめること
7入口PEの入力にpolice rate 100 kbps超過分が捨てられ、損失として出ること
8コア側の出力に2段構成のshape average 200 kbps捨てずに遅延が伸びること
9親shape + 子priority / bandwidth remaining優先クラスだけ遅延が小さいこと
10QoSの設定をすべて外す元に戻ること

policerで捨てる(STEP 7)

PE1の顧客側の入力にpolice rate 100 kbpsを当て、1400バイトを500発流しました。334発が通り、166発が捨てられました。

STEP 7 PE1 show policy-map interface GigabitEthernet0/0/0/0 input(抜粋)
Class class-default
  Classification statistics          (packets/bytes)     (rate - kbps)
    Matched             :                 498/706164               33
    Transmitted         : N/A
    Total Dropped       :                 166/235388               11
  Policing statistics                (packets/bytes)     (rate - kbps)
    Policed(conform)    :                 332/470776               22
    Policed(exceed)     :                 166/235388               11

Matchedが498でconformが332、exceedが166です。pingの結果も334/500(66パーセント)で一致します(採取の瞬間に2発が通過中でした)。RTTは9/15/71ミリ秒で、通った分の遅延は増えていません。

shaperで遅らせる(STEP 8)

policerを外し、コア側の出力に2段構成のshape average 200 kbpsを当てました(親のclass-defaultで整形し、子はclass-defaultにbandwidth remaining percent 100を置いた形です)。同じ負荷で500発すべてが通り、RTTの平均は56ミリ秒(policerを当てていたSTEP 7では15ミリ秒)です。

STEP 8 PE1 show policy-map interface GigabitEthernet0/0/0/1 output(抜粋)
Class class-default
  Classification statistics          (packets/bytes)     (rate - kbps)
    Matched             :                 468/667368               201
    Transmitted         :                 468/667368               201
    Total Dropped       :                   0/0                    0

  Policy PE1-CORE-SHAPE-CHILD Class class-default
    Classification statistics          (packets/bytes)     (rate - kbps)
      Matched             :                 468/667368               201
      Transmitted         :                 468/667368               201
      Total Dropped       :                   0/0                    0
    Queueing statistics
      Queue ID                             : 32
      High watermark                       : N/A
      Inst-queue-len                       : N/A
      Avg-queue-len                        : N/A
      Taildropped(packets/bytes)           : 0/0
      Queue(conform)      :                 468/667368               201

Total Droppedは0で、Taildroppedも0でした。捨てずに送り切っています。policerが損失として現れるのに対し、shaperは遅延として現れます。

クラスごとにキューを分ける(STEP 9)

コア側の出力を、親shape average 300 kbpsと子policyの組に替えました。子はEXP 5をpriority level 1とpolice rate 100 kbps、EXP 4をbandwidth remaining percent 20、残りをclass-defaultにしています(ラボのクラス名はTC5 / TC4で、showの出力にもこの名前で出ます)。CE1からDSCP 46(EXP 5)、DSCP 34(EXP 4)、DSCP 0の3種類を4秒ずらして各1000発流しました。

負荷DSCPEXPクラス結果RTT min/avg/max
ToS 18446(EF)5priority668/10006/10/87 ミリ秒
ToS 13634(AF41)4bandwidth remaining 20%1000/10008/71/144 ミリ秒
ToS 000class-default1000/10008/71/134 ミリ秒
STEP 9 PE1 show policy-map interface GigabitEthernet0/0/0/1 output(抜粋)
Class class-default
  Classification statistics          (packets/bytes)     (rate - kbps)
    Matched             :                2995/4270870              31
    Transmitted         :                2664/3798864              21
    Total Dropped       :                 331/472006               10

  Policy PE1-CORE-QUEUE-CHILD Class TC5
    Classification statistics          (packets/bytes)     (rate - kbps)
      Matched             :                 995/1418870              31
      Transmitted         :                 664/946864               21
      Total Dropped       :                 331/472006               10
    Policing statistics                (packets/bytes)     (rate - kbps)
      Policed(conform)    :                 664/946864               21
      Policed(exceed)     :                 331/472006               10
      Policed(violate)    :                   0/0                    0
      Policed and dropped :                 331/472006
      Policed and dropped(parent policer)  : N/A
    Queueing statistics
      Queue ID                             : 40
      High watermark                       : N/A
      Inst-queue-len                       : N/A
      Avg-queue-len                        : N/A
      Taildropped(packets/bytes)           : 0/0
      Queue(conform)      :                 664/946864               21
      RED random drops(packets/bytes)      : 0/0


  Policy PE1-CORE-QUEUE-CHILD Class TC4
    Classification statistics          (packets/bytes)     (rate - kbps)
      Matched             :                1000/1426000              0
      Transmitted         :                1000/1426000              0
      Total Dropped       :                   0/0                    0
    Queueing statistics
      Queue ID                             : 41
      High watermark                       : N/A
      Inst-queue-len                       : N/A
      Avg-queue-len                        : N/A
      Taildropped(packets/bytes)           : 0/0
      Queue(conform)      :                1000/1426000              0
      RED random drops(packets/bytes)      : 0/0


  Policy PE1-CORE-QUEUE-CHILD Class class-default
    Classification statistics          (packets/bytes)     (rate - kbps)
      Matched             :                1000/1426000              0
      Transmitted         :                1000/1426000              0

優先キューに入れたクラスだけ、遅延が設定前と同じ水準に収まります。他の2クラスは親のshaperのキューで待たされ、平均70ミリ秒になりました。優先キューに付けたpolice rate 100 kbpsが超過分333発を捨てているため、EFは667/1000です。上限を付けないと、優先キューが帯域を占有して他のクラスが流れなくなります。

設計上の注意

  • コア側の出力でmatch dscpのクラスを作っても一致しませんでした(ラベルが付いているため)。EXPで分けるか、入力でqos-groupに写して出力で使います
  • priorityのクラスには上限(police)を付けます。付けないと他のクラスが送れなくなります
  • policerは損失、shaperは遅延として出ます。遅延に敏感なトラフィックをshaperの後ろに置くと、損失が無くても品質が落ちます

検証Configおよびshow結果

各STEPで5台から、次の種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。カウンタはクリアしてからpingを流し、その後にshowを取っているので、各STEPの数値はそのSTEPだけの結果です。

ファイル内容
..._clear.txtそのSTEPの採取前にクリアしたカウンタ(QoS、インタフェース、MPLS転送)
..._ping.txtクリアの後に流したping / traceroute
..._load_tos<値>.txtCE1からかけた負荷(1400バイト、10ミリ秒間隔)の結果
..._pmap-before.txt / ..._pmap-after.txt負荷の直前と直後に取ったshow policy-map interface
..._show.txtshow version / show interface / show ospf database / show policy-map interface / show mpls forwarding など(PE・Pは1台70コマンド)
..._log.txtそのSTEPの範囲だけに絞ったshow logging。クリアの記録もSTEP<N>-CLEAR:として残っています
..._run.txtそのSTEP時点のshow running-config
..._trace.txtshow mpls ldp trace peer(PE1 / P1 / PE2)
..._commit.cfgそのSTEPで実際にcommitされた設定(変更したルータのみ)

..._show.txtのshow policy-map interfaceと..._pmap-after.txtでは数字が違います。 前者はカウンタをクリアした後に流した各STEPのping(数十発)だけが載り、後者は負荷(1000発や500発)が載ります。本文のpolicy-mapの引用は..._pmap-after.txtからです。

STEP 7:入口PEの入力にpolicerを当てる

ルータクリアpingshow出力syslogrunning-configtrace投入した設定負荷前のpolicy-map負荷後のpolicy-map
CE1clearpingshowlogrun————
PE1clearpingshowlogruntracecommitbeforeafter
P1clearpingshowlogruntrace———
PE2clearpingshowlogruntracecommit——
CE2clearpingshowlogrun————

STEP 8:コア側の出力に2段構成のshaperを当てる

ルータクリアpingshow出力syslogrunning-configtrace投入した設定負荷前のpolicy-map負荷後のpolicy-map
CE1clearpingshowlogrun————
PE1clearpingshowlogruntracecommitbeforeafter
P1clearpingshowlogruntrace———
PE2clearpingshowlogruntrace———
CE2clearpingshowlogrun————

STEP 9:親shaperと子policyでクラスを分ける

ルータクリアpingshow出力syslogrunning-configtrace投入した設定負荷前のpolicy-map負荷後のpolicy-map
CE1clearpingshowlogrun————
PE1clearpingshowlogruntracecommitbeforeafter
P1clearpingshowlogruntrace———
PE2clearpingshowlogruntrace———
CE2clearpingshowlogrun————

STEP 10:QoSの設定をすべて外す(最終状態)

ルータクリアpingshow出力syslogrunning-configtrace投入した設定
CE1clearpingshowlogrun——
PE1clearpingshowlogruntracecommit
P1clearpingshowlogruntrace—
PE2clearpingshowlogruntrace—
CE2clearpingshowlogrun——

CE1からかけた負荷(ping ... size 1400 interval 10)の記録です。負荷の直後のpolicy-mapは上の表の「負荷後のpolicy-map」です。

STEPToS結果ファイル
70334/500、RTT 9/15/71 msload
80500/500、RTT 18/56/132 msload
901000/1000、RTT 8/71/134 msload
91361000/1000、RTT 8/71/144 msload
9184668/1000、RTT 6/10/87 msload

パケットキャプチャーはSTEPごとに4リンクで取得しています。

STEPCE1-PE1間PE1-P1間P1-PE2間PE2-CE2間
7pcappcappcappcap
8pcappcappcappcap
9pcappcappcappcap
10pcappcappcappcap

参考

参考内容
RFC 3270MPLS Support of Differentiated Services。EXPとPHBの対応付け
検証環境XRv9000 26.1.1(PE1 / P1 / PE2)、XRd 26.1.1(CE1 / CE2)、Cisco Modeling Labs

関連記事