MPLSのQoSの帯域制御とキューイング(policer / shaper / priority)
MPLS網で流量を抑える方法は2つあります。policerは超えた分をその場で捨て、shaperはいったん貯めて送り出す時間を延ばします。捨てるか遅らせるかの違いは、実際にパケットを流すと損失と遅延の差になって出ます。さらに、クラスごとにキューを分ければ、優先するトラフィックだけ遅延を小さく保てます。この記事ではIOS XRでの書き方を解説し、XRv9000のラボで損失と遅延を測ります。
ラベルのTCと出口PEの3モードはMPLSのQoS(TCとuniform / pipe / short-pipe)で解説しています。
policerとshaper
| 項目 | policer | shaper |
|---|---|---|
| 超えた分 | 捨てる(またはマークを下げる) | キューに貯めて後で送る |
| 効き方 | 損失として出る | 遅延として出る |
| 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 |
優先クラスだけ遅延が小さいこと |
| 10 | QoSの設定をすべて外す | 元に戻ること |
policerで捨てる(STEP 7)
PE1の顧客側の入力にpolice rate 100 kbpsを当て、1400バイトを500発流しました。334発が通り、166発が捨てられました。
Class class-default
Classification statistics (packets/bytes) (rate - kbps)
Matched : 500/709000 30
Transmitted : N/A
Total Dropped : 166/235388 10
Policed(conform) : 334/473612 20
Policed(exceed) : 166/235388 10Matchedが500でconformが334、exceedが166です。pingの結果も334/500(66パーセント)で一致します。RTTは7/14/47ミリ秒で、通った分の遅延は増えていません。
shaperで遅らせる(STEP 8)
policerを外し、コア側の出力に2段構成のshape average 200 kbpsを当てました(親のclass-defaultで整形し、子はclass-defaultにbandwidth remaining percent 100を置いた形です)。同じ負荷で500発すべてが通り、RTTの平均は56ミリ秒(設定前は13ミリ秒程度)です。
Class class-default
Classification statistics (packets/bytes) (rate - kbps)
Matched : 500/713000 114
Transmitted : 500/713000 114
Total Dropped : 0/0 0
Policy PE1-CORE-SHAPE-CHILD Class class-default
Classification statistics (packets/bytes) (rate - kbps)
Matched : 500/713000 114
Queue(conform) : 500/713000 114Total Droppedは0で、Taildroppedも0でした。捨てずに送り切っています。policerが損失として現れるのに対し、shaperは遅延として現れます。
クラスごとにキューを分ける(STEP 9)
コア側の出力を、親shape average 300 kbpsと子policyの組に替えました。子はTC 5をpriority level 1とpolice rate 100 kbps、TC 4をbandwidth remaining percent 20、残りをclass-defaultにしています。CE1からDSCP 46(TC 5)、DSCP 34(TC 4)、DSCP 0の3種類を4秒ずらして各1000発流しました。
| 負荷 | DSCP | TC | クラス | 結果 | RTT min/avg/max |
|---|---|---|---|---|---|
| ToS 184 | 46(EF) | 5 | priority |
667/1000 | 6/9/75 ミリ秒 |
| ToS 136 | 34(AF41) | 4 | bandwidth remaining 20% |
1000/1000 | 7/70/167 ミリ秒 |
| ToS 0 | 0 | 0 | class-default |
1000/1000 | 8/70/132 ミリ秒 |
Class class-default
Classification statistics (packets/bytes) (rate - kbps)
Matched : 3000/4278000 31
Transmitted : 2667/3803142 21
Total Dropped : 333/474858 10
Policy PE1-CORE-QUEUE-CHILD Class TC5
Classification statistics (packets/bytes) (rate - kbps)
Matched : 1000/1426000 31
Transmitted : 667/951142 21
Policed(exceed) : 333/474858 10
Policy PE1-CORE-QUEUE-CHILD Class TC4
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のクラスを作っても一致しませんでした(ラベルが付いているため)。TCで分けるか、入力で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<値>.txt |
負荷(1400バイト、10ミリ秒間隔)の結果 |
..._pmap-after.txt |
負荷の後に取ったshow policy-map interface |
..._show.txt |
show version / show interface / show policy-map interface / show mpls forwarding など |
..._log.txt |
そのSTEPの範囲だけに絞ったshow logging。クリアの記録もSTEP<N>-CLEAR:として残っています |
..._run.txt |
そのSTEP時点のshow running-config |
..._commit.cfg |
そのSTEPで実際にcommitされた設定(変更したルータのみ) |
STEP 7:入口PEの入力にpolicerを当てる
| ルータ | クリア | ping | show出力 | syslog | running-config | 投入した設定 |
|---|---|---|---|---|---|---|
| CE1 | clear | ping | show | log | run | — |
| PE1 | clear | ping | show | log | run | commit |
| P1 | clear | — | show | log | run | — |
| PE2 | clear | ping | show | log | run | commit |
| CE2 | clear | ping | show | log | run | — |
STEP 8:コア側の出力に2段構成のshaperを当てる
| ルータ | クリア | ping | show出力 | syslog | running-config | 投入した設定 |
|---|---|---|---|---|---|---|
| CE1 | clear | ping | show | log | run | — |
| PE1 | clear | ping | show | log | run | commit |
| P1 | clear | — | show | log | run | — |
| PE2 | clear | ping | show | log | run | — |
| CE2 | clear | ping | show | log | run | — |
STEP 9:親shaperと子policyでクラスを分ける
負荷はEF / AF41 / ToS 0、負荷後のカウンタはpmapです。
| ルータ | クリア | ping | show出力 | syslog | running-config | 投入した設定 |
|---|---|---|---|---|---|---|
| CE1 | clear | ping | show | log | run | — |
| PE1 | clear | ping | show | log | run | commit |
| P1 | clear | — | show | log | run | — |
| PE2 | clear | ping | show | log | run | — |
| CE2 | clear | ping | show | log | run | — |
STEP 10:QoSの設定をすべて外す(最終状態)
| ルータ | クリア | ping | show出力 | syslog | running-config | 投入した設定 |
|---|---|---|---|---|---|---|
| CE1 | clear | ping | show | log | run | — |
| PE1 | clear | ping | show | log | run | commit |
| P1 | clear | — | show | log | run | — |
| PE2 | clear | ping | show | log | run | — |
| CE2 | clear | ping | show | log | run | — |
パケットキャプチャーはSTEPごとに4リンクで取得しています。
| STEP | CE1-PE1間 | PE1-P1間 | P1-PE2間 | PE2-CE2間 |
|---|---|---|---|---|
| 7 | pcap | pcap | pcap | pcap |
| 8 | pcap | pcap | pcap | pcap |
| 9 | pcap | pcap | pcap | pcap |
| 10 | pcap | pcap | pcap | pcap |
参考
| 参考 | 内容 |
|---|---|
| RFC 3270 | MPLS Support of Differentiated Services。TCとPHBの対応付け |
| 検証環境 | XRv9000 26.1.1(PE1 / P1 / PE2)、XRd 26.1.1(CE1 / CE2)、Cisco Modeling Labs |
関連記事
- MPLSとは
- MPLSラベルとラベルスタック
- MPLSのラベル操作(push / swap / pop)とPHP
- MPLSのTTL処理とMTU
- LDPとは
- LDPのラベル配布モードとラベルスペース
- LDP-IGPシンクロナイゼーションとLDPセッション保護
- LDPのラベル広告制御(フィルタリング)
- LDPのセッション認証(TCP MD5)
- MPLSのOAM(LSP Ping / LSP Traceroute)
- MPLS TE(RSVP-TE)とは
- MPLS TEのCSPFと経路の制約(帯域 / affinity / TEメトリック)
- MPLS TEトンネルへのトラフィック誘導
- MPLS TEのFRR(リンク保護とノード保護)
- MPLS TEのFRR(auto-tunnel backupとSRLG)
- MPLSのQoS(TCとuniform / pipe / short-pipe)
- MPLSのQoSの帯域制御とキューイング(policer / shaper / priority)