ポリシングとシェーピングの概要
Cisco IOSでは、トラフィックの速度制御を行うために ポリシング(Policing) と シェーピング(Shaping) という2つの仕組みを提供しています。
- ポリシングは
policeコマンド(Class-Based Policing)やrate-limitコマンド(CAR)で実装 - シェーピングは
shapeコマンド(Class-Based Shaping)のほか、GTS・DTS・FRTSといった仕組みで実装
現在のネットワークでは、ポリシングといえば「Class-Based Policing」、シェーピングといえば「Class-Based Shaping」を指すのが一般的です。
ポリシングとシェーピングの違い
例えば100MbpsのWAN回線の中で、特定のアプリケーションの通信を15Mbpsに制限したいとします。この時に両者を使った場合、制限値を超えたトラフィックの扱いが大きく異なります。
- ポリシング:制限値を超えたパケットを即座に破棄、またはパケットの優先度を書き換える
- シェーピング:制限値を超えたパケットを一旦バッファに貯め、後で送信(遅延は発生する)
その結果、ポリシングでは「ギザギザのノコギリ状」の通信グラフになり、シェーピングでは「平滑化された波状」の通信グラフになります。
一見するとシェーピングの方が優れていますが、バッファを使うためにメモリを多く消費し、また遅延が許されない音声トラフィックには不向きです。
ポリシングとシェーピングの比較
| 項目 | ポリシング | シェーピング |
|---|---|---|
| 基本動作 | 超過パケットをドロップまたは優先度変更 | 超過パケットをバッファに格納して後で送信 |
| 設定コマンド | police(Class-Based Policing)、rate-limit(CAR) | shape(Class-Based Shaping)、traffic-shape(GTS)、frame-relay traffic-shaping(FRTS) |
| 着信I/F | 適用可 | 不可 |
| 発信I/F | 適用可 | 適用可 |
| バースト処理 | そのまま伝搬、平滑化なし | 平滑化して送信 |
| 利点 | 遅延が発生しない | 超過パケットが破棄されにくい |
| 欠点 | 超過パケットが破棄され送信レートが低下 | バッファ遅延が発生する |
トークンバケットとは
ポリシングやシェーピングの根底には トークンバケットアルゴリズム が使われています。
- 「トークン」はパケット送信に必要な権利を表す単位
- 「バケット」はトークンをためる場所(バッファのイメージ)
一定間隔でトークンが補充され、トークンがある限りパケットを送信できます。トークンが不足すると、ポリシングではパケットが破棄され、シェーピングではパケットがキューにためられます。
トークンバケットの要素は次の3つです。
- Mean rate(平均レート)
CIR(Committed Information Rate)。単位はbps。バケットに補充されるトークンの平均速度。 - Burst size(バーストサイズ)
Bc(Committed Burst)。単位はbit。一定間隔ごとに補充されるトークンの量。 - Time interval(時間間隔)
Tc(Committed Time Interval)。単位は秒。トークンが補充される周期。
公式は以下のように表されます。
CIR(bps)= Bc(bit) ÷ Tc(sec)
これにより、通信レートを「平均レート」と「バーストの扱い」に基づいて制御することができます。
ポリシングとは
ポリシングは、特定のトラフィックに対して利用できる帯域幅を制限する仕組みです。インターフェースの入力方向にも出力方向にも適用でき、制限を超えたトラフィックは廃棄したり、優先度を書き換えて転送したりします。代表的な実装方法には、Class-Based PolicingとCAR(Committed Access Rate)の2種類があります。現在のネットワークではClass-Based Policingが推奨されています。
Class-Based PolicingとCARの違い
| 項目 | Class-Based Policing | CAR |
|---|---|---|
| 設定方法 | MQCでclassに対して適用 | インターフェースに直接設定 |
| コマンド | police | rate-limit |
| トラフィック処理 | conform / exceed / violation の3段階 | conform / exceed の2段階 |
| アルゴリズム | シングルまたはデュアルトークンバケット | シングルトークンバケット |
| レート方式 | シングルレートまたはデュアルレート | シングルレート |
シングルトークンバケットとデュアルトークンバケット
policeコマンドでviolate-actionを指定しない場合はシングルトークンバケットが使われ、CIR内か超過かの2段階で処理されます。violate-actionを指定した場合はデュアルトークンバケットが使われ、CIR以内(conform)、通常バーストを超過(exceed)、さらに超過(violation)の3段階で処理されます。
シングルレートとデュアルレート
policeコマンドでCIR値(bps)、Bc、Beを指定するだけならシングルレートです。pirを指定してCIRとPIRの2つの値を使う場合はデュアルレートになります。一般的にはシングルレートで利用されることが多いです。
Class-Based Policingの設定方法
Class-Based Policingでは、class-mapで分類したトラフィックに対してpoliceコマンドを設定します。アルゴリズムにはトークンバケット方式が用いられます。
コマンド構文(シングルレート)
policy-map POLICY-NAME
class CLASS-NAME
police bps burst-normal burst-max conform-action action exceed-action action violation-action action
パラメータ
- bps:CIR(保証帯域、bps単位)
- burst-normal(Bc):通常バーストサイズ(bytes単位)
- burst-max(Be):拡張バーストサイズ(bytes単位)
- conform-action:CIR以内の動作(既定はtransmit)
- exceed-action:CIR超過時の動作(既定はdrop)
- violation-action:さらに超過した場合の動作(既定はdrop)
主なアクション
- transmit:パケットを転送する
- drop:パケットを破棄する
- set-dscp-transmit:DSCP値を書き換えて転送
- set-prec-transmit:IP Precedence値を書き換えて転送
- set-qos-transmit:QoSグループ値を書き換えて転送
インターフェースへの適用
interface INTERFACE-ID
service-policy input | output POLICY-NAME
Bc値とBe値の算出方法(Cisco推奨)
- 通常バースト(Bc)= CIR × 1/8 × 1.5
- 拡張バースト(Be)= Bc × 2
トークンバケットアルゴリズムの種類
Cisco IOSで利用できるトークンバケットの仕組みには、大きく分けて2種類があります。
「シングルトークンバケット」と「デュアルトークンバケット」です。
仕組みを判断する基準は、policeコマンドにおける violate-action の有無です。
violate-actionを指定しなければシングルトークンバケット、指定した場合はデュアルトークンバケットが動作します。
シングルトークンバケットの仕組み
シングルトークンバケットでは、名前の通りバケットはひとつだけです。このバケットは conform bucket(コンフォームバケット) と呼ばれます。
バケットに蓄えられるトークン量は、policeコマンドで指定する Normal Burstサイズ によって決まります。初期状態では、バケットがこのサイズ分のトークンで満たされた状態からスタートします。
パケットが届いたとき、次のように処理されます。
- パケットサイズが現在のバケット内トークン量以下であれば、パケットは転送され、その分のトークンが差し引かれる。
- パケットサイズがバケット内トークン量を超えていれば、パケットは廃棄され、トークンは減らない。
バケットには時間の経過に応じて定期的にトークンが補充されます。補充のスピードはCIR(Committed Information Rate、帯域幅の上限値)によって決まります。
つまり、シングルトークンバケットは「貯金箱の中のお金が足りれば買い物できる。足りなければ買い物できない」というイメージに近い仕組みです。
シングルレート・シングルトークンバケットの動作例
具体的にpoliceコマンドを設定して動きを確認してみましょう。例として以下の設定を行います。
Cisco(config-pmap-c)# police 8000 1000 conform-action transmit exceed-action drop
- CIR(帯域制限):8kbps
- Normal Burstサイズ:1000byte
初期状態では、バケットに1000byte分のトークンが入っています。
例えば最初に 450byteのパケット が届いた場合、十分なトークンがあるため転送されます。同時に450byte分のトークンが差し引かれるので、残りは550byteとなります。
その0.25秒後に新しいパケットが到着するとします。時間が経過しているのでトークンが補充されます。補充量は次の計算式で求められます。 (0.25×8000)/8=250byte(0.25 \times 8000) / 8 = 250byte
これにより、バケットは550 + 250 = 800byte になります。
次に900byteのパケットが届いた場合、バケットには800byteしかないため条件を満たせず、パケットは破棄されます。このとき、バケット内の800byteは消費されずに残ります。
トークンバケットアルゴリズムの種類
Cisco IOSが扱うトークンバケットの仕組みには、大きく2つの種類があります。
- シングルトークンバケット
- デュアルトークンバケット
どちらが使われるかは、policeコマンドで violate-action を指定しているかどうかで決まります。
- violate-actionを指定していなければ「シングル」
- violate-actionを指定していれば「デュアル」
という動作になります。
デュアルトークンバケットの仕組み
デュアルトークンバケットでは、名前の通りバケットが2つ用意されます。
1つ目は conform bucket(コンフォームバケット)、もう1つは exceed bucket(エクシードバケット) です。
- conform bucket のサイズは Normal Burstサイズ で決定
- exceed bucket のサイズは Maximum Burstサイズ で決定
初期状態では両方のバケットが満杯の状態でスタートします。
トークンの補充ルール
新しいトークンはまずconform bucketに補充されます。もしconform bucketが満杯なら、次のトークンはexceed bucketに送られます。両方が満杯になった時点で、それ以上のトークンは捨てられます。
パケット処理の流れ
- パケットサイズがconform bucketの値以下であれば転送され、対応する分のトークンがconform bucketから差し引かれる。
- パケットサイズがconform bucketを超える場合は、exceed bucketを参照する。
- exceed bucketに十分なトークンがあれば、exceed-actionに従って処理(例:DSCP値を書き換えて転送)。このときconform bucketのトークンは減らず、exceed bucketから消費される。
- exceed bucketにも足りなければ、そのパケットは廃棄される。
つまり、デュアルトークンバケットは「優先の財布(conform)」と「予備の財布(exceed)」を使い分ける仕組みだと考えると理解しやすいです。
シングルレート・デュアルトークンバケットの動作例
次の設定を例に見ていきます。
# police 8000 1000 2000 conform-action transmit exceed-action set-dscp-transmit 0 violate-action drop
- CIR:8kbps
- Normal Burstサイズ:1000byte(conform bucket)
- Maximum Burstサイズ:2000byte(exceed bucket)
動作シナリオ
初期状態では
- conform bucket = 1000byte
- exceed bucket = 2000byte
となっています。
- 450byteのパケットが到着
- conform bucketに十分なトークンがあるため転送される。
- conform bucketの残量は 1000 – 450 = 550byte。
- 0.25秒後に次のパケットが到着
- トークン補充: (0.25 × 8000) / 8 = 250byte
- conform bucketは 550 + 250 = 800byte となる。
- exceed-actionに従ってパケットのDSCP値を0に書き換えて転送。
- exceed bucketは 2000 – 900 = 1100byte に減少。
- さらに0.4秒後
- 補充されるトークン = (0.4 × 8000) / 8 = 400byte
- conform bucketは800 + 200 = 1000byte(満杯)
- 溢れた200byteはexceed bucketに追加され、1100 + 200 = 1300byte