Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 08 章: QoS / Buffer / PFC を参照。
裏取りステータス: Code-verified
sonic-swss/orchagent/portsorch.h L42 で WRED_QUEUE_STAT_COUNTER_FLEX_COUNTER_GROUP = "WRED_ECN_QUEUE_STAT_COUNTER" を確認、flexcounterorch.cpp L62/L95 で WRED_QUEUE_KEY = "WRED_ECN_QUEUE" のマッピングを確認。portsorch.cpp L433 で SAI_QUEUE_STAT_WRED_DROPPED_PACKETS を、L1872-1901 で m_queueCounterCapabilitiesTable への WRED_ECN_QUEUE_*_COUNTER capability 書き込みを確認。sonic-utilities/counterpoll/main.py L609-L624 で counterpoll wredqueue サブコマンド群、tests/counterpoll_test.py L326-L374 で wredport / wredqueue enable/interval を確認(verified at: 2026-05-09)。
WRED / ECN 統計(per-queue / per-port、capability ベース)¶
これは何か(一行で)¶
SAI が出す WRED ドロップ / ECN マーク専用カウンタを Flex Counter で COUNTERS_DB に出し、show queue wredcounters および show interfaces counters detailed の拡張で見えるようにする1。
どんなときに使うか¶
- 「
portstatのRX_DRPが増えているが、これが WRED 起因か知りたい」 - 「ECN マーク数を per-queue で観測したい」(輻輳制御のチューニング)
- WRED ドロップを color 別(Green / Yellow / Red)で見たい
設計上のキモ: capability ベース¶
プラットフォームによって対応カウンタが異なるため、orchagent が起動時に sai_query_stats_capability を呼び、STATE_DB に結果を書く。CLI はそれを見て 対応カウンタだけを取得・表示 し、非対応は N/A1。
SAI_PORT_STAT_ECN_MARKED_PACKETS(ポート単位 ECN マーク)は本 HLD の 次フェーズ 扱い。
全体フロー¶
flowchart LR
SAI[SAI] --> ORCH[orchagent 起動時]
ORCH -->|capability| SDB[(STATE_DB\nQUEUE_COUNTER_CAPABILITIES\nPORT_COUNTER_CAPABILITIES)]
User[counterpoll wredqueue/wredport enable] --> CDB[(CONFIG_DB\nFLEX_COUNTER_TABLE)]
CDB --> ORCH
ORCH -->|stat-id 登録| FCDB[(FLEX_COUNTER_DB)] --> SYNCD[syncd]
SYNCD -->|periodic poll| CNT[(COUNTERS_DB)]
CLI[show queue wredcounters\nshow interfaces counters detailed] --> SDB
CLI --> CNT
Capability キー¶
STATE_DB に書かれる主なフラグ1:
QUEUE_COUNTER_CAPABILITIES:
WRED_ECN_QUEUE_ECN_MARKED_PKT_COUNTER : true/false
WRED_ECN_QUEUE_ECN_MARKED_BYTE_COUNTER : ...
WRED_ECN_QUEUE_WRED_DROPPED_PKT_COUNTER: ...
WRED_ECN_QUEUE_WRED_DROPPED_BYTE_COUNTER: ...
PORT_COUNTER_CAPABILITIES:
WRED_ECN_PORT_WRED_GREEN_DROP_COUNTER : ...
WRED_ECN_PORT_WRED_YELLOW_DROP_COUNTER: ...
WRED_ECN_PORT_WRED_RED_DROP_COUNTER : ...
WRED_ECN_PORT_WRED_TOTAL_DROP_COUNTER : ...
既定すべて false。全部 false のグループを counterpoll で enable すると syslog エラー を出す仕様1。
Flex Counter グループ¶
新規 2 グループ。既定 disable1:
| グループ | 既定 POLL_INTERVAL | 計測対象 SAI カウンタ |
|---|---|---|
WRED_ECN_QUEUE |
10000 ms | SAI_QUEUE_STAT_WRED_ECN_MARKED_PACKETS / _BYTES, SAI_QUEUE_STAT_WRED_DROPPED_PACKETS / _BYTES |
WRED_ECN_PORT |
1000 ms | SAI_PORT_STAT_GREEN_WRED_DROPPED_PACKETS, _YELLOW_.., _RED_.., SAI_PORT_STAT_WRED_DROPPED_PACKETS(合計) |
ポート側は将来 SAI_PORT_STAT_ECN_MARKED_PACKETS 追加予定。
CLI¶
| Command | 用途 |
|---|---|
counterpoll wredqueue {enable\|disable} |
WRED_ECN_QUEUE グループ ON/OFF |
counterpoll wredport {enable\|disable} |
WRED_ECN_PORT グループ ON/OFF |
counterpoll wredqueue interval <ms> |
キュー側ポーリング間隔 |
counterpoll wredport interval <ms> |
ポート側ポーリング間隔 |
show queue wredcounters [<intf>] |
キュー単位 WRED/ECN 統計(新規) |
sonic-clear queue wredcounters |
キュー単位クリア(新規) |
show interfaces counters detailed <intf> |
出力末尾に WRED Green/Yellow/Red/Total を追加 |
表示例(両対応プラットフォーム)1:
$ show queue wredcounters Ethernet16
Port TxQ WredDrp/pkts WredDrp/bytes EcnMarked/pkts EcnMarked/bytes
Ethernet16 UC0 0 0 0 0
Ethernet16 UC1 1 120 0 0
ECN 非対応なら EcnMarked/* が N/A、WRED 非対応なら WredDrp/* が N/A。
設定¶
CONFIG_DB¶
| Table | Key | フィールド | 説明 |
|---|---|---|---|
FLEX_COUNTER_TABLE |
WRED_ECN_QUEUE |
FLEX_COUNTER_STATUS |
enable / disable(既定 disable) |
POLL_INTERVAL |
ms 単位(既定 10000) | ||
FLEX_COUNTER_TABLE |
WRED_ECN_PORT |
FLEX_COUNTER_STATUS |
同上(既定 disable) |
POLL_INTERVAL |
ms 単位(既定 1000) |
YANG¶
sonic-flex_counter.yang に WRED_ECN_QUEUE / WRED_ECN_PORT コンテナを追加1:
container WRED_ECN_QUEUE {
leaf FLEX_COUNTER_STATUS { type flex_status; }
leaf FLEX_COUNTER_DELAY_STATUS { type flex_delay_status; }
leaf POLL_INTERVAL { type poll_interval; }
}
container WRED_ECN_PORT { /* 同様 */ }
設定例¶
counterpoll wredqueue enable
counterpoll wredport enable
show queue wredcounters Ethernet16
show interfaces counters detailed Ethernet16
sonic-clear queue wredcounters
干渉する機能¶
portstat/queuestat: 共通 Flex Counter インフラに並ぶ。POLL_INTERVALを縮めすぎると syncd 全体の負荷が増える- WRED 設定 (
WRED_PROFILE): プロファイルがキューに紐付いていないと drop / mark は増えない - ECN マーキング: WRED プロファイル内の
ecn設定が必要。無効なキューではEcnMarked/*が 0 のまま - Warm/fast boot: HLD で「影響なし」と明記1
トラブルシューティング¶
show queue wredcountersで値が出ない →STATE_DB.QUEUE_COUNTER_CAPABILITIESを確認。全falseなら SAI 未対応- 一部だけ
N/A→ capability 差異による仕様 - enable 後もカウンタ 0 →
FLEX_COUNTER_TABLE|WRED_ECN_QUEUEのFLEX_COUNTER_STATUS=enableとPOLL_INTERVAL、syncd ログで group が ready かを確認 - syslog エラー → 全カウンタ非対応グループを enable した場合の仕様
show interfaces counters detailedに WRED 行が出ない →WRED_ECN_PORTが disable / capability false
コマンド例: WRED / ECN 統計確認¶
下記コマンドを順に実行することで、関連する CONFIG_DB / APP_DB / STATE_DB のエントリと、 CLI 表示・syslog の整合を一通り突き合わせ確認できる。
# WRED profile と queue ごとの ECN マーク / drop 数
show queue counters
redis-cli -n 4 keys 'WRED_PROFILE|*'
redis-cli -n 2 keys 'COUNTERS:*' | head