コンテンツにスキップ

FLEX_COUNTER_TABLE SRV6 (SRv6 カウンタ)

概要

SRv6 MySID エントリごとのパケット / バイトカウンタを収集するための CONFIG_DB 設定エントリ1FLEX_COUNTER_TABLE|SRV6 に書き込むことで、orchagent 内の Srv6Orch がカウンタ収集の有効 / 無効を切り替え、SAI カウンタ API 経由でパケット数とバイト数を COUNTERS_DB に蓄積する。

SRV6_MY_SIDS テーブルで定義された各 MySID エントリに対応する SAI_OBJECT_TYPE_COUNTER オブジェクトが自動的に生成・登録される。実際のカウンタ値は sonic show srv6 コマンドで参照できる。

データフロー (自動生成)

flowchart LR
  CDB[("CONFIG_DB<br/>FLEX_COUNTER_TABLE|SRV6")]
  OA["orchagent<br/>(Srv6Orch / FlexCounterOrch)"]
  FCB[("FLEX_COUNTER_DB<br/>FLEX_COUNTER_TABLE|SRV6_STAT_COUNTER|oid")]
  SD["syncd<br/>(FlexCounter)"]
  SAI["SAI<br/>sai_counter_api"]
  CNTDB[("COUNTERS_DB<br/>COUNTERS_SRV6_NAME_MAP")]
  CDB --> OA
  OA --> FCB
  FCB --> SD
  SD --> SAI
  SD --> CNTDB

凡例

CONFIG_DB の FLEX_COUNTER_TABLE|SRV6 が orchagent → FLEX_COUNTER_DB → syncd → SAI の経路でカウンタポーリングを制御する。収集値は COUNTERS_DBCOUNTERS_SRV6_NAME_MAPCOUNTERS:<oid> に格納される。

key 構造

FLEX_COUNTER_TABLE|SRV6

固定キー。サブキーなし。

フィールド

フィールド 説明
FLEX_COUNTER_STATUS enum enable / disable カウンタポーリング有効化
FLEX_COUNTER_DELAY_STATUS boolean (true / false) system-ready まで遅延
POLL_INTERVAL uint32 (100..4294967295) [ms] ポーリング間隔

BULK_CHUNK_SIZE / BULK_CHUNK_SIZE_PER_PREFIX は SRV6 グループには定義されない(YANG にも orchagent にも実装なし)。

収集されるカウンタ

FLEX_COUNTER_STATUS = enable 時、orchagentSRV6_MY_SIDS に登録された各 MySID エントリに対して SAI_OBJECT_TYPE_COUNTER オブジェクトを作成し、以下 2 stat を収集する2:

SAI stat 意味
SAI_COUNTER_STAT_PACKETS 当該 MySID にヒットしたパケット数
SAI_COUNTER_STAT_BYTES 当該 MySID にヒットしたバイト数

カウンタは COUNTERS_DBCOUNTERS_SRV6_NAME_MAP(SID → counter OID マッピング)と COUNTERS:<oid> ハッシュに格納される。

購読者

  • FlexCounterOrch (orchagent 内): FLEX_COUNTER_STATUS 変化を検知し gSrv6Orch->setCountersState(enable) を呼び出す3
  • Srv6Orch (orchagent 内): MySID ごとの SAI カウンタオブジェクトの生成・登録・削除を管理。
  • syncdFlexCounter: FLEX_COUNTER_DBSRV6_STAT_COUNTER_ID_LISTSRV6_COUNTER_ID_LIST)を参照し SAI bulk counter API を周期呼び出し。

関連リファレンス

引用元

関連 Topics

運用ヒント

典型値

  • key: FLEX_COUNTER_TABLE|SRV6
  • FLEX_COUNTER_STATUS: enable(デフォルト disable
  • POLL_INTERVAL: 10000 ms(デフォルト・推奨値)

確認コマンド

# カウンタポーリング状態確認
counterpoll show

# SRv6 MySID カウンタ表示
sonic-clear srv6
show srv6

# CONFIG_DB 直接確認
sonic-db-cli CONFIG_DB hgetall 'FLEX_COUNTER_TABLE|SRV6'

よくある誤設定

  • enable を設定しても SAI が SAI_MY_SID_ENTRY_ATTR_COUNTER_ID をサポートしない ASIC では、カウンタが常にゼロのまま。"SRv6 counters are not supported on this platform" ログを確認すること。
  • MySID エントリが SRV6_MY_SIDS に存在しない状態で enable にしても COUNTERS_DB にエントリは現れない(SID 追加後に自動登録される)。

値依存挙動マトリクス

FLEX_COUNTER_STATUS

挙動
enable FlexCounterOrchgSrv6Orch->setCountersState(true) を呼び出し。プラットフォームが SAI 対応の場合、既存の全 MySID エントリに SAI カウンタオブジェクトを作成・登録し FLEX_COUNTER_DBSRV6_COUNTER_ID_LIST を書き込む
disable setCountersState(false) — 全 MySID の SAI カウンタを削除、FLEX_COUNTER_DB からエントリを消去。COUNTERS_DB の蓄積値は残る
未設定 デフォルト disable(FlexCounterManager コンストラクタ enabled=false、init_cfg に SRV6 エントリなし)

POLL_INTERVAL

挙動
未設定 orchagent が起動時に SRV6_STAT_COUNTER_POLLING_INTERVAL_MS = 10000 ms を syncd に設定
設定済み (1000〜30000 ms) 次回ポーリングから新しい間隔で収集。YANG 定義上は 100〜4294967295 ms だが、CLI は 1000〜30000 ms に制限

例外条件・特殊挙動

条件 挙動
プラットフォームが SAI 未対応 queryMySidCountersCapability() 失敗 → m_mysid_counters_supported = falseenable を書いても "Ignoring SRv6 counters state change as they are not supported" ログでスキップ
MySID 追加後に初めてカウンタ OID が登録される SAI カウンタ作成後、m_pending_counters に積まれ SRV6_FLEX_COUNTER_UPDATE_TIMER(1 秒)ごとに syncd へ登録。瞬時には反映されない
MySID 削除時 removeMySidCounter() が SAI カウンタを削除し FLEX_COUNTER_DB からエントリを消去
gSrv6Orch が null の場合 FlexCounterOrch の null チェックにより setCountersState が呼ばれず、enable が silent drop される
FLEX_COUNTER_DELAY_STATUS Srv6Orch コード内では参照なし。syncd 側のみ参照。通常起動では影響なし

暗黙デフォルト・コード由来挙動 (Phase A)

FLEX_COUNTER_STATUS の暗黙デフォルト

YANG に default 宣言なし。以下のコードパスがデフォルト disable を確定する:

  1. Srv6OrchFlexCounterManager コンストラクタ引数 enabled=false (srv6orch.cpp:108) — syncd への初期送信状態が disable
  2. m_mysid_counters_enabled = false (srv6orch.h:267) — ヘッダのメンバ変数デフォルト値。
  3. counterpoll/main.py:841: srv6_info.get("FLEX_COUNTER_STATUS", DISABLE) — CONFIG_DB にエントリなしの場合 disable を表示。
  4. init_cfg.json.j2 に SRV6 グループのエントリなし — ビルド時デフォルト書き込みなし。

暗黙デフォルト: disable(カウンタ収集なし)

POLL_INTERVAL の暗黙デフォルト

ソース
SRV6_STAT_COUNTER_POLLING_INTERVAL_MS = 10000 (srv6orch.cpp:27) 10000 ms — FlexCounterManager 初期化時に syncd へ送信
counterpoll CLI ソフトデフォルト DEFLT_10_SEC = "default (10000)" (counterpoll/main.py:19) 10000 ms — counterpoll show 表示上のデフォルト
CLI 入力範囲: click.IntRange(1000, 30000) (counterpoll/main.py:695) 1000〜30000 ms
YANG range 100〜4294967295 ms(CLI より広い)

ハードコードデフォルト: 10000 ms

FLEX_COUNTER_DELAY_STATUS の暗黙デフォルト

YANG に default なし。Srv6Orch コード内に FLEX_COUNTER_DELAY_STATUS 参照なし。syncd 側でのみ参照される(fast-reboot 連携用)。通常起動では遅延なし(即時)。

SRV6_COUNTER_ID_LIST の固定 stat リスト

FlowCounterHandler::getGenericCounterStatIdList() (flow_counter_handler.cpp:43-48) が SAI_COUNTER_STAT_PACKETS / SAI_COUNTER_STAT_BYTES の 2 stat のみを返す。この 2 stat は固定でユーザー変更不可。

プラットフォーム能力チェック(起動時一回限り)

Srv6Orch::initializeCounters()queryMySidCountersCapability() が起動時に一度だけ sai_query_attribute_capability() を呼び出す。失敗時はカウンタ機能全体が無効化され、CONFIG_DB への enable 書き込みは以降すべて無視される。再起動なしに状態を変えることはできない。

遅延登録メカニズム(1 秒タイマー)

MySID 追加後、SAI カウンタ OID は m_pending_counters キューに積まれ、SRV6_FLEX_COUNTER_UPDATE_TIMER = 1 秒のタイマーで処理される。m_pending_counters が空になるとタイマーが自動停止する。FLEX_COUNTER_DB への登録(= syncd によるポーリング開始)は MySID 設定から最大 1 秒遅延する。


  1. YANG 定義: sonic-flex_counter.yang container SRV6. https://github.com/sonic-net/sonic-buildimage/blob/9ea932ec2e18f35e58268ec2e4456b1d4afd65cd/src/sonic-yang-models/yang-models/sonic-flex_counter.yang#L465 

  2. FlowCounterHandler::getGenericCounterStatIdList() が返す stat リスト (SAI_COUNTER_STAT_PACKETS, SAI_COUNTER_STAT_BYTES)。sonic-swss/orchagent/flex_counter/flow_counter_handler.cpp:12-13. https://github.com/sonic-net/sonic-swss/blob/master/orchagent/flex_counter/flow_counter_handler.cpp 

  3. FlexCounterOrch::doTaskkey == SRV6_KEY 時に gSrv6Orch->setCountersState(value == "enable") を呼び出す。sonic-swss/orchagent/flexcounterorch.cpp:337. https://github.com/sonic-net/sonic-swss/blob/master/orchagent/flexcounterorch.cpp