Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 04 章: VRF / ECMP / 経路選択 を参照。
裏取りステータス: code-verified
bgpcfgd/managers_device_global.py で wcmp_template = ... bgpd/wcmp/bgpd.wcmp.conf.j2、wcmp_enabled キー処理、configure_wcmp(data) を master で確認。docker-fpm-frr/frr/bgpd/wcmp/ テンプレートディレクトリも存在。
Weighted ECMP(WCMP)¶
読み手が知りたいこと¶
- 通常 ECMP では何が問題で、なぜリンク帯域に応じた重み付けが要るのか
- WCMP の重みは何で運ばれ、どこで NHG member weight に変換されるか
- SONiC 側で増えるのは CONFIG_DB のどのキーか、SWSS/SAI に変更があるか
- EVPN Type-5 や warm-boot の扱い
なぜ通常 ECMP では足りないか¶
各 ToR-Spine リンクが部分故障した際、通常 ECMP は 生存リンクの容量差を反映できず 均等分散して輻輳する。WCMP は BGP link bandwidth 拡張コミュニティ で各 path の利用可能帯域を運び、FRR / Zebra が 1〜255 に正規化した weight で NHG member を作る1。
本 HLD のスコープは L3 用途のみ。EVPN Type-5 は Out of scope1。SWSS / SAI は既に NHG member weight をサポートしているので SWSS OA は変更不要1。
データフロー¶
flowchart LR
TOR[ToR<br/>route-map: set extcommunity bandwidth] -- BGP advertise --> SP[Spine]
SP --> RTOR[Remote ToR]
RTOR -. link 故障 .- SP
SP -- updated bandwidth --> ZEBRA[FRR / Zebra]
ZEBRA --> NHG[NHG member weights<br/>1-255]
NHG --> FPM[fpmsyncd]
FPM --> RO[Route OA / orchagent]
RO --> SD[syncd] --> SAI[SAI NHG member weight]
- 入口 ToR が
route-mapでset extcommunity bandwidth num-multipathsを付与1 - 受信 BGP は default で link bandwidth ext community を weight に変換。一部 path が community を持たないと 通常 ECMP に fallback
- Zebra が NHG 再計算 → fpmsyncd → Route OA → SAI
Weight 正規化¶
- 各 NHG 内で
bw / total_bw比を 1..255 に正規化1 - 全 0 / 同一値は通常 ECMP と等価
- multipath の一部に bandwidth コミュニティ無し → 全体 ECMP fallback
FRR 設定¶
L3(ipv4 unicast)¶
route-map wcmp-map permit 100
set extcommunity bandwidth num-multipaths
exit
router bgp 65100
address-family ipv4 unicast
neighbor SPINE route-map wcmp-map out
neighbor SPINE activate
exit-address-family
EVPN Type-5(参考、scope 外)¶
address-family l2vpn evpn
advertise ipv4 unicast route-map wcmp-map
neighbor SPINE activate
exit-address-family
EVPN 経路は docker_routing_config_mode が split / split-unified のときのみ有効1。
CONFIG_DB と bgpcfgd¶
初期 config(init_cfg.json.j2)で default false1。
DeviceGlobalCfgMgr に set_wcmp API を追加。BGP_DEVICE_GLOBAL|STATE 変更で jinja2 テンプレ bgpd.wcmp.conf.j2(docker-fpm-frr/frr/bgpd/wcmp/)を反映1:
{%- if wcmp_enabled == 'true' %}
set extcommunity bandwidth num-multipaths
{%- else %}
no set extcommunity bandwidth
{%- endif %}
CLI¶
Warm / Fast boot¶
wcmp_enabledを再読込し FRR を reload する想定- 詳細は本 HLD では別途扱われていない1
制限事項¶
- EVPN Type-5 は scope 外(将来)
- 一部 multipath が link-bandwidth コミュニティを持たないと ECMP fallback
- 正規化精度は 8bit (1-255) なので極端な比は表現不能
- ASIC によっては NHG member weight に resource 制約あり(HLD 未明記、SWSS HLD #738 参照)
干渉する機能¶
- BGP PIC: NHG を共有
- EVPN over L2VPN: 将来 scope(Type-5)
- local-ars-hld 等の multipath: weight 計算は独立
- fpmsyncd / Route OA: 既存の NHG member weight 経路を流用
関連 Topic¶
参考¶
確認コマンド¶
show bgp device-global— WCMP の有効/無効を確認vtysh -c "show bgp ipv4 unicast <prefix>"— link-bandwidth extended community と nexthop weight を確認vtysh -c "show ip route <prefix>"— RIB 段で NHG メンバの weight を確認sonic-db-cli APPL_DB hgetall "ROUTE_TABLE:<prefix>"/NEXT_HOP_GROUP_TABLEで weight 反映を確認
コマンド例¶
weighted ECMP の path weight を確認する。
show ip route summary
redis-cli -n 0 hgetall 'ROUTE_TABLE:0.0.0.0/0' 2>/dev/null
redis-cli -n 1 keys 'ASIC_STATE:SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MEMBER*' | head