コンテンツにスキップ

FLEX_COUNTER_TABLE — PG_WATERMARK エントリ

概要

FLEX_COUNTER_TABLE|PG_WATERMARK は、SONiCPriority Group(PG)ウォーターマークカウンタのポーリングを制御するエントリである1。有効化すると orchagent 内の portsorch が各 PG の SAI OID を syncd FlexCounter に登録し、60 秒ごとに SAI_INGRESS_PRIORITY_GROUP_STAT_XOFF_ROOM_WATERMARK_BYTES / SAI_INGRESS_PRIORITY_GROUP_STAT_SHARED_WATERMARK_BYTES を収集する。

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

flowchart LR
  CFG[("CONFIG_DB\nFLEX_COUNTER_TABLE|PG_WATERMARK")]
  FCO["flexcounterorch\n(orchagent)"]
  PO["portsorch\n(orchagent)"]
  WO["watermarkorch\n(orchagent)"]
  FC["syncd\nFlexCounter\nPG_WATERMARK_STAT_COUNTER"]
  SAI["SAI\nsai_get_ingress_priority_group_stats"]
  CDB[("COUNTERS_DB\nPERIODIC/PERSISTENT/USER_WATERMARKS")]
  CLI["watermarkstat\ncounterpoll show"]

  CFG -- FLEX_COUNTER_STATUS=enable --> FCO
  FCO -- m_pg_watermark_enabled=true --> PO
  CFG -- FLEX_COUNTER_STATUS --> WO
  PO -- setCounterIdList\n(PG OID) --> FC
  FC -- sai_get_ingress_priority_group_stats\nREAD_AND_CLEAR --> SAI
  SAI -- ウォーターマーク値 --> FC
  FC --> CDB
  CDB --> CLI

凡例

FLEX_COUNTER_STATUS=enable を受けた flexcounterorch が m_pg_watermark_enabled フラグを立て、portsorch が PG OID を FlexCounter に登録する。syncd は READ_AND_CLEAR モードで SAI カウンタを読み取り後リセットする。


キー構造

FLEX_COUNTER_TABLE|PG_WATERMARK

固定エントリ(シングルトン)。<group> 部分は常に PG_WATERMARK


フィールド一覧

フィールド 必須 説明
FLEX_COUNTER_STATUS enable / disable いいえ PG ウォーターマークカウンタのポーリング有効化。未設定時は disable 相当
POLL_INTERVAL uint32 [ms] いいえ ポーリング間隔。未設定時はコード由来デフォルト 60000 ms
FLEX_COUNTER_DELAY_STATUS boolean いいえ fast-reboot 等で system-ready まで遅延起動。通常は未設定
BULK_CHUNK_SIZE uint32 いいえ bulk API 1 回のエントリ数。未設定時は syncd 内部デフォルト
BULK_CHUNK_SIZE_PER_PREFIX string いいえ プレフィクス別 bulk サイズ。通常は未設定

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

FLEX_COUNTER_STATUS のデフォルトは disable

エントリが存在しない場合または FLEX_COUNTER_STATUS フィールドが未設定の場合、counterpoll の show コマンドは DISABLE ("disable") を表示する2。orchagent の flexcounterorch.cpp:265-268 では i.second == "enable" のときのみ m_pg_watermark_enabled = true にセットされるため、明示的な enable 設定がなければ FlexCounter への PG OID 登録は行われない。

管理デバイス例外: minigraph.py:58 で定義された mgmt_disabled_counters リストに PG_WATERMARK が含まれ、管理デバイス(type が mgmt_device_types)では minigraph 生成時に FLEX_COUNTER_STATUS = "disable" が明示的に書き込まれる3

POLL_INTERVAL のコード由来デフォルトは 60000 ms

portsorch.h:39#define PG_WATERMARK_FLEX_STAT_COUNTER_POLL_MSECS "60000" および portsorch.cpp:92#define PG_WATERMARK_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS 60000 がハードコードされたデフォルト値である4

  • portsorch コンストラクタ (portsorch.cpp:736) で pg_watermark_manager を 60000 ms / StatsMode::READ_AND_CLEAR で初期化。
  • portsorch init (portsorch.cpp:872-876) で setFlexCounterGroupParameter() → syncd の FLEX_COUNTER_GROUP_TABLE|PG_WATERMARK_STAT_COUNTER にこの値を書き込み。
  • counterpoll watermark interval <ms> で上書き可能(CONFIG_DB の POLL_INTERVAL フィールドに書き込まれ、orchagent が反映する)。

STATS_MODE は READ_AND_CLEAR(ユーザー変更不可)

PG ウォーターマーク FlexCounter グループは StatsMode::READ_AND_CLEAR モードで動作する4。これはユーザーが CONFIG_DB から変更できるフィールドではなく、orchagent が setFlexCounterGroupParameter() 呼び出し時に固定で指定する。SAI からポーリングするたびにハードウェアのウォーターマークレジスタがリセットされる。PERIODIC_WATERMARKS / PERSISTENT_WATERMARKS / USER_WATERMARKS テーブルへの振り分けは syncd 側の Lua スクリプト(pgWmSha)が処理する。

収集 SAI カウンタはコードハードコード(変更不可)

portsorch.cpp:410-414 の静的配列 ingressPriorityGroupWatermarkStatIds が収集フィールドを決定する5

static const vector<sai_ingress_priority_group_stat_t> ingressPriorityGroupWatermarkStatIds =
{
    SAI_INGRESS_PRIORITY_GROUP_STAT_XOFF_ROOM_WATERMARK_BYTES,
    SAI_INGRESS_PRIORITY_GROUP_STAT_SHARED_WATERMARK_BYTES,
};

YANG モデル・CONFIG_DB・FLEX_COUNTER_TABLE のいずれからも変更不可能。ハードウェアが当該カウンタをサポートしない場合、syncd が sai_get_ingress_priority_group_stats を呼んでも値 0 が返るか、SAI_STATUS_NOT_SUPPORTED でスキップされる。

PG OID 登録はルーティングと enable フラグの両方が必要

createPortBufferPgCounters()(BUFFER_PG テーブルへの設定イベント)内で getPgWatermarkCountersState() を確認後にのみ SAI OID を FlexCounter に登録する。FLEX_COUNTER_TABLE|PG_WATERMARKenable でない状態で BUFFER_PG テーブルを設定しても、ウォーターマークカウンタの SAI 登録は行われない。後から enable にした場合は addPriorityGroupWatermarkFlexCounters() の再実行で追加される6

watermarkorch との telemetry タイマー連携

watermarkorch.cpp:9#define DEFAULT_TELEMETRY_INTERVAL 120 により、telemetry タイマーのデフォルト周期は 120 秒。handleFcConfigUpdate()(watermarkorch.cpp:116-141)が PG_WATERMARKQUEUE_WATERMARK を同時監視し、どちらかが enable になると m_telemetryTimer->start() を呼んで PERIODIC_WATERMARKS テーブルの周期リセットをスケジュールする7。このタイマー周期は WATERMARK_TABLE|TELEMETRY_INTERVAL エントリの interval フィールドで変更可能(counterpoll とは別経路)。


設定例

{
    "FLEX_COUNTER_TABLE": {
        "PG_WATERMARK": {
            "FLEX_COUNTER_STATUS": "enable",
            "POLL_INTERVAL": "60000"
        }
    }
}

CLI での操作

# PG ウォーターマークカウンタを有効化
counterpoll watermark enable

# ポーリング間隔を変更(ms)
counterpoll watermark interval 30000

# 現在の設定を確認
counterpoll show

# ウォーターマーク値を表示
watermarkstat priority-group shared
watermarkstat priority-group headroom

関連リファレンス


引用元


  1. portsorch.cpp:736 および flexcounterorch.cpp:265-270 — PG_WATERMARK FlexCounter グループの初期化と enable ハンドラ。https://github.com/sonic-net/sonic-swss/blob/master/orchagent/portsorch.cpp 

  2. counterpoll/main.py:819 — pg_wm_info.get("FLEX_COUNTER_STATUS", DISABLE) によるデフォルト "disable" 表示。https://github.com/sonic-net/sonic-utilities/blob/master/counterpoll/main.py 

  3. minigraph.py:58/2740 — mgmt_disabled_counters リストに PG_WATERMARK が含まれ、管理デバイスで disable を明示設定。https://github.com/sonic-net/sonic-buildimage/blob/master/src/sonic-config-engine/minigraph.py 

  4. portsorch.h:39 および portsorch.cpp:92,872-876 — PG_WATERMARK_FLEX_STAT_COUNTER_POLL_MSECS = "60000" 定数と setFlexCounterGroupParameter() での READ_AND_CLEAR 設定。https://github.com/sonic-net/sonic-swss/blob/master/orchagent/portsorch.h 

  5. portsorch.cpp:410-414 — ingressPriorityGroupWatermarkStatIds 静的配列定義(XOFF_ROOM + SHARED の 2 カウンタ)。 

  6. flexcounterorch.cpp:265-268 および portsorch getPgWatermarkCountersState() — PG OID 登録の二重条件チェック(enable フラグ + BUFFER_PG 設定イベント)。 

  7. watermarkorch.cpp:9,116-141 — DEFAULT_TELEMETRY_INTERVAL = 120 および handleFcConfigUpdate() による telemetry タイマー制御。https://github.com/sonic-net/sonic-swss/blob/master/orchagent/watermarkorch.cpp