はじめに
本ドキュメントでは、Catalyst 3650/3850 シリーズスイッチでシェーピングが有効になっている場合に、意図せずに自発パケットがドロップする状況と対処法について記載しています。コマンド出力は IOS-XE 16.9.2 バージョンで動作している WS-C3650-12X48UR を例に記載しています。
問題
インターフェイスの出力方向にポリシー マップが設定されていて、そのポリシー マップ上でシェーピングが有効になっている場合に、ping など本来シェーピング対象でない自発パケットがドロップされる場合があります。
条件
シェーピング対象のクラスがポリシー マップの一番上に位置していて、該当クラスのトラフィック量がシェーピングレートを超過した場合。
参考構成

設定例
Cat3650-A
interface GigabitEthernet1/0/1
switchport access vlan 2
switchport mode access
service-policy output SHAPE
class-map match-all QOS-GRP
match qos-group 0
policy-map SHAPE
class QOS-GRP
shape average 15000
原因
ポリシー マップの一番上に位置するクラスに該当するパケットと自発パケットの両方が実装上最初のキュー(0)で処理されるため、一番上のクラスに対してシェーピングが有効になっている場合、同じキューで処理される自発パケットもシェーピングの影響を受けることになります。
確認コマンド
Cat3650-A#show policy-map interface gi1/0/1
GigabitEthernet1/0/1
Service-policy output: SHAPE
Class-map: QOS-GRP (match-all)
0 packets
Match: qos-group 0
Queueing
(total drops) 42952 <<< ドロップされたパケットの総数
(bytes output) 100898
shape (average) cir 15000, bc 60, be 60 <<< シェーピングレート
target shape rate 15000
Class-map: class-default (match-any)
0 packets
Match: any
(total drops) 0
(bytes output) 118000
Cat3650-A#
Cat3650-A#show platform hardware fed switch 1 qos queue stats interface gi1/0/1
DATA Port:25 Enqueue Counters
-----------------------------------------------------------------
Queue Buffers Enqueue-TH0 Enqueue-TH1 Enqueue-TH2 Qpolicer
(Count) (Bytes) (Bytes) (Bytes) (Bytes)
----- ------- ------------ ------------ ------------ ------------
0 0 0 0 101026 0
1 0 0 0 118000 0
2 0 0 0 0 0
3 0 0 0 0 0
4 0 0 0 0 0
5 0 0 0 0 0
6 0 0 0 0 0
7 0 0 0 0 0
DATA Port:25 Drop Counters
-----------------------------------------------------------------------------------
Queue Drop-TH0 Drop-TH1 Drop-TH2 SBufDrop QebDrop QpolicerDrop
(Bytes) (Bytes) (Bytes) (Bytes) (Bytes) (Bytes)
----- ------------ ------------ ------------ ------------ ------------ ------------
0 0 0 42952 0 0 0
1 0 0 0 0 0 0
2 0 0 0 0 0 0
3 0 0 0 0 0 0
4 0 0 0 0 0 0
5 0 0 0 0 0 0
6 0 0 0 0 0 0
7 0 0 0 0 0 0
Cat3650-A#
対処法
自発パケット用にダミーのクラス マップを作成し、ポリシー マップの一番上に位置するように設定します。結果、自発とそれ以外のパケットで処理キューが分けられ、自発パケットは他のクラスに対する処理の影響を受けなくなります。
設定例
Cat3650-A#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Cat3650-A(config)#class-map SELF(ダミーのクラスマップを作成)
Cat3650-A(config-cmap)#match qos-group 31(他のクラス マップで使用されていない任意の qos-group 番号)
Cat3650-A(config-cmap)#exit
Cat3650-A(config)#policy-map SHAPE
Cat3650-A(config-pmap)#no class QOS-GRP(既存のクラスをポリシー マップから一時的に削除)
Cat3650-A(config-pmap)#class SELF(ダミーのクラスをポリシー マップに追加)
Cat3650-A(config-pmap-c)#shape average 100000000000(自発パケットに影響のない任意のアクション)
Cat3650-A(config-pmap-c)#class QOS-GRP(既存のクラスをポリシー マップに再設定)
Cat3650-A(config-pmap-c)#shape average 15000
Cat3650-A(config-pmap-c)#
Cat3650-A(config-pmap-c)#do show running-config policy-map SHAPE
Building configuration...
Current configuration : 111 bytes
!
policy-map SHAPE
class SELF(キュー 0 で処理)
shape average 100000000000
class QOS-GRP(キュー 1 で処理)
shape average 15000
!
end
補足
デフォルト クラス(class class-default)のパケットは他のクラスで未使用のキュー(上記設定ではキュー 2)で処理されます。