コンテンツにスキップ

ZMQ 関連 CONFIG_DB フィールド (DEVICE_METADATA / DPU)

概要

SONiC の northbound ZMQ チャネルは orchagent が gNMI / fpmsyncd 等の上位コンポーネントから APPL_DB テーブルへの書き込みを直接受け取るための ZeroMQ ベースの高スループット通信路。

ZMQ に関連する CONFIG_DB フィールドは独立テーブルを持たず、 既存の DEVICE_METADATA|localhost エントリおよび SmartSwitch 専用の DPU|<name> エントリに分散して保持される。

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

flowchart LR
  CDB[("CONFIG_DB\nDEVICE_METADATA | DPU")]
  SH["orchagent.sh\ngnmi-native.sh"]
  ORCH["orchagent\n(ZmqServer)"]
  GNMI["gnmi\n(ZmqClient)"]
  FPM["fpmsyncd\n(ZmqClient)"]
  CDB -->|orch_northbond_dash_zmq_enabled| SH
  CDB -->|orch_northbond_route_zmq_enabled| FPM
  CDB -->|subtype=SmartSwitch| SH
  SH -->|"-q tcp://..."| ORCH
  GNMI -->|"DASH tables"| ORCH
  FPM -->|"ROUTE_TABLE"| ORCH

凡例

CONFIG_DB から orchagent ZMQ サーバへの典型経路。詳細・例外は本文と関連ページを参照。

コード由来デフォルト

ZMQ 関連フィールドはいずれも YANG default 文を持たず、コード内のフォールバック値が実効デフォルトとなる。

フィールド CONFIG_DB キー コード由来デフォルト 根拠コード
orch_northbond_dash_zmq_enabled DEVICE_METADATA\|localhost true (不在 = DASH ZMQ 有効) orchdaemon.cpp:1329get_feature_status(..., true)
orch_northbond_route_zmq_enabled DEVICE_METADATA\|localhost false (不在 = ROUTE ZMQ 無効) routesync.cpp:155create_local_zmq_client(..., false)
orchagent_zmq_port DPU\|<name> なし (YANG optional) sonic-smart-switch.yang:176type inet:port-number のみ

システムレベルのポート定数 ORCH_ZMQ_PORT = 8100 は CONFIG_DB フィールドではなく sonic-swss-common/common/zmqserver.h:16 にハードコードされている4


DEVICE_METADATA|localhost の ZMQ フィールド

orch_northbond_dash_zmq_enabled

APPL_DB DASH テーブル群への ZMQ 書き込みを制御するフィーチャーフラグ。

属性
boolean ("true" / "false")
コード由来デフォルト true (フィールド不在時)
参照元 orchdaemon.cpp:1329, orch_zmq_tables.conf.j2:1

判定ロジック (C++):

// sonic-swss/orchagent/orchdaemon.cpp:1329
if (get_feature_status(ORCH_NORTHBOND_DASH_ZMQ_ENABLED, true))
{
    dash_zmq_server = m_zmqServer;
}

get_feature_status()DEVICE_METADATA|localhost の当該フィールドを hget し、 不在なら default_value(ここでは true)を返す5

判定ロジック (Jinja2):

{# orch_zmq_tables.conf.j2:1 #}
{% if DEVICE_METADATA.localhost.orch_northbond_dash_zmq_enabled != "false" %}
DASH_VNET_TABLE
DASH_QOS_TABLE
DASH_ENI_TABLE
...(DASH テーブル群 22 種)
{% endif %}

フィールド不在のとき Jinja2 の != "false" が真 → orch_zmq_tables.conf に DASH テーブルを追記。

Jinja2 と C++ の判定方式の差異

C++ は == "true" で有効判定するが Jinja2 は != "false" で有効判定する。 フィールドが "true" または 不在 の場合は両者で結果が一致する。 しかし "yes" / "1" 等の非標準値を設定した場合: - Jinja2: 有効 (文字列が "false" でないため) - C++: 無効 (*enabled == "true" が偽)

実運用では "true" / "false" のみを使用すること。


orch_northbond_route_zmq_enabled

APPL_DB ROUTE / LABEL_ROUTE テーブルへの ZMQ 書き込みを制御するフィーチャーフラグ。

属性
boolean ("true" / "false")
コード由来デフォルト false (フィールド不在時)
参照元 routesync.cpp:155, fgnhgorch.cpp:27, routeresync.cpp:25, orch_zmq_tables.conf.j2:27

判定ロジック (C++):

// sonic-swss/fpmsyncd/routesync.cpp:155
m_zmqClient(create_local_zmq_client(ORCH_NORTHBOND_ROUTE_ZMQ_ENABLED, false)),

create_local_zmq_client() は内部で get_feature_status(feature, false) を呼ぶ。 フィールド不在 → falseZmqClient = nullptr → Redis 経由の通常経路を使用6

判定ロジック (Jinja2):

{# orch_zmq_tables.conf.j2:27 #}
{% if DEVICE_METADATA.localhost.orch_northbond_route_zmq_enabled == "true" %}
ROUTE_TABLE
LABEL_ROUTE_TABLE
{% endif %}

フィールド不在のとき == "true" が偽 → ROUTE テーブルを conf に追記しない。


DPU テーブルの ZMQ フィールド (SmartSwitch 専用)

orchagent_zmq_port (DPU|)

SmartSwitch の DPU orchagent が待ち受ける ZMQ ポート番号。 NPU 上の gNMI / gnmi-native サービスがこのポートに接続して DASH イベントを送信する。

DPU|<dpu-name>
  orchagent_zmq_port: <port>   # 例: "50" (minigraph 由来)
属性
inet:port-number (1..65535)
コード由来デフォルト なし (YANG optional)
YANG ファイル sonic-smart-switch.yang:176-179

デフォルトポートとの関係

DPU orchagent のデフォルトポートは ORCH_ZMQ_PORT = 8100 (zmqserver.h:16) だが、 これは CONFIG_DB ではなくコード定数。orchagent_zmq_port フィールドは minigraph から生成された設定であり、典型値はミニグラフで定義された値 (例: 50) となる。 実際の ZMQ 接続ポートは ORCH_ZMQ_PORT + NAMESPACE_ID + 1 の計算結果を使用する2


ZMQ サーバアドレス (CONFIG_DB では制御されない)

orchagent の ZMQ サーバアドレス (-q 引数) は orchagent.sh 内でハードコードされており、 CONFIG_DB の直接フィールドとしては存在しない。ただし DEVICE_METADATA|localhost.subtype を 間接的に参照して分岐する7:

条件 ZMQ アドレス
subtype == "SmartSwitch" かつ eth0-midplane UP tcp://eth0-midplane
subtype == "SmartSwitch" かつ eth0-midplane DOWN tcp://127.0.0.1
その他 (一般プラットフォーム) tcp://127.0.0.1

gnmi の ZMQ ポート (-zmq_port=8100) も gnmi-native.shsubtype == "SmartSwitch" のときのみ付与される。 この値は CONFIG_DB から読まれず、スクリプト内にハードコードされている8


値依存挙動マトリクス

フィールド 実挙動
orch_northbond_dash_zmq_enabled 不在 DASH ZMQ 有効 (C++ default=true / Jinja2 !="false" → 真)
orch_northbond_dash_zmq_enabled "true" DASH ZMQ 有効
orch_northbond_dash_zmq_enabled "false" DASH ZMQ 無効 — DASH テーブルは Redis 経由のみ
orch_northbond_route_zmq_enabled 不在 ROUTE ZMQ 無効 (C++ default=false / Jinja2 =="true" → 偽)
orch_northbond_route_zmq_enabled "true" ROUTE_TABLE / LABEL_ROUTE_TABLE を ZMQ 経由で受信
orch_northbond_route_zmq_enabled "false" ROUTE ZMQ 無効 — fpmsyncd は Redis 経由
orchagent_zmq_port 1〜65535 DPU orchagent への ZMQ 接続ポートとして使用
orchagent_zmq_port 不在 YANG optional — DPU orchagent はデフォルト 8100 番台を使用

例外条件・特殊挙動

  • フィールドの非標準値: orch_northbond_dash_zmq_enabled"true" / "false" 以外の値 (例: "1", "yes") を設定すると Jinja2 (conf.j2) と C++ (get_feature_status) の判定が乖離する可能性がある。常に "true" / "false" を使用すること1
  • Namespace 分離時のポート計算: ZMQ ポートは NAMESPACE_ID 環境変数を参照し 8100 + NAMESPACE_ID + 1 で計算される。global namespace (NAMESPACE_ID 未設定) では 8100 固定2
  • zmq_sync モード (DPU): switch_type == "dpu" のとき orchagent.sh:38-39-z zmq_sync -k 65536 を強制付与し、ZMQ 同期モードで起動する。この設定は synchronous_mode フィールドに関係なく適用される (DEVICE_METADATA ページ参照)3

関連リファレンス

引用元

運用ヒント

ZMQ フィーチャーフラグの確認

sonic-db-cli CONFIG_DB hget "DEVICE_METADATA|localhost" orch_northbond_dash_zmq_enabled
sonic-db-cli CONFIG_DB hget "DEVICE_METADATA|localhost" orch_northbond_route_zmq_enabled

出力が空の場合はデフォルト値が適用される (dash_zmq=true, route_zmq=false)。

ZMQ サーバの起動確認 (orchagent)

orchagent が ZMQ サーバを起動している場合、ログに以下が記録される:

NOTICE orchagent: ZMQ channel on the northbound side of Orchagent successfully bound: tcp://127.0.0.1:8100

SmartSwitch での DPU ZMQ ポート確認

sonic-db-cli CONFIG_DB hget "DPU|dpu0" orchagent_zmq_port

  1. sonic-buildimage/dockers/docker-orchagent/orch_zmq_tables.conf.j2 https://github.com/sonic-net/sonic-buildimage/blob/9ea932ec2e18f35e58268ec2e4456b1d4afd65cd/dockers/docker-orchagent/orch_zmq_tables.conf.j2 

  2. sonic-swss/lib/orch_zmq_config.cpp:37-51 https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/lib/orch_zmq_config.cpp 

  3. sonic-buildimage/dockers/docker-orchagent/orchagent.sh:35-39 https://github.com/sonic-net/sonic-buildimage/blob/9ea932ec2e18f35e58268ec2e4456b1d4afd65cd/dockers/docker-orchagent/orchagent.sh 

  4. sonic-swss-common/common/zmqserver.h:16static const int ORCH_ZMQ_PORT = 8100; https://github.com/sonic-net/sonic-swss-common/blob/158de8d3463ff4b841653f6d57190bb142b80d9c/common/zmqserver.h#L16 

  5. sonic-swss/lib/orch_zmq_config.cpp:83-110get_feature_status() 実装。フィールド不在時は default_value を返し、存在する場合は == "true" で判定する。 https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/lib/orch_zmq_config.cpp 

  6. sonic-swss/lib/orch_zmq_config.cpp:105-113create_local_zmq_client()。feature が false → nullptr を返し、呼び元は Redis ProducerStateTable にフォールバックする。 https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/lib/orch_zmq_config.cpp 

  7. sonic-buildimage/dockers/docker-orchagent/orchagent.sh:105-118 — ZMQ アドレス決定ロジック。eth0-midplane インタフェースの状態を ip -json で確認。 https://github.com/sonic-net/sonic-buildimage/blob/9ea932ec2e18f35e58268ec2e4456b1d4afd65cd/dockers/docker-orchagent/orchagent.sh#L105-L118 

  8. sonic-buildimage/dockers/docker-sonic-gnmi/gnmi-native.sh:88-92 — gnmi ZMQ ポートのハードコード。subtype == "SmartSwitch" のときのみ -zmq_port=8100 を付与。 https://github.com/sonic-net/sonic-buildimage/blob/9ea932ec2e18f35e58268ec2e4456b1d4afd65cd/dockers/docker-sonic-gnmi/gnmi-native.sh#L88-L92