コンテンツにスキップ

FG_NHG テーブル

概要

Fine-Grained ECMP (FG ECMP) の next-hop group 定義。プレフィックスやネクストホップ単位で、固定サイズのハッシュバケットを使ったフロー安定化 ECMP を提供する1orchagentFgNhgOrchCONFIG_DB を購読する。

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

flowchart LR
  CDB[("CONFIG_DB<br/>FG_NHG")]
  DM["FgNhgOrch"]
  CDB --> DM
  SAI["SAI<br/>sai_next_hop_group_api"]
  DM --> SAI

凡例

CONFIG_DB から SAI までの典型経路を docs/reference/config-db-orch-map.md から機械生成したミニ図。詳細・例外は本ページ本文と対応表を参照。

関連 3 テーブル

FG_NHG|<name>                    # グループ定義
FG_NHG_PREFIX|<ip_prefix>        # prefix → group
FG_NHG_MEMBER|<next_hop_ip>      # next-hop → group + bank

FG_NHG

フィールド 必須 説明
bucket_size uint16 yes バケット総数。1..N の最小公倍数を推奨
match_mode enum route-based/nexthop-based/prefix-based yes FG 適用判定方式
max_next_hops uint16 (1..128) prefix-based dynamic-nhg モードでルート更新が運ぶ最大 nexthop 数

FG_NHG_PREFIX

フィールド 必須 説明
ip_prefix (key) sonic-ip-prefix - FG 動作対象の prefix
FG_NHG leafref FG_NHG.name yes 紐付けるグループ

FG_NHG_MEMBER

フィールド 必須 説明
next_hop_ip (key) inet:ip-address - メンバ next-hop
FG_NHG leafref FG_NHG.name yes 所属グループ
bank uint16 yes bank index (再分配単位)
link union leafref PORT/PORTCHANNEL no 紐付けリンク。op state 連動でメンバ追加/削除

match_mode の意味

  • nexthop-based: nexthop IP のみで FG 判定
  • route-based: prefix と nexthop IP の両方で FG 判定
  • prefix-based: prefix のみで FG 判定。nexthop は route 更新から派生し FG_NHG_MEMBER 不要 (dynamic NHG)

購読者

  • orchagentFgNhgOrch: SAI で固定サイズの NEXT_HOP_GROUP を生成し、メンバ追加/削除でハッシュバケット位置を維持

関連 CONFIG_DB / YANG / CLI

  • 関連 CONFIG_DB: PORTPORTCHANNEL
  • 関連 YANG: sonic-fine-grained-ecmp

関連リファレンス

引用元

運用ヒント

典型値

  • key 形式: FG_NHG|<name>FG_NHG_PREFIX|<prefix>FG_NHG_MEMBER|<nh_ip>
  • bucket_size: 64 や 128 等、メンバ数の最小公倍数を考慮した値。
  • match_mode: nexthop-based が一般的、dynamic 用途では prefix-based

よくある誤設定

  • bucket_size がメンバ数で割り切れず、トラフィック分散が偏る。
  • match_mode=prefix-basedFG_NHG_MEMBER を投入し、本来不要な定義が衝突する。
  • link を未設定にして port-down 時にメンバ自動除去が効かない。

確認コマンド

sonic-db-cli CONFIG_DB keys 'FG_NHG*'
sonic-db-cli APPL_DB keys 'FG_ROUTE_TABLE:*'
show fgnhg active-hops

値依存挙動マトリクス

match_mode

挙動
nexthop-based nexthop IP のみで FG 判定。FG_NHG_PREFIX 投入は SWSS_LOG_NOTICE で no-op
route-based prefix + nexthop IP 両方で FG 判定。不正値時のフォールバック先
prefix-based prefix のみで FG 判定。FG_NHG_MEMBER は不要(dynamic NHG)。シングルバンク強制。max_next_hops 必須
その他 SWSS_LOG_WARNroute-based にフォールバック(エントリは処理継続)

bucket_size

挙動
0 SWSS_LOG_ERRORreturn true(エントリ破棄・再試行なし)
正値 バケット数として使用。メンバ数の LCM 推奨

max_next_hops

挙動
0 かつ match_mode=prefix-based SWSS_LOG_ERROR(処理は継続するが SAI 動作不定)
0 かつ他モード 無視
超過した NH SWSS_LOG_WARN → 超過分無視

例外条件・特殊挙動

条件 挙動
match_mode が不正値 SWSS_LOG_WARNroute-based にフォールバック(エントリは処理継続)
match_mode==prefix-based かつ max_next_hops==0 SWSS_LOG_ERROR を出力するが処理は継続(SAI 動作が不定になるリスクあり)
bucket_size==0 SWSS_LOG_ERRORreturn true(エントリ破棄・再試行なし)
FG_NHG エントリ重複 SET SWSS_LOG_WARN("FG_NHG %s already exists, ignoring") → 更新されない
FG_NHG_PREFIX DEL で prefix 未存在 SWSS_LOG_INFO("FG_NHG prefix doesn't exists, ignore") → 正常終了
FG_NHG_MEMBER を prefix-based グループに投入 SWSS_LOG_ERRORreturn true(破棄)
FG_NHG 未受信時に FG_NHG_MEMBER 投入 return false(Consumer キューに残り再試行)
max_next_hops 超過 NH SWSS_LOG_WARN("Next-hop %s exceeds max_next_hops %d for prefix %s, skipping") → 超過分無視
FG nh と非 FG nh が同一ルートに混在 SWSS_LOG_WARN → ルート全体を通常 ECMP にデグレード