はじめに
この記事は、「Nexus 9000のTAHUSDバッファのSyslogと輻輳について」を筆者が読み解く上で必要な用語を整理し、必要に応じて確認結果を見やすくしたものとなります。様々な専門用語が登場するので初めてドキュメントを見た場合は正確に読み解くことが難しいです。内容も簡単ではありません。この記事が少しでも役に立てば幸いです。
本文で登場する用語について
・ASIC(ユニット):Cisco Cloud Scale ASICのこと。ラインカード内部ではユニットとも呼ばれます。
 ・バッファ:パケットを貯めておくスペースのこと。筐体やラインカードによって容量が異なります。
 ・オーバーサブスクライブ:ネットワーキングの「オーバーサブスクリプション」とは何ですか? (qastack.jp) を参照してください。
・スライス(インスタンス):Cisco Cloud Scale ASICの共有メモリ出力バッファ。スライスは1つ以上存在し、スライス毎に独自のバッファを持ち、そのスライスに紐づいたI/Fのみが使用することが出来ます。ラインカード内部ではインスタンスとも呼ばれます。詳細は下記の図を参照してください。

・セル:バッファを構成する最小単位。1セル ≒ 416Byte。
 ・プール:1つ以上のプールで構成されたものがプールグループ。プール単位でユニキャストまたはマルチキャストトラフィックのサービスクラスを表します。
 ・プールグループ:スライスを1つ以上に分割したもの。一定のセルが割り当てられ、それれはプールグループ間では共有されません。
ASICと物理I/Fの紐づけの確認方法について
Nexus 9000シリーズと9500シリーズのラインカードには、それぞれ異なる数のASICが搭載されています。ラインカード毎にASICとI/Fの紐づけも異なるため、コマンドを用いて調べる必要があります。下記のコマンドを使用します。
 コマンド:show interface hardware-mappings
例えば、4つのASICを持ち1つのスライスのみを持つラインカードもあれば、1つのASICを持ち2つのスライスを持つラインカードもあります。下記を例に見ていきましょう。
——————————————————————————————————-
 Name Ifindex Smod Unit HPort FPort NPort VPort Slice SPort SrcId MacId MacSP VIF Block BlkSrcID
 ——————————————————————————————————-
 Eth2/1 1a080000 5 0 16 255 0 -1 0 16 32 4 0 145 0 32
 Eth2/2 1a080200 5 0 12 255 4 -1 0 12 24 3 0 149 0 24
 Eth2/3 1a080400 5 0 8 255 8 -1 0 8 16 2 0 153 0 16
 Eth2/4 1a080600 5 0 4 255 12 -1 0 4 8 1 0 157 0 8
 Eth2/5 1a080800 5 0 0 255 16 -1 0 0 0 0 0 161 0 0
 Eth2/6 1a080a00 5 0 56 255 20 -1 0 56 112 14 0 165 1 40
 Eth2/7 1a080c00 5 0 52 255 24 -1 0 52 104 13 0 169 1 32
 Eth2/8 1a080e00 6 1 16 255 28 -1 0 16 32 4 0 173 0 32
 Eth2/9 1a081000 6 1 12 255 32 -1 0 12 24 3 0 177 0 24
 Eth2/10 1a081200 6 1 8 255 36 -1 0 8 16 2 0 181 0 16
 Eth2/11 1a081400 6 1 4 255 40 -1 0 4 8 1 0 185 0 8
 Eth2/12 1a081600 6 1 0 255 44 -1 0 0 0 0 0 189 0 0
 Eth2/13 1a081800 6 1 56 255 48 -1 0 56 112 14 0 193 1 40
 Eth2/14 1a081a00 6 1 52 255 52 -1 0 52 104 13 0 197 1 32
 Eth2/15 1a081c00 7 2 16 255 56 -1 0 16 32 4 0 201 0 32
 Eth2/16 1a081e00 7 2 12 255 60 -1 0 12 24 3 0 205 0 24
 Eth2/17 1a082000 7 2 8 255 64 -1 0 8 16 2 0 209 0 16
 Eth2/18 1a082200 7 2 4 255 68 -1 0 4 8 1 0 213 0 8
 Eth2/19 1a082400 7 2 0 255 72 -1 0 0 0 0 0 217 0 0
 Eth2/20 1a082600 7 2 56 255 76 -1 0 56 112 14 0 221 1 40
 Eth2/21 1a082800 7 2 52 255 80 -1 0 52 104 13 0 225 1 32
 Eth2/22 1a082a00 8 3 16 255 84 -1 0 16 32 4 0 229 0 32
 Eth2/23 1a082c00 8 3 12 255 88 -1 0 12 24 3 0 233 0 24
 Eth2/24 1a082e00 8 3 8 255 92 -1 0 8 16 2 0 237 0 16
 Eth2/25 1a083000 8 3 4 255 96 -1 0 4 8 1 0 241 0 8
 Eth2/26 1a083200 8 3 0 255 100 -1 0 0 0 0 0 245 0 0
 Eth2/27 1a083400 8 3 56 255 104 -1 0 56 112 14 0 249 1 40
 Eth2/28 1a083600 8 3 52 255 108 -1 0 52 104 13 0 253 1 32
 Eth2/29 1a083800 5 0 48 255 112 -1 0 48 96 12 0 257 1 24
 Eth2/30 1a083a00 5 0 44 255 116 -1 0 44 88 11 0 261 1 16
 Eth2/31 1a083c00 6 1 48 255 120 -1 0 48 96 12 0 265 1 24
 Eth2/32 1a083e00 6 1 44 255 124 -1 0 44 88 11 0 269 1 16
 Eth2/33 1a084000 7 2 48 255 128 -1 0 48 96 12 0 273 1 24
 Eth2/34 1a084200 7 2 44 255 132 -1 0 44 88 11 0 277 1 16
 Eth2/35 1a084400 8 3 48 255 136 -1 0 48 96 12 0 281 1 24
 Eth2/36 1a084600 8 3 44 255 140 -1 0 44 88 11 0 285 1 16
これを見て変わることは以下の通りです。
 ・Unitは0-3まである→ASICは4つ搭載されている。
 ・Sliceは0のみ→スライスは1つのみ。
バッファが使用される状況について
出力インターフェースのワイヤーレート(I/Fの速度)が流入するレートより低い場合はオーバーサブスクライブされます。ただし、バッファがある場合には出力インタフェースから送信する必要のあるパケットが一時的に蓄えれます。その後、送信できる状態になった場合はバッファにあるパケットが送信されます。しかし、一時的にバッファにパケットが蓄えられてしまうため遅延の原因となります。
さらに、オーバーサーブスクライブが続いた場合には、バッファが完全に使用されることでテールドロップが発生します。この時、TCPを用いた通信が流れているとTCPのアルゴリズムによって送信レートが瞬間的に半減します。この仕様を複数のTCPコネクションで実行されてしまうことでTCPグローバル同期が発生。帯域幅を非効率に使用してしまう原因となります。
バッファが足りない場合に何が起きるのか
SYSLOGに下記が出力されます。
デフォルトではバッファの90%を超過すると、このMSGが出力されます。また、90%を超えるとパケットが破棄されます。これはDBPと呼ばれる機能のためです。P97を参照してください。
また、このログが出力された場合は必ずパケットが破棄されています。パケットが破棄された場合は出力I/FのOutput Discardsカウントを確認が増加します。
switch# show interface Ethernet1/1
 省略
 TX
 38298127762 unicast packets 6118 multicast packets 0 broadcast packets
 38298133880 output packets 57600384931480 bytes
 0 jumbo packets
 0 output error 0 collision 0 deferred 0 late collision
 0 lost carrier 0 no carrier 0 babble 57443534227 output discard
 0 Tx pause
SYSLOGメッセージの内訳
このSYSLOGメッセージについての内訳は下記のとおりです。
このsyslogには、次の3つの重要な情報が含まれています。
 1. モジュールX:オーバーサブスクライブされたインターフェイスを含むラインカードのスロット。
2. インスタンスY:オーバーサブスクライブされたインターフェイスを含むASICとスライスのタプルに割り当てられたインスタンス番号。
3.Pool-group buffer Z:syslogが生成される前の、影響を受けるプールグループバッファのしきい値。これは、モジュールXに接続されたときのshow hardware internal buffer info pkt-statsの出力に見られるように、使用済みセルを合計セルで割ったパーセンテージです。
SYSLOGメッセージのパラメーターチューニング
このSYSLOGメッセージはデフォルト設定として3つのパラメータが存在し、それぞれ設定変更が可能です。
・ASICスライスバッファの使用率のポーリング頻度。デフォルト値は5000ミリ秒(5秒)
 コマンド:hardware profile buffer info poll-interval timer 1000
・出力バッファ使用率の閾値。デフォルトの設定値は90%。
 コマンド:hardware profile buffer info port-threshold threshold 80
・SYSLOGメッセージの生成頻度。デフォルトは120秒。0にすることでSYSLOGに出力されないようにすることが可能。
 コマンド:hardware profile buffer info syslog-interval timer 0
バッファの使用率やパケット破棄の状態を調査する方法について
下記のコマンドを使用します。複数のコマンドを用いることで(使用せざるを得ないが正しいですが)、どのI/Fのどのバッファがどれくらい使用されているのか確認することが可能となります。
コマンド:attach module n
 n…ラインカードが挿入されているslot番号。1つしかない場合は0。コンフィグレーションモードが変化します。後続のコマンドはこのコマンドを打たなければエラーとなります。
コマンド:show hardware internal tah buffer counters
 内部ハードウェアバッファを表示することが可能です。
コマンド:show hardware internal buffer info pkt-stats
 各インスタンス(スライス)の輻輳したプールグループに関する詳細情報を表示します。バッファ内で使用されたセルの履歴のピーク数と最大数も表示します。
コマンド:show interface hardware-mapping
 実際のI/Fのポート番号とASICポートIDの紐づけを確認することができます。
具体例
100GbpsのI/Fを通ってN9500にトラフィックが流入し、40GbpsのI/Fを通って送信されるケースを考えます。この場合、Eth2/2でオーバーサブスクライブされます。

Eth2/2がslot2に搭載されているラインカードの場合は下記を使用して、そのラインカードの内部バッファを確認します。
switch# attach module 2
 module-2# show hardware internal tah buffer counters
 Unit: 0 Slice: 0
 ====================
 |——————————————————————————————————————|
 | Output Pool-Group drops |
 | Drop-PG No-drop CPU–PG LCPU-PG RCPU-PG SPAN-PG |
 |——————————————————————————————————————|
 Occupancy drops 51152554987 0 0 0 0 0 |
 AQM drops 0 0 N/A N/A N/A N/A |
 |——————————————————————————————————————–|
 | Output UC Pool counters |
 | Pool 0 Pool 1 Pool 2 Pool 3 Pool 4 Pool 5 Pool 6 Pool 7 |
 |——————————————————————————————————————–|
 Dynamic Threshold (cells) 93554 93554 93554 93554 93554 93554 93554 93554 |
 Occupancy drops 51152555398 0 0 0 0 0 0 0 |
 AQM drops 0 0 0 0 0 0 0 0 |
 |——————————————————————————————————————–|
 | Output MC Pool counters |
 | Pool 0 Pool 1 Pool 2 Pool 3 Pool 4 Pool 5 Pool 6 Pool 7 |
 |——————————————————————————————————————–|
 Dynamic Threshold (cells) 93554 93554 93554 93554 93554 93554 93554 93554 |
 Dynamic Threshold (desc) 93554 93554 93554 93554 93554 93554 93554 93554 |
 Dynamic Threshold (inq thr) 64035 64035 64035 64035 64035 64035 64035 64035 |
 Occupancy drops 0 0 0 0 0 0 0 0 |
 |————–+———+———+———+———+———+——–+———+———+|
 | Additional counters |
 |————–+———+———+———+———+———+——–+———+———+|
 MEM cell drop reason : 0
 MEM descriptor drop reason : 0
 OPG cell drop reason : 0
 OPG descriptor drop reason : 0
 OPG CPU cell drop reason : 0
 OPG CPU descriptor drop reason : 0
 OPG SPAN cell drop reason : 0
 OPG SPAN descriptor drop reason : 0
 OPOOL cell drop reason : 0
 OPOOL descriptor drop reason : 0
 UC OQUEUE cell drop reason : 51152556479
 MC OQUEUE cell drop reason : 27573307
 OQUEUE descriptor drop reason : 0
 MC OPOOL cell drop reason : 0
 FWD DROP : 15
 SOD : 0
 BMM BP : 0
 No Drop : 0
 Packets received : 87480806439
 TRUNC MTU : 0
 TRUNK BMM BP : 0
 VOQFC messages sent : 0
 SOD messages sent : 0
 SPAN desciptor drop : 0
 Unit: 1 Slice: 0
 ====================
 |——————————————————————————————————————|
 | Output Pool-Group drops |
 | Drop-PG No-drop CPU–PG LCPU-PG RCPU-PG SPAN-PG |
 |——————————————————————————————————————|
 Occupancy drops 0 0 0 0 0 0 |
 AQM drops 0 0 N/A N/A N/A N/A |
 |——————————————————————————————————————–|
 | Output UC Pool counters |
 | Pool 0 Pool 1 Pool 2 Pool 3 Pool 4 Pool 5 Pool 6 Pool 7 |
 |——————————————————————————————————————–|
 Dynamic Threshold (cells) 93554 93554 93554 93554 93554 93554 93554 93554 |
 Occupancy drops 0 0 0 0 0 0 0 0 |
 AQM drops 0 0 0 0 0 0 0 0 |
 |——————————————————————————————————————–|
 | Output MC Pool counters |
 | Pool 0 Pool 1 Pool 2 Pool 3 Pool 4 Pool 5 Pool 6 Pool 7 |
 |——————————————————————————————————————–|
 Dynamic Threshold (cells) 93554 93554 93554 93554 93554 93554 93554 93554 |
 Dynamic Threshold (desc) 93554 93554 93554 93554 93554 93554 93554 93554 |
 Dynamic Threshold (inq thr) 64035 64035 64035 64035 64035 64035 64035 64035 |
 Occupancy drops 0 0 0 0 0 0 0 0 |
 |————–+———+———+———+———+———+——–+———+———+|
 | Additional counters |
 |————–+———+———+———+———+———+——–+———+———+|
 MEM cell drop reason : 0
 MEM descriptor drop reason : 0
 OPG cell drop reason : 0
 OPG descriptor drop reason : 0
 OPG CPU cell drop reason : 0
 OPG CPU descriptor drop reason : 0
 OPG SPAN cell drop reason : 0
 OPG SPAN descriptor drop reason : 0
 OPOOL cell drop reason : 0
 OPOOL descriptor drop reason : 0
 UC OQUEUE cell drop reason : 0
 MC OQUEUE cell drop reason : 0
 OQUEUE descriptor drop reason : 0
 MC OPOOL cell drop reason : 0
 FWD DROP : 8
 SOD : 0
 BMM BP : 0
 No Drop : 0
 Packets received : 45981341
 TRUNC MTU : 0
 TRUNK BMM BP : 0
 VOQFC messages sent : 0
 SOD messages sent : 0
 SPAN desciptor drop : 0
上記のコマンドの出力結果からわかることは以下の通りです。
 ・このラインカードにはASICが2つ搭載されている(unit番号に0と1があるため)
 ・スライスは1つのみ
 ・ドロップされたパケットの数は51152554987個(Occupancy dropから)
 ・ユニキャストとキャスト用のプールがあり、その合計値がOutput Pool-Group dropsとして表示されている
 ・システム定義のQoSのキューの数は8つ。Nexusでは筐体依存で4もしくは8個のキューが存在
 ・QoSのキュー数と同じ数のPoolが存在。ユニキャストとマルチキャストそれぞれ独立して存在
 ・プールの閾値は93554セル。1セル ≒ 416 byteのため38918464byte ≒ 39Mbyte
 ・1つ目のASICで使用しているユニキャスト用のバッファの90%まで使用されたため、パケットがドロップされた
次に、各インスタンス(スライス)の輻輳したプールグループに関する詳細情報を表示します。バッファ内で使用されたセルのピーク数の最大数を表示することが可能です。ただし、履歴となるためリアルタイムの結果はわかりません。
switch# attach module 2
 module-2# show hardware internal buffer info pkt-stats
 Instance 0
 ============
 |————————————————————————————————————|
 | Output Pool-Group Buffer Utilization (cells/desc) |
 | Drop-PG No-drop CPU–PG LCPU-PG RCPU-PG SPAN-PG |
 |————————————————————————————————————|
 Total Instant Usage (cells) 59992 0 0 0 0 0 |
 Remaining Instant Usage (cells) 33562 0 1500 250 1500 1500 |
 Peak/Max Cells Used 90415 0 N/A N/A N/A N/A |
 Switch Cells Count 93554 0 1500 250 1500 1500 |
 Total Instant Usage (desc) 0 0 0 0 0 0 |
 Remaining Instant Usage (desc) 93554 0 1500 250 1500 1500 |
 Switch Desc Count 93554 0 1500 250 1500 1500 |
 |——————————————————————————————————————–|
 | Output UC Pool Buffer Utilization (cells/desc) |
 | Pool 0 Pool 1 Pool 2 Pool 3 Pool 4 Pool 5 Pool 6 Pool 7 |
 |——————————————————————————————————————–|
 Total Instant Usage (cells) 60027 0 0 0 0 0 0 0 |
 Total Instant Usage (desc) 0 0 0 0 0 0 0 0 |
 Peak/Max Cells Used 62047 0 0 0 0 0 0 0 |
 |——————————————————————————————————————–|
 | Output MC Pool Buffer Utilization (cells/desc) |
 | Pool 0 Pool 1 Pool 2 Pool 3 Pool 4 Pool 5 Pool 6 Pool 7 |
 |——————————————————————————————————————–|
 Total Instant Usage (cells) 0 0 0 0 0 0 0 0 |
 Total Instant Usage (desc) 0 0 0 0 0 0 0 0 |
 Total Instant Usage (inq cells) 0 0 0 0 0 0 0 0 |
 Total Instant Usage (packets) 0 0 0 0 0 0 0 0 |
 Peak/Max Cells Used 60399 0 0 0 0 0 0 0 |
 |————————————————————————–|
 | Instant Buffer utilization per queue per port |
 | Each line displays the number of cells/desc utilized for a given |
 | port for each QoS queue |
 | One cell represents approximately 416 bytes |
 |————–+———+———+———+———+———+——–+———+———+|
 |ASIC Port Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 |
 |————–+———+———+———+———+———+——–+———+———+|
 [12] <<< ASIC Port 12 in Unit 0 Instance 0 is likely the congested egress interface
 UC-> 0 0 0 0 0 0 0 59988 |
 MC cells-> 0 0 0 0 0 0 0 0 |
 MC desc-> 0 0 0 0 0 0 0 0 |
上記のコマンドの出力結果からわかることは以下の通りです。
 ・ユニキャストトラフィックで過去に62047セル≒25.8MBのバッファを使用
 ・マルチキャストトラフィックで過去に60399セル≒25.1MBのバッファを使用
 ・このスライスの最大セル数は93354≒38.8MBのバッファ相当
 ・このスライスでは過去に最大で90415セル≒37.6MBのバッファを使用した
 ・現在、59992セル≒25MBのバッファを使用している
 ・残りのセル数は33562≒14MB
 ・ASICポート番号[12]はおそらくEth2/2を示す
ASICポート番号[12]が実際にどのI/Fを示しているのかを確認するには下記のコマンドを使用します。
switch# show interface hardware-mappings
 Legends:
 SMod – Source Mod. 0 is N/A
 Unit – Unit on which port resides. N/A for port channels
 HPort – Hardware Port Number or Hardware Trunk Id:
 HName – Hardware port name. None means N/A
 FPort – Fabric facing port number. 255 means N/A
 NPort – Front panel port number
 VPort – Virtual Port Number. -1 means N/A
 Slice – Slice Number. N/A for BCM systems
 SPort – Port Number wrt Slice. N/A for BCM systems
 SrcId – Source Id Number. N/A for BCM systems
 MacIdx – Mac index. N/A for BCM systems
 MacSubPort – Mac sub port. N/A for BCM systems
 ——————————————————————————————————-
 Name Ifindex Smod Unit HPortFPort NPort VPort Slice SPort SrcId MacId MacSP VIF Block BlkSrcID
 ——————————————————————————————————-
 Eth2/2 1a080200 5 0 12 255 4 -1 0 12 24 3 0 149 0 24
スライスは1つのみで、1つ目のASICに所属するASICポート番号[12]が対象となるのでUnit0、Slice0、HPortが12となる箇所を見つけます。この条件に合致するI/FがEth2/2であることが確認できました。
このように、複数のコマンドを使用することで調査をすることが可能となります。ちょっとややこしいですね。
オーバーサブスクライブによってバッファの使用率が閾値を超過し、出力I/Fからパケットがドロップされていることが確認できた場合の対応策
・ポートチャネルを組んで帯域を増やす
 ・流入するトラフィックの量を減らす
 ・出力I/Fの速度を上げる
 ・QoSの設計を検討する
 ・マイクロバーストが輻輳の原因になっているかもしれません。その場合はさらに調査が必要となります。下記のブログを参考にしてください。
関連リンク
 
コメント