コンテンツにスキップ

アプリケーション フローカウンタ設定

概要

SONiC には 2 種類のアプリケーションレベルフローカウンタがある1

  1. Trap flow counter (FLOW_CNT_TRAP) — ホスト CPU に転送されるパケットを trap グループ(COPP_TABLE エントリ)単位でカウントする。copporch が SAI HOSTIF trap に generic counter を紐付け、COUNTERS_DBSAI_COUNTER_STAT_PACKETS / SAI_COUNTER_STAT_BYTES を格納する。
  2. Route flow counter (FLOW_CNT_ROUTE) — ユーザー指定のプレフィックスパターンにマッチするルートのパケット・バイト数をカウントする。FlowCounterRouteOrch が SAI route entry に generic counter を紐付ける。

どちらも CONFIG_DB の FLEX_COUNTER_TABLE でポーリングの enable/disable および間隔を制御し、FLOW_COUNTER_ROUTE_PATTERN でルートパターンを設定する。

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

flowchart LR
  FCT[("CONFIG_DB<br/>FLEX_COUNTER_TABLE<br/>FLOW_CNT_TRAP / FLOW_CNT_ROUTE")]
  PAT[("CONFIG_DB<br/>FLOW_COUNTER_ROUTE_PATTERN")]
  ORC["copporch / FlowCounterRouteOrch"]
  FCB[("FLEX_COUNTER_DB<br/>FLOW_COUNTER_ID_LIST")]
  SD["syncd<br/>(FlexCounter)"]
  CNT[("COUNTERS_DB<br/>COUNTERS:&lt;oid&gt;")]
  FCT --> ORC
  PAT --> ORC
  ORC --> FCB
  FCB --> SD
  SD --> CNT

凡例

CONFIG_DB の 2 テーブルが orchagent を通じて FLEX_COUNTER_DB に per-OID エントリを書き込み、syncd が SAI generic counter API で周期収集した結果が COUNTERS_DB に格納される。

FLEX_COUNTER_TABLE|FLOW_CNT_TRAP

key 構造

CONFIG_DB / FLEX_COUNTER_TABLE|FLOW_CNT_TRAP   (Hash)
  FLEX_COUNTER_STATUS : enable | disable
  POLL_INTERVAL       : <uint ms>

フィールド一覧

フィールド デフォルト 説明
FLEX_COUNTER_STATUS enable | disable なし (実質 disable) trap カウンタ収集の有効化。enable で copporch が全 COPP trap グループに generic counter を紐付ける
POLL_INTERVAL uint (ms) なし (コード値 10000) syncd の SAI ポーリング間隔

FLEX_COUNTER_TABLE|FLOW_CNT_ROUTE

key 構造

CONFIG_DB / FLEX_COUNTER_TABLE|FLOW_CNT_ROUTE  (Hash)
  FLEX_COUNTER_STATUS : enable | disable
  POLL_INTERVAL       : <uint ms>

フィールド一覧

フィールド デフォルト 説明
FLEX_COUNTER_STATUS enable | disable なし (実質 disable) route flow counter の有効化。SAI 能力がある場合のみ有効
POLL_INTERVAL uint (ms) なし (コード値 10000) syncd の SAI ポーリング間隔

FLOW_COUNTER_ROUTE_PATTERN

key 構造

CONFIG_DB / FLOW_COUNTER_ROUTE_PATTERN|<key>   (Hash)
  max_match_count : <uint 1–50>

<key> の形式: - デフォルト VRF の場合: <prefix> (例: 192.168.0.0/16) - 非デフォルト VRF の場合: <vrf_name>|<prefix> (例: Vrf_red|10.0.0.0/8)

フィールド一覧

フィールド デフォルト 説明
max_match_count uint (1–50) 30 このパターンにマッチさせるルートの最大件数。超過分にはカウンタが割り当てられない

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

ポーリング間隔のコード由来デフォルト

FLEX_COUNTER_TABLEPOLL_INTERVAL が設定されていない場合、orchagent が FlexCounterManager コンストラクタ引数に渡したハードコード値が使われる2

グループ 定数名 ソースファイル
FLOW_CNT_TRAP (HOSTIF_TRAP_FLOW_COUNTER) HOSTIF_TRAP_COUNTER_POLLING_INTERVAL_MS 10000 ms copporch.cpp:189
FLOW_CNT_ROUTE (ROUTE_FLOW_COUNTER) ROUTE_FLOW_COUNTER_POLLING_INTERVAL_MS 10000 ms flowcounterrouteorch.cpp:26

counterpoll show との対応

counterpoll showPOLL_INTERVAL フィールドが CONFIG_DB に存在しない場合 "default (10000)" を表示する(counterpoll/main.py:19DEFLT_10_SEC)。orchagent のハードコード値と一致する。

FLEX_COUNTER_STATUS 未設定時の挙動

起動直後、両グループとも disable 状態として扱われる。

グループ コード由来デフォルト
FLOW_CNT_TRAP m_hostif_trap_counter_enabled = false (flexcounterorch.h)。copporch はカウンタを登録しない
FLOW_CNT_ROUTE m_route_flow_counter_enabled = false (flexcounterorch.h:75)。FlowCounterRouteOrch は generateRouteFlowStats() を実行しない

Route flow counter の SAI 能力チェック

FLOW_CNT_ROUTEenable にしても SAI が SAI_ROUTE_ENTRY_ATTR_COUNTER_IDset_implemented を返さない場合はカウンタが生成されない3

// flow_counter_handler.cpp:54-61
sai_status_t status = sai_query_attribute_capability(
    gSwitchId, SAI_OBJECT_TYPE_ROUTE_ENTRY,
    SAI_ROUTE_ENTRY_ATTR_COUNTER_ID, &capability);
if (status != SAI_STATUS_SUCCESS) { return false; }
return capability.set_implemented;

mRouteFlowCounterSupported = false の場合、FLEX_COUNTER_TABLE|FLOW_CNT_ROUTEenable を受信しても flexcounterorch が generateRouteFlowStats() を呼ばない(flexcounterorch.cpp:324 の条件分岐)。

max_match_count のデフォルト値 (30)

FLOW_COUNTER_ROUTE_PATTERNmax_match_count を設定しない場合、orchagent 側の ROUTE_PATTERN_DEFAULT_MAX_MATCH_COUNT = 30flowcounterrouteorch.cpp:25)が採用される。CLI の config flowcnt-route pattern add --max オプションのデフォルトも 30(config/flow_counters.py:29)で一致している。

IPv4 / IPv6 各 1 パターン制限(CLI のみ)

CLI config flowcnt-route pattern add は IPv4 パターンと IPv6 パターンをそれぞれ同時に 1 件のみ許容し、既存パターンを置換するよう設計されている(config/flow_counters.py:138-156)。ただしこれは CLI レベルのガードであり、CONFIG_DB を直接編集すれば複数パターンを登録できる。orchagent はすべてのパターンを処理する。

FLEX_COUNTER_UPD_INTERVAL = 1 秒の非同期タイマー

FlowCounterRouteOrch は COUNTERS_DB への書き込みを 1 秒間隔のタイマーで非同期に処理する(flowcounterrouteorch.cpp:21, 43-46)。FLOW_CNT_ROUTEenable にしてからカウンタが COUNTERS_DB に実際に現れるまで最大数秒のラグが生じる。

SAI generic counter の stat リスト(ハードコード)

両グループとも FlowCounterHandler の generic_counter_stat_ids[] に定義された 2 stat のみを収集する4。ユーザーが変更する手段はない。

SAI stat 意味
SAI_COUNTER_STAT_PACKETS パケット数
SAI_COUNTER_STAT_BYTES バイト数

関連リファレンス

引用元


  1. Flow counter 設計: SONiC/doc/flow_counters/flow_counters.md. https://github.com/sonic-net/SONiC/blob/master/doc/flow_counters/flow_counters.md 

  2. Trap/Route カウンタポーリング間隔ハードコード: sonic-swss/orchagent/copporch.cpp:189, sonic-swss/orchagent/flex_counter/flowcounterrouteorch.cpp:26. https://github.com/sonic-net/sonic-swss/blob/master/orchagent/copporch.cpp#L189 

  3. SAI route counter 能力チェック: sonic-swss/orchagent/flex_counter/flow_counter_handler.cpp:51-62. https://github.com/sonic-net/sonic-swss/blob/master/orchagent/flex_counter/flow_counter_handler.cpp#L51 

  4. Generic counter stat リスト: sonic-swss/orchagent/flex_counter/flow_counter_handler.cpp:10-13. https://github.com/sonic-net/sonic-swss/blob/master/orchagent/flex_counter/flow_counter_handler.cpp#L10