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
| 項目 | 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 : 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 11Matchedが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ミリ秒)です。
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 201Total 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発流しました。
| 負荷 | DSCP | EXP | クラス | 結果 | RTT min/avg/max |
|---|---|---|---|---|---|
| ToS 184 | 46(EF) | 5 | priority | 668/1000 | 6/10/87 ミリ秒 |
| ToS 136 | 34(AF41) | 4 | bandwidth remaining 20% | 1000/1000 | 8/71/144 ミリ秒 |
| ToS 0 | 0 | 0 | class-default | 1000/1000 | 8/71/134 ミリ秒 |
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<値>.txt | CE1からかけた負荷(1400バイト、10ミリ秒間隔)の結果 |
..._pmap-before.txt / ..._pmap-after.txt | 負荷の直前と直後に取ったshow policy-map interface |
..._show.txt | show 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.txt | show 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を当てる
| ルータ | クリア | ping | show出力 | syslog | running-config | trace | 投入した設定 | 負荷前のpolicy-map | 負荷後のpolicy-map |
|---|---|---|---|---|---|---|---|---|---|
| CE1 | clear | ping | show | log | run | — | — | — | — |
| PE1 | clear | ping | show | log | run | trace | commit | before | after |
| P1 | clear | ping | show | log | run | trace | — | — | — |
| PE2 | clear | ping | show | log | run | trace | commit | — | — |
| CE2 | clear | ping | show | log | run | — | — | — | — |
STEP 8:コア側の出力に2段構成のshaperを当てる
| ルータ | クリア | ping | show出力 | syslog | running-config | trace | 投入した設定 | 負荷前のpolicy-map | 負荷後のpolicy-map |
|---|---|---|---|---|---|---|---|---|---|
| CE1 | clear | ping | show | log | run | — | — | — | — |
| PE1 | clear | ping | show | log | run | trace | commit | before | after |
| P1 | clear | ping | show | log | run | trace | — | — | — |
| PE2 | clear | ping | show | log | run | trace | — | — | — |
| CE2 | clear | ping | show | log | run | — | — | — | — |
STEP 9:親shaperと子policyでクラスを分ける
| ルータ | クリア | ping | show出力 | syslog | running-config | trace | 投入した設定 | 負荷前のpolicy-map | 負荷後のpolicy-map |
|---|---|---|---|---|---|---|---|---|---|
| CE1 | clear | ping | show | log | run | — | — | — | — |
| PE1 | clear | ping | show | log | run | trace | commit | before | after |
| P1 | clear | ping | show | log | run | trace | — | — | — |
| PE2 | clear | ping | show | log | run | trace | — | — | — |
| CE2 | clear | ping | show | log | run | — | — | — | — |
STEP 10:QoSの設定をすべて外す(最終状態)
| ルータ | クリア | ping | show出力 | syslog | running-config | trace | 投入した設定 |
|---|---|---|---|---|---|---|---|
| CE1 | clear | ping | show | log | run | — | — |
| PE1 | clear | ping | show | log | run | trace | commit |
| P1 | clear | ping | show | log | run | trace | — |
| PE2 | clear | ping | show | log | run | trace | — |
| CE2 | clear | ping | show | log | run | — | — |
CE1からかけた負荷(ping ... size 1400 interval 10)の記録です。負荷の直後のpolicy-mapは上の表の「負荷後のpolicy-map」です。
| STEP | ToS | 結果 | ファイル |
|---|---|---|---|
| 7 | 0 | 334/500、RTT 9/15/71 ms | load |
| 8 | 0 | 500/500、RTT 18/56/132 ms | load |
| 9 | 0 | 1000/1000、RTT 8/71/134 ms | load |
| 9 | 136 | 1000/1000、RTT 8/71/144 ms | load |
| 9 | 184 | 668/1000、RTT 6/10/87 ms | load |
パケットキャプチャーは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。EXPと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(EXPとuniform / pipe / short-pipe)
- MPLSのQoSの帯域制御とキューイング(policer / shaper / priority)