DPU カウンタ (ENI / DASH_METER) テーブル¶
概要¶
FLEX_COUNTER_TABLE|ENI および FLEX_COUNTER_TABLE|DASH_METER は、DASH (Disaggregated API for SONiC Hosts) の ENI (Elastic Network Interface) カウンタと DASH メータカウンタのポーリング設定を CONFIG_DB に保持するエントリ1。これらは DPU (Data Processing Unit) ノード専用であり、switch_type == 'dpu' の場合のみ enable_counters.py が自動的に有効化する2。通常の ToR / Spine では init_cfg.json.j2 に記載がなく、デフォルトで無効状態となる。
データフロー (自動生成)¶
flowchart LR
CDB[("CONFIG_DB<br/>FLEX_COUNTER_TABLE|ENI<br/>FLEX_COUNTER_TABLE|DASH_METER")]
ORCH["orchagent<br/>(FlexCounterOrch<br/>/ DashOrch)"]
CDB --> ORCH
FCDB[("FLEX_COUNTER_DB<br/>ENI_STAT_COUNTER<br/>METER_STAT_COUNTER")]
ORCH --> FCDB
SYNCD["syncd"]
FCDB --> SYNCD
SAI["SAI<br/>sai_eni_stats<br/>sai_meter_stats"]
SYNCD --> SAI
凡例
CONFIG_DB から SAI までの典型経路。詳細・例外は本ページ本文と対応表を参照。
key 構造¶
どちらも FLEX_COUNTER_TABLE の固定サブキー。FLEX_COUNTER_TABLE の共通フィールド (下表) のうち一部を持つ。
フィールド¶
| フィールド | 型 | 範囲 | デフォルト | 説明 |
|---|---|---|---|---|
FLEX_COUNTER_STATUS |
enum | enable / disable |
disable3 |
ポーリング有効化フラグ。DPU では enable_counters.py が起動後に enable を書き込む |
POLL_INTERVAL |
uint32 | 100..4294967295 [ms] | 100004 |
カウンタポーリング間隔 (ミリ秒) |
FLEX_COUNTER_DELAY_STATUS |
boolean_type | true / false |
未設定 (遅延なし) | fast-reboot 時に system-ready まで polling を遅らせるフラグ |
コード由来デフォルト詳細¶
FLEX_COUNTER_STATUS デフォルト = disable
DashOrch コンストラクタで EniCounter / MeterCounter を enabled=false で初期化する:
// sonic-swss/orchagent/dash/dashorch.cpp:62-63
EniCounter(ENI_STAT_COUNTER_FLEX_COUNTER_GROUP, StatsMode::READ,
ENI_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, false), // enabled=false
MeterCounter(METER_STAT_COUNTER_FLEX_COUNTER_GROUP, StatsMode::READ,
METER_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, false) // enabled=false
DashCounter テンプレートのメンバ変数 fc_status = false (dashcounter.h:15) が初期状態。CONFIG_DB にエントリが存在しない限り polling は開始されない。
POLL_INTERVAL デフォルト = 10000 ms
// sonic-swss/orchagent/dash/dashorch.h:30,33
#define ENI_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS 10000
#define METER_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS 10000
orchagent 起動時の内部デフォルト値。CONFIG_DB に POLL_INTERVAL を明示しない場合でも 10000 ms が適用される。
DPU ノードでの自動有効化 (enable_counters.py):
# sonic-buildimage/dockers/docker-orchagent/enable_counters.py:40-44
dpu_counters = ["ENI","DASH_METER"]
if platform_info.get('switch_type') == 'dpu':
for key in dpu_counters:
enable_counter_group(db, key)
- uptime < 300 秒: 180 秒待機後に
FLEX_COUNTER_STATUS: enableを CONFIG_DB に書き込む - uptime >= 300 秒: 60 秒待機後に書き込む
POLL_INTERVALは書き込まない → ハードコード値 10000 ms のまま継続
init_cfg.json.j2 への記載なし: ENI / DASH_METER は init_cfg.json.j2 に含まれず、switch_type == 'dpu' ノード以外では自動有効化されない。
グループ名マッピング¶
| CONFIG_DB キー | FlexCounter グループ名 | カウンタ ID フィールド |
|---|---|---|
ENI |
ENI_STAT_COUNTER |
ENI_COUNTER_ID_LIST |
DASH_METER |
METER_STAT_COUNTER |
DASH_METER_COUNTER_ID_LIST |
// sonic-swss/orchagent/flexcounterorch.cpp:92-93
{"ENI", ENI_STAT_COUNTER_FLEX_COUNTER_GROUP},
{"DASH_METER", METER_STAT_COUNTER_FLEX_COUNTER_GROUP},
値依存挙動マトリクス¶
FLEX_COUNTER_STATUS (ENI)¶
| 値 | 挙動 |
|---|---|
enable |
DashOrch::handleFCStatusUpdate(true, eni_entries_) が呼ばれ、全 ENI エントリに ENI_COUNTER_ID_LIST を投入 (dashorch.h:128) |
disable (デフォルト) |
handleFCStatusUpdate(false, eni_entries_) — 全 ENI エントリのカウンタ ID リストをクリア |
| 未設定 | disable と等価。ENI カウンタ polling は実行されない |
FLEX_COUNTER_STATUS (DASH_METER)¶
| 値 | 挙動 |
|---|---|
enable |
DashOrch::handleMeterFCStatusUpdate(true, eni_entries_) — 全 ENI エントリに DASH_METER_COUNTER_ID_LIST を投入 (dashorch.h:129) |
disable (デフォルト) |
メータカウンタ ID リストをクリア |
| 未設定 | disable と等価 |
POLL_INTERVAL (ENI / DASH_METER 共通)¶
| 値 | 挙動 |
|---|---|
10000 (デフォルト) |
10 秒ごとに SAI ENI / Meter カウンタを読み取り |
100..9999 |
より短い周期でポーリング。CPU 負荷が増加するリスクあり |
| 範囲外 (< 100) | YANG range 100..4294967295 違反で reject |
| 未設定 | orchagent ハードコード値 10000 ms |
制約¶
POLL_INTERVAL: 100 以上 (uint32 上限 4294967295)FLEX_COUNTER_STATUS:enableまたはdisableFLEX_COUNTER_DELAY_STATUS:trueまたはfalse(YANGstypes:boolean_type)- ENI / DASH_METER は
switch_type == 'dpu'のノードでのみ実質的に機能する
購読者¶
FlexCounterOrch(orchagent): CONFIG_DB のFLEX_COUNTER_TABLEを購読し、DashOrchのhandleFCStatusUpdate/handleMeterFCStatusUpdateを呼び出すDashOrch(orchagent): ENI エントリの追加/削除時にEniCounter/MeterCounterを通じて FLEX_COUNTER_DB に ID リストを投入
関連 CONFIG_DB / YANG / CLI¶
- 関連 CONFIG_DB:
FLEX_COUNTER_TABLE(全グループ)、DEVICE_METADATA(switch_typeが DPU 判定に使用) - 関連 YANG:
sonic-flex_counter(ENI / DASH_METER コンテナ) - 関連 CLI:
counterpoll eni enable/disable、counterpoll dash-meter enable/disable
関連リファレンス¶
- YANG:
sonic-flex_counter - 親テーブル: FLEX_COUNTER_TABLE
- CLI:
counterpoll
引用元¶
運用ヒント¶
典型値 (DPU ノード)¶
# enable_counters.py が自動書き込みするエントリ
FLEX_COUNTER_TABLE|ENI FLEX_COUNTER_STATUS=enable
FLEX_COUNTER_TABLE|DASH_METER FLEX_COUNTER_STATUS=enable
POLL_INTERVAL を明示する場合:
sonic-db-cli CONFIG_DB hset 'FLEX_COUNTER_TABLE|ENI' POLL_INTERVAL 10000
sonic-db-cli CONFIG_DB hset 'FLEX_COUNTER_TABLE|DASH_METER' POLL_INTERVAL 10000
注意事項¶
switch_type != 'dpu'の場合、enable_counters.pyは ENI / DASH_METER に触れない。手動でenableを書き込んでも orchagent が ENI エントリを持たないため実質的な影響はない。enable_counters.pyは orchagent 完全起動後 (60〜180 秒後) に実行されるため、直後のcounterpoll showではdisableのまま見える場合がある。
確認コマンド¶
# カウンタグループの状態確認
sonic-db-cli CONFIG_DB hgetall 'FLEX_COUNTER_TABLE|ENI'
sonic-db-cli CONFIG_DB hgetall 'FLEX_COUNTER_TABLE|DASH_METER'
# ENI カウンタ値の確認 (DPU ノード)
show dash counters eni
例外条件・特殊挙動¶
| consumer | 条件 | 挙動 |
|---|---|---|
enable_counters.py |
switch_type != 'dpu' |
ENI / DASH_METER への書き込みをスキップ。カウンタは disable のまま |
enable_counters.py |
uptime < 300 秒 | 180 秒 sleep 後に FLEX_COUNTER_STATUS: enable を書き込む (orchagent 起動待ち) |
enable_counters.py |
uptime >= 300 秒 | 60 秒 sleep 後に書き込む |
FlexCounterOrch |
FLEX_COUNTER_STATUS 未設定 |
デフォルト disable。DashOrch の fc_status は false のまま |
DashOrch |
ENI エントリが 0 件の状態で enable |
handleFCStatusUpdate は呼ばれるが、entries が空のためカウンタ投入なし |
| YANG バリデーション | POLL_INTERVAL < 100 |
YANG range 違反で書き込み reject |
Evidence:
sonic-swss/orchagent/dash/dashorch.cpp:62-63,dashorch.h:29-33,128-129,dashcounter.h:15,enable_counters.py:40-44
実コンテナ動作トレース¶
段階 1 — orchagent 起動時の初期化¶
DashOrch コンストラクタが EniCounter / MeterCounter を enabled=false で生成。FlexCounterManager::applyGroupConfiguration() が FLEX_COUNTER_DB に FLEX_COUNTER_STATUS=disable, POLL_INTERVAL=10000 を書き込む。
段階 2 — enable_counters.py による自動有効化 (DPU のみ)¶
docker-orchagent 内の enable_counters.py が起動後 60〜180 秒後に実行。switch_type == 'dpu' を確認し、CONFIG_DB FLEX_COUNTER_TABLE|ENI と FLEX_COUNTER_TABLE|DASH_METER に FLEX_COUNTER_STATUS: enable を書き込む。
段階 3 — FlexCounterOrch がステータス変化を検知¶
FlexCounterOrch::doTask() が CONFIG_DB 変化を受信。flexCounterGroupMap["ENI"] → ENI_STAT_COUNTER_FLEX_COUNTER_GROUP を解決し、DashOrch::handleFCStatusUpdate(true) を呼び出す。
段階 4 — FLEX_COUNTER_DB への ID リスト投入¶
DashCounter::handleStatusUpdate(true, eni_entries_) → refreshStats(true, entries) → 各 ENI OID に対して stat_manager.setCounterIdList(oid, CT, counter_stats) を実行。FLEX_COUNTER_DB の ENI_STAT_COUNTER:<oid> に ENI_COUNTER_ID_LIST が書き込まれる。
段階 5 — syncd によるポーリング¶
syncd の FlexCounter モジュールが FLEX_COUNTER_DB を購読し、10000 ms ごとに SAI の ENI / Meter カウンタ API を呼び出す。結果は COUNTERS_DB に格納される。
書き込み入り口 (Direction A)¶
対象テーブル: FLEX_COUNTER_TABLE|ENI, FLEX_COUNTER_TABLE|DASH_METER
CLI¶
counterpoll eni enable/disablecounterpoll eni interval <ms>counterpoll dash-meter enable/disablecounterpoll dash-meter interval <ms>
minigraph / sonic-cfggen¶
- なし (ENI / DASH_METER は minigraph 対象外)
REST / gNMI (sonic-mgmt-common)¶
- なし
db_migrator¶
- なし
ビルド時デフォルト (init_cfg / j2 テンプレート)¶
- なし —
init_cfg.json.j2に ENI / DASH_METER の記載なし
ハードコードデフォルト¶
POLL_INTERVAL = 10000ms (dashorch.h:30,33)FLEX_COUNTER_STATUS = disable(dashorch.cpp:62-63)
ランタイム注入 (デーモン自動書き込み)¶
enable_counters.py:switch_type == 'dpu'の場合のみ、起動後 60〜180 秒後にFLEX_COUNTER_STATUS: enableを書き込む
-
YANG 定義:
sonic-flex_counter.yangENI / DASH_METER コンテナ. https://github.com/sonic-net/sonic-buildimage/blob/9ea932ec2e18f35e58268ec2e4456b1d4afd65cd/src/sonic-yang-models/yang-models/sonic-flex_counter.yang#L93-L125 ↩ -
DPU 専用有効化ロジック:
enable_counters.py. https://github.com/sonic-net/sonic-buildimage/blob/9ea932ec2e18f35e58268ec2e4456b1d4afd65cd/dockers/docker-orchagent/enable_counters.py#L40-L44 ↩ -
デフォルト
disable:dashorch.cpp:62-63(enabled=false). https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/orchagent/dash/dashorch.cpp#L62-L63 ↩ -
デフォルト polling interval:
dashorch.h:30,33. https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/orchagent/dash/dashorch.h#L30-L33 ↩