コンテンツにスキップ

Topics で読み物として読む

この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 04 章: VRF / ECMP / 経路選択 を参照。

裏取りステータス: Code-verified

sonic-swss/orchagent/nhgorch.h:117NhgOrchsonic-swss-common/common/schema.h:56APP_CLASS_BASED_NEXT_HOP_GROUP_TABLE_NAMEsonic-swss/orchagent/routeorch.cpp:771ROUTE_TABLE.nexthop_group パース、routeorch.cpp:807-815nexthop_groupips/aliases の排他検証を確認 (verified at: 2026-05-09)。

NEXT_HOP_GROUP_TABLE による APP_DB ルートとネクストホップ分離

なぜ必要か

従来の SONiC は APP_DB.ROUTE_TABLE 各エントリにネクストホップ情報 (nexthop / ifname) を 直接埋め込んで いた。数百万ルートが同じネクストホップ群を共有する大規模シナリオでは、毎ルートで同一情報を APP_DB に書き orchagent でパースするため、メモリと処理時間が二重に重い1

本機能は APP_DB 側でネクストホップ群を独立テーブルに切り出し、ルートはそのキー参照だけを持つ形に変える。

どう動くか

スキーマ変更(APP_DB)

新規 NEXT_HOP_GROUP_TABLE1:

NEXT_HOP_GROUP_TABLE
  key     = NEXT_HOP_GROUP_TABLE:<arbitrary string>
  nexthop = *prefix       ; カンマ区切り IP(空ならゲートウェイなし)
  ifname  = *PORT_TABLE.key

ROUTE_TABLEnexthop_group フィールドを追加(既存フィールドは残す)1:

ROUTE_TABLE
  key            = ROUTE_TABLE:<prefix>
  nexthop_group  = NEXT_HOP_GROUP_TABLE:key   ; 新規。指定時は nexthop/ifname の代替

キーはアプリ任意の文字列で HLD は命名規則を規定しない。

競合ルール

nexthop_group と従来の nexthop/ifname両方 持つエントリは無視される1

orchagent 側

NhgOrchNEXT_HOP_GROUP_TABLE を受け、メンバ数で分岐する1:

flowchart TD
  IN[NEXT_HOP_GROUP_TABLE update] --> N{member 数}
  N -->|1| SINGLE[NeighOrch から SAI ID 取得<br/>→ 群の SAI ID として使用]
  N -->|>1| MULTI[ASIC_DB に next_hop_group 作成<br/>メンバを member として追加]
  SINGLE --> MAP[APP_DB key ↔ SAI ID マップ更新]
  MULTI --> MAP
  MAP --> RT[RouteOrch が参照解決]

ルート側 RouteOrchnexthop_group フィールドを見て NhgOrchSAI OID を問い合わせる。群未到着なら pending リストへ。ハード上限で群作成不能なら 1 メンバ暫定使用 に縮退し、ルートは「暫定形式」通知を受けて pending を維持する1

参照カウント

群は参照ルートが残っている間は削除されない。NhgOrch が参照カウントを保持する。orchagent 再起動時は ROUTE_TABLE 更新で回復する1

既存 RouteOrch 群との非干渉

RouteOrch 暗黙管理の既存群(メンバ集合キー)と新 NhgOrch 群(任意キー)は 同一メンバでも別物として ASIC_DB に書かれる。HLD は「全ルートを旧か新のいずれかに統一」想定1。Fine grained ECMP 群は影響を受けない。

📋 検証エビデンス: sonic-net/SONiC/doc/ip/next_hop_group_hld.md#L106-L137 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)

出典:

sonic-net/SONiC/doc/ip/next_hop_group_hld.md#L106-L137 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)

抜粋:

A new orchestration agent will be written to handle the new NEXT_HOP_GROUP_TABLE in APP_DB.
... If the group has a single next hop, the next hop group orchagent will simply get the SAI identifier...
... If a next hop group cannot be programmed because the data plane limit has been reached, one next hop will be picked to be temporarily used for that group.

判断根拠: 単一/複数メンバ分岐・暫定モード・参照カウントの設計根拠。

設定

APP_DB スキーマ拡張のため CONFIG_DB / CLI 変更なし。書き込むのは外部ルーティングアプリ(カスタム fpmsyncd 等)。show ip route / show ipv6 route出力フォーマット不変 が要件で、CLI 側が nexthop_group を解決する1

設定例

NEXT_HOP_GROUP_TABLE:NHG1
  nexthop = 10.0.0.1,10.0.0.2
  ifname  = Ethernet0,Ethernet4

ROUTE_TABLE:10.100.0.0/24
  nexthop_group = NHG1

制限事項

  • fpmsyncd 非対応: 標準 fpmsyncd は本機能を使わない。改造版か APP_DB 直接書き込みアプリが必要1
  • nexthop_groupnexthop/ifname の併記は無視
  • 旧形式との混在不可(実質): 旧群と新群は ASIC_DB で別オブジェクト並走となりリソース二重消費
  • Warm upgrade 未対応: 既存アプリは本機能を使わないため対象外。将来採用アプリ時に別 enhancement で対応想定1

干渉する機能

  • Fine grained ECMP: 既存 fine grained 群は挙動不変1
  • Warm boot: ルート-群対応の維持責務は アプリ側。群キーを再起動跨ぎで安定化するか APP_DB から復元すること1
  • Fast reboot / BGP graceful restart: 影響なし

トラブルシューティング

  • ルートが ASIC_DB に書かれない → NEXT_HOP_GROUP_TABLE に対応キーがあるか確認
  • ネクストホップ群リソース枯渇 → 暫定 1 メンバ形式になる。asic-dbSAI_OBJECT_TYPE_NEXT_HOP_GROUP_MEMBER 数確認
  • show ip route が群参照のまま残る → CLI 解決バグ兆候

コマンド例

ROUTE_TABLE / NEXTHOP_GROUP_TABLE の登録状況を確認する。

redis-cli -n 0 keys 'ROUTE_TABLE*' | head
redis-cli -n 0 keys 'NEXTHOP_GROUP_TABLE*' | head
show ip route summary

関連トピック

引用元

関連 Topics


  1. sonic-net/SONiC doc/ip/next_hop_group_hld.md @ 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06