アプリケーション フローカウンタ設定¶
概要¶
SONiC には 2 種類のアプリケーションレベルフローカウンタがある1。
- Trap flow counter (
FLOW_CNT_TRAP) — ホスト CPU に転送されるパケットを trap グループ(COPP_TABLEエントリ)単位でカウントする。copporch が SAI HOSTIF trap に generic counter を紐付け、COUNTERS_DBにSAI_COUNTER_STAT_PACKETS/SAI_COUNTER_STAT_BYTESを格納する。 - 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:<oid>")]
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 構造¶
<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_TABLE に POLL_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 show は POLL_INTERVAL フィールドが CONFIG_DB に存在しない場合 "default (10000)" を表示する(counterpoll/main.py:19 の DEFLT_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_ROUTE を enable にしても SAI が SAI_ROUTE_ENTRY_ATTR_COUNTER_ID の set_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_ROUTE の enable を受信しても flexcounterorch が generateRouteFlowStats() を呼ばない(flexcounterorch.cpp:324 の条件分岐)。
max_match_count のデフォルト値 (30)¶
FLOW_COUNTER_ROUTE_PATTERN に max_match_count を設定しない場合、orchagent 側の ROUTE_PATTERN_DEFAULT_MAX_MATCH_COUNT = 30(flowcounterrouteorch.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_ROUTE を enable にしてからカウンタが COUNTERS_DB に実際に現れるまで最大数秒のラグが生じる。
SAI generic counter の stat リスト(ハードコード)¶
両グループとも FlowCounterHandler の generic_counter_stat_ids[] に定義された 2 stat のみを収集する4。ユーザーが変更する手段はない。
| SAI stat | 意味 |
|---|---|
SAI_COUNTER_STAT_PACKETS |
パケット数 |
SAI_COUNTER_STAT_BYTES |
バイト数 |
関連リファレンス¶
- CONFIG_DB FLEX_COUNTER_TABLE — グループレベルの enable/disable・polling interval 設定
- CONFIG_DB debug-counter
- CLI:
counterpoll flowcnt-trap,counterpoll flowcnt-route,show flowcnt-trap stats,show flowcnt-route stats
引用元¶
-
Flow counter 設計:
SONiC/doc/flow_counters/flow_counters.md. https://github.com/sonic-net/SONiC/blob/master/doc/flow_counters/flow_counters.md ↩ -
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 ↩ -
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 ↩ -
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 ↩