PFC_WD 状態フィールド (COUNTERS_DB)¶
概要¶
PFC Watchdog の runtime 状態・カウンタは COUNTERS_DB の COUNTERS:<queue_oid> ハッシュに書き込まれる(STATE_DB ではない)。pfcwdorch が CONFIG_DB PFC_WD|<port> を読み込んで PFC WD を有効化した際に初期フィールドが書き込まれ、以降は storm 検知・復旧のたびに更新される。1
key 構造¶
<queue_oid> は COUNTERS_QUEUE_NAME_MAP で <port>:<queue_index> に対応する SAI オブジェクト ID。
主要フィールド¶
ステータスフィールド¶
| フィールド | 値 | 説明 |
|---|---|---|
PFC_WD_STATUS |
operational / stormed |
queue の現在状態。PFC WD 有効化直後は operational |
PFC_WD_DETECTION_TIME |
uint (μs) | CONFIG_DB detection_time (ms) × 1000 変換値。Lua プラグインが storm 検知判定に使用 |
PFC_WD_RESTORATION_TIME |
uint (μs) / "" |
CONFIG_DB restoration_time (ms) × 1000 変換値。未設定時は "" (無限待機) |
PFC_WD_ACTION |
drop / forward / alert |
CONFIG_DB action の複写。未設定時は drop |
PFC_STAT_HISTORY |
enable / disable |
CONFIG_DB pfc_stat_history の複写。未設定時は disable |
カウンタフィールド¶
| フィールド | 説明 |
|---|---|
PFC_WD_QUEUE_STATS_DEADLOCK_DETECTED |
storm 検知累積回数 |
PFC_WD_QUEUE_STATS_DEADLOCK_RESTORED |
storm 復旧累積回数 |
PFC_WD_QUEUE_STATS_TX_PACKETS |
storm 期間中の送信パケット累積数 |
PFC_WD_QUEUE_STATS_TX_DROPPED_PACKETS |
storm 期間中の送信ドロップ累積数 |
PFC_WD_QUEUE_STATS_RX_PACKETS |
storm 期間中の受信パケット累積数 |
PFC_WD_QUEUE_STATS_RX_DROPPED_PACKETS |
storm 期間中の受信ドロップ累積数 |
PFC_WD_QUEUE_STATS_TX_PACKETS_LAST |
直近 storm 期間の送信パケット数 |
PFC_WD_QUEUE_STATS_TX_DROPPED_PACKETS_LAST |
直近 storm 期間の送信ドロップ数 |
PFC_WD_QUEUE_STATS_RX_PACKETS_LAST |
直近 storm 期間の受信パケット数 |
PFC_WD_QUEUE_STATS_RX_DROPPED_PACKETS_LAST |
直近 storm 期間の受信ドロップ数 |
ライフサイクル¶
pfcwd start <port>→pfcwdorch::startWdOnPort()→registerInWdDb()がステータス系フィールドを書き込みinitWdCounters()がPFC_WD_STATUS=operational、カウンタ 0 (または既存値) を書き込み- Lua プラグインが storm を検知 →
PFC_WD_ACTION通知 →initCounters()がPFC_WD_STATUS=stormed、DEADLOCK_DETECTED++、*_LAST=0を書き込み - storm 解消 →
commitCounters(periodic=false)がPFC_WD_STATUS=operational、DEADLOCK_RESTORED++を書き込み pfcwd stop <port>→stopWdOnPort()→PFC_WD_DETECTION_TIME、PFC_WD_RESTORATION_TIME、PFC_WD_ACTION、PFC_WD_STATUSを削除。カウンタ系フィールドは残留
コード由来の暗黙デフォルト¶
PFC_WD_STATUS — 初期値 "operational"¶
initWdCounters() (pfcactionhandler.cpp:192) が PFC WD 有効化直後に PFC_WD_QUEUE_STATUS_OPERATIONAL = "operational" を書き込む。storm 検知時に "stormed" へ、storm 復旧時に "operational" へ遷移する。
PFC_WD_QUEUE_STATS_DEADLOCK_DETECTED / _RESTORED — 初期値 0¶
getQueueStats() (pfcactionhandler.cpp:119) で memset(&stats, 0, ...) によりゼロ初期化。既存エントリが COUNTERS_DB にある場合はその値を読み出して継続(再起動後もカウンタ保持)。warm-reboot 後に storm が再通知されたとき detectCount > restoreCount なら detectCount を増やさない(pfcactionhandler.cpp:66-69)。
PFC_WD_DETECTION_TIME — detection_time × 1000 μs¶
registerInWdDb() (pfcwdorch.cpp:570) が CONFIG_DB の detection_time (ms) を 1000 倍した値を μs 単位で書き込む。Lua プラグインがこの値を storm 検知閾値として参照する。
PFC_WD_RESTORATION_TIME — 未設定時は空文字列¶
pfcwdorch.cpp:572-575: restorationTime == 0 なら "" を書き込む(無限待機相当)。CONFIG_DB に restoration_time が存在しない場合、orchagent の初期値 restorationTime=0 がそのまま使われる。
PFC_WD_ACTION — デフォルト "drop"¶
createEntry() (pfcwdorch.cpp:190) で PfcWdAction::PFC_WD_ACTION_DROP に初期化。CONFIG_DB に action フィールドが存在しない場合も "drop" が COUNTERS_DB に書かれる。
PFC_STAT_HISTORY — デフォルト "disable"¶
createEntry() (pfcwdorch.cpp:191) で string pfcStatHistory = "disable" に初期化。CONFIG_DB に pfc_stat_history が存在しない場合も "disable" が書かれる。
*_LAST カウンタ — storm 検知ごとにゼロリセット¶
initCounters() (pfcactionhandler.cpp:70-74) が storm 検知直後に txPktLast、txDropPktLast、rxPktLast、rxDropPktLast を 0 にリセット。直近 storm 期間中の差分のみが加算される。
確認コマンド¶
# queue OID を取得
sonic-db-cli COUNTERS_DB hgetall COUNTERS_QUEUE_NAME_MAP | grep Ethernet0
# PFC WD 状態を確認
sonic-db-cli COUNTERS_DB hgetall COUNTERS:<queue_oid>
# pfcwd CLI
show pfcwd stats
関連リファレンス¶
- CONFIG_DB: PFC_WD テーブル
- YANG: sonic-pfcwd
- CLI:
pfcwd stats
引用元¶
-
pfcactionhandler.cppおよびpfcwdorch.cpp. https://github.com/sonic-net/sonic-swss/blob/master/orchagent/pfcactionhandler.cpp ↩