コンテンツにスキップ

PFC_WD 状態フィールド (COUNTERS_DB)

概要

PFC Watchdog の runtime 状態・カウンタは COUNTERS_DBCOUNTERS:<queue_oid> ハッシュに書き込まれる(STATE_DB ではない)。pfcwdorchCONFIG_DB PFC_WD|<port> を読み込んで PFC WD を有効化した際に初期フィールドが書き込まれ、以降は storm 検知・復旧のたびに更新される。1

key 構造

COUNTERS:<queue_oid>   # per-queue PFC WD カウンタ

<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 期間の受信ドロップ数

ライフサイクル

  1. pfcwd start <port>pfcwdorch::startWdOnPort()registerInWdDb() がステータス系フィールドを書き込み
  2. initWdCounters()PFC_WD_STATUS=operational、カウンタ 0 (または既存値) を書き込み
  3. Lua プラグインが storm を検知 → PFC_WD_ACTION 通知 → initCounters()PFC_WD_STATUS=stormedDEADLOCK_DETECTED++*_LAST=0 を書き込み
  4. storm 解消 → commitCounters(periodic=false)PFC_WD_STATUS=operationalDEADLOCK_RESTORED++ を書き込み
  5. pfcwd stop <port>stopWdOnPort()PFC_WD_DETECTION_TIMEPFC_WD_RESTORATION_TIMEPFC_WD_ACTIONPFC_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_TIMEdetection_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 検知直後に txPktLasttxDropPktLastrxPktLastrxDropPktLast0 にリセット。直近 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

関連リファレンス

引用元