FG_NHG テーブル
概要
Fine-Grained ECMP (FG ECMP) の next-hop group 定義。プレフィックスやネクストホップ単位で、固定サイズのハッシュバケットを使ったフロー安定化 ECMP を提供する。orchagent の FgNhgOrch が CONFIG_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)
購読者
orchagent の FgNhgOrch: SAI で固定サイズの NEXT_HOP_GROUP を生成し、メンバ追加/削除でハッシュバケット位置を維持
関連 CONFIG_DB / YANG / CLI
関連リファレンス
引用元
運用ヒント
典型値
- 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-based で FG_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_WARN → route-based にフォールバック(エントリは処理継続) |
bucket_size
| 値 |
挙動 |
0 |
SWSS_LOG_ERROR → return true(エントリ破棄・再試行なし) |
| 正値 |
バケット数として使用。メンバ数の LCM 推奨 |
max_next_hops
| 値 |
挙動 |
0 かつ match_mode=prefix-based |
SWSS_LOG_ERROR(処理は継続するが SAI 動作不定) |
0 かつ他モード |
無視 |
| 超過した NH |
SWSS_LOG_WARN → 超過分無視 |
例外条件・特殊挙動
| 条件 |
挙動 |
match_mode が不正値 |
SWSS_LOG_WARN → route-based にフォールバック(エントリは処理継続) |
match_mode==prefix-based かつ max_next_hops==0 |
SWSS_LOG_ERROR を出力するが処理は継続(SAI 動作が不定になるリスクあり) |
bucket_size==0 |
SWSS_LOG_ERROR → return 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_ERROR → return 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 にデグレード |