QoS Scheduling

※この記事は自分用メモの転記となります。
元々人に見せることを想定していなかったので読みづらかったらすみません。その場合は本記事の解読を諦めてください。



# 基本動作

1. P1キューにパケットが存在する場合、P1パケットを送信する
2. P1キューが空でP2キューにパケットが存在する場合、P2パケットを送信する
3. 優先キュー(P1&P2)が空の場合、最小保証帯域が設定されたキューに存在するパケットを保証帯域まで送信する
4. 各キューの重みづけの設定に従い、残りのパケットを送信する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/1e249b94-f64e-faf1-7e34-8ee955bde473.png)

↑P1とP2で25Mbps使用し、最小保証帯域が設定されたキューから20Mbps送信

その後、残りの帯域 (55Mbps=100-20-5-20) を重みづけの設定に従い (どちらもExが 1 なので上図は 1:1 )、 パケットを送信する

## Priority Queue

優先キューにあるパケットは必ず優先処理される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/cf157afa-1fd7-d52c-96d5-956482ddfa23.png)

↑右図は音声だけで帯域をすべて消費してしまっている

尚、優先キューに最小保証帯域を設定することはできない

```
cat9kv(config-pmap-c)#priority
cat9kv(config-pmap-c)#bandwidth percent 50 
Bandwidth not allowed with priority
```

優先キューは2つまで作成可能 (level 1 → level 2 の順で処理) で、帯域上限を設定する方式は以下2つ

### 条件付きポリサー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/4b81f5cb-e2d8-6255-b08f-d6e6856ab904.png)

輻輳が発生していない場合は通常と同様に優先キューにあるパケットは必ず優先処理し、輻輳が発生している場合は設定した閾値を超過したパケットを破棄する

輻輳が発生しているかどうかで大きく動作が変わるため、(恐らく)ベストプラクティスではない

### 条件なしポリサー

輻輳の発生に関わらず帯域上限を閾値に設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/3ef71d7c-efc4-903a-f40a-7bbe90268e87.png)

ポリサーはトークンバケット方式を利用可能で、この方式で帯域上限を設定する場合は percent で設定可能

```
cat9kv(config-pmap-c)#police cir ?       
  <8000-100000000000>  Target Bit Rate (biTs per second) (postfix k, m, g
                       optional; decimal point allo
  percent              % of interface bandwidth for Committed information rate
```

無条件ポリサーの場合、デフォルトで250msecのバーストが許可される

※一般的に音声はEnd-to-Endで約30msecのジッタと150msecの遅延が許容される

https://www.itu.int/rec/T-REC-G.114-200305-I/en

※バーストトラフィックがキューに入った場合、キューに残存した時間が”ジッタ”となる

## 帯域保証

遅延要件はないが重要なトラフィックを保護する

### bandwidth command

最小保証帯域を設定

PQの処理が完了した後に保証帯域が埋まるまでパケットを送信する

### Shaping

最大レートを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/8b17877e-ae89-00d7-0eb2-66267b85d226.png)


PQのパケットを送信し、最小保証帯域までmission-criticalキューのパケットを送信するところまでは基本動作と同様だが、mission-criticalキューの帯域上限値が30Mbpsでシェーピングされるため、超過したパケット (上図だと17.5Mbps=(100-20-5-20)/2-+20-30) は送信されずに再度キューイングされる

## 重みづけ

残ったパケットを各キューが処理する際の重みづけを設定

特に指定しない場合は 1:1:1… となる

※パーセンテージでの設定も可能で、どれか一つのキューの重みづけをパーセンテージで設定した場合は残りのキューも自動的にパーセンテージでの設定値に変換される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/51d78541-68ca-bbd5-c6b3-01ed4b9fa346.png)


上図はpriority-classとclass-defaultの比率が3:1で設定されている

## 転送レートの計算

IPデータをイーサネットインターフェースから送信する場合、オーバーヘッドはL3データグラムを基準とすると合計38バイトとなる (カプセル化(18Byte)＋物理ヘッダ(20byte))
※カプセル化 18Byte = イーサネットヘッダ(14Byte) + CRC (4Byte)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/5dec3273-51c5-ffb1-67fd-b605db22fff8.png)

スループットの計算方法は以下

> Linerate / Bits Per Byte / ( Layer 3 length + Per Packet Overhead) = Packets Per Second
> 

> ex) 1 Gbps / 8 / ( 100 + 38 ) = 905, 797 pps
> 

が、スケジューラは物理ヘッダを付与する前に計算を行うので、パケット長をレイヤ3データグラムを基準とするとオーバーヘッドがイーサネットヘッダの14Byteのみとなる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768522/83f49ee7-7d1f-67be-45af-dcace2a32248.png)

その為、スループットの計算に注意が必要
例えば1Gインターフェースの半分のスループットを設定したい場合、500Mbpsでなく450Mbpsを割り当てればよいことになる

> Shaper Rate / Bits per Byte / (Layer 3 length + Layer 2 header length)
= Packets Per Second
> 

> ex1) 500 Mbps / 8 / (100 + 14) = 548,246 pps
> ex2) 450 Mbps / 8 / (100 + 14) = 493,421 pps