Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 10 章: gNMI / OpenConfig / 管理プレーン を参照。
裏取りステータス: Code-verified
現行 master の sonic-host-services/scripts/featured(delayed フィールド処理 / enable_delayed_services / PORT_TABLE 購読 + PortInitDone ハンドラ / handle_port_table_timeout / waitAdvancedBootDone)、sonic-utilities/scripts/db_migrator.py:719-726 の has_timer→delayed 移行、sonic-buildimage/src/sonic-yang-models/yang-models/sonic-feature.yang:67 の delayed leaf、sonic-swss/portsyncd/portsyncd.cpp:134 の PortInitDone publish を確認済み(verified at: 2026-05-09)。
config reload の event-driven 化(FEATURE.delayed + PortInitDone)¶
概要¶
従来の config reload は systemctl restart sonic.target で sonic.target 配下の全サービスをまとめて再起動 する実装だった1。systemd ファイルの順序定義に従ってほぼ同時に各 daemon が立ち上がるため、CPU 競合が大きく、スイッチ初期化と続くポート生成が遅れる。実害として syncd の SDK 側で「create:SAI_OBJECT_TYPE_SWITCH に 30 秒以上かかった」系のエラーログが出て、誤った印象を与える事象が報告されている1:
syncd#SDK: setEndTime: event 'create:SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000' took 32913 ms to execute
reboot 経路では既に systemd の固定 timer で snmp / telemetry 等の 非クリティカルサービスを意図的に遅らせる 対策があるが、これは時間ベースで event-driven ではない。本 HLD は 「ポート初期化完了を待ってから非クリティカルサービスを起動する」イベント駆動方式 を config reload と各種 reboot に共通で適用する設計を定義する1。
動作仕様¶
要件¶
- クリティカルサービスは config reload 直後に起動する。
- 非クリティカルサービスは 全ポート初期化完了後 に起動する。
- サービスの「即時 / 遅延」は
FEATUREテーブルのフィールド で構成する。 - 既存の systemd 固定 timer は 本機構で置き換えて廃止。
- 適用範囲は config reload + warm/fast/cold reboot 全般。
FEATURE テーブルのフィールド変更¶
旧フィールド has_timer → 新フィールド delayed に変更する1。型は boolean、既定 false。
leaf delayed {
description "This configuration indicates if the feature needs to be
delayed until system initialization";
type stypes:boolean_type;
default "false";
}
db_migrator が 既存設定の has_timer を delayed に書き換える マイグレーションを担う1。これがないと旧 image からアップグレードしたシステムで非クリティカルサービスが「即起動」扱いになって元の競合に逆戻りする。
hostcfgd の役割¶
中核ロジックは hostcfgd に集約される1:
sequenceDiagram
participant CR as config reload
participant SD as systemd
participant HC as hostcfgd
participant PS as portsyncd
participant CDB as CONFIG_DB (FEATURE)
participant ADB as APPL_DB (PORT_TABLE)
CR->>SD: restart sonic.target
SD->>HC: start (cached)
HC->>CDB: read FEATURE
Note over HC: delayed=true のサービスをキャッシュ<br/>delayed=false は即起動
HC->>SD: start critical services<br/>(swss / syncd / bgp 等)
SD->>PS: start
PS->>PS: 全ポート初期化
PS->>ADB: SET PORT_TABLE:PortInitDone
HC->>ADB: subscribe PORT_TABLE
ADB-->>HC: PortInitDone notify
HC->>SD: start delayed services<br/>(snmp / lldp / telemetry 等)
ポイント1:
hostcfgd起動時にFEATUREテーブルを読み、delayed=trueのサービスをキャッシュ。- クリティカルサービスは即起動。
- APPL_DB の
PORT_TABLEを購読し、portsyncdが出すPortInitDoneキー を待つ。 PortInitDone受信時、キャッシュした delayed サービスをまとめて enable。PortInitDoneが タイムアウト時間以内に来ない場合の保険 として、固定タイムアウトを別途定義し、その時点で delayed サービスも上げる。これは「スイッチ初期化が失敗しても管理系サービスだけは生かす」ための fail-safe1。
クリティカル / 非クリティカルの分類例¶
HLD 内の例1:
| 区分 | 例 |
|---|---|
| critical(即起動) | swss, syncd, bgp |
| delayed(PortInitDone 待ち) | snmp, lldp, telemetry |
実際の運用では FEATURE.<name>.delayed を見て判定する。HLD は具体例を示すのみ1。
warm boot / fast boot 連携¶
通常 boot とは別系統で、warm/fast boot 時には hostcfgd 自身が timer で遅らせて起動される 既存挙動があった。これも本 HLD で waitAdvancedBootDone を待つ 形に置き換える1:
hostcfgdの起動 timer を撤廃。代わりに warm/fast boot 完了確認の API(waitAdvancedBootDone)を呼んで待機する。warm-rebootコマンド側に「delayed サービスを含む全サービスが起動完了するのを待ってから先に進む」チェックを追加する1。warm boot 完了判定の信頼性を上げるための補強。
既存 timer の廃止¶
systemd で固定的に挿入されていた *.timer 定義は 撤去 される1。これにより:
- 起動シーケンスが時間ベースから event-driven へ完全に移行。
- 各サービスを個別に「N 秒遅らせる」設定をしなくて済む。
- 起動時間は 実際にポート初期化が終わった瞬間 に依存し、シナリオに応じて短縮される。
設定 / CLI / YANG / DB Migrator まとめ¶
| 項目 | 変更内容 |
|---|---|
| Config command | 新規追加なし1 |
| Show command | 新規追加なし1 |
| DB Migrator | FEATURE.has_timer → FEATURE.delayed への移行1 |
| YANG model | feature モデルに delayed leaf を追加(has_timer を置換)1 |
| SAI API | 影響なし1 |
ユーザ可視の CLI は変わらない。中身が timer ベースから event-driven に切り替わるだけ。
📋 検証エビデンス: sonic-net/SONiC/doc/config_reload/config_reload_enhancement.md#L66-L68 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/config_reload/config_reload_enhancement.md#L66-L68 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
Currently hostcfgd controls the services based on the feature table. The feature table has a specific field 'has_timer' for the non essential services which needs to be delayed during the reboot flow. This field will be now replaced by new field called "delayed". These services will controlled by hostcfgd.
... The hostcfgd will also subscribe to PORT_TABLE in the APPL_DB. Once the switch is initialized and all the ports are created in ASIC and Kernel the PortSyncd will publish PortInitDone key in the APPL_DB. On receiving this key the hostcfgd will go through the delayed services list and enables them.
判断根拠: has_timer→delayed のスキーマ変更と PortInitDone 駆動の中核フローの根拠。
設定¶
関連する CONFIG_DB¶
| Table | Key | フィールド | 用途 |
|---|---|---|---|
FEATURE |
<feature_name> |
delayed (true / false、既定 false) |
true なら PortInitDone まで起動を遅延 |
関連する CLI¶
新規 CLI は無し1。既存の config reload / warm-reboot / fast-reboot / reboot がそのまま使える。
設定例¶
# CONFIG_DB 直接編集
sonic-db-cli CONFIG_DB HSET 'FEATURE|snmp' delayed true
sonic-db-cli CONFIG_DB HSET 'FEATURE|telemetry' delayed true
# config reload を実行(critical だけ即起動、delayed は PortInitDone 後)
sudo config reload -y
制限事項¶
delayed=trueのサービスはPortInitDoneの publish に依存。portsyncdが何らかの理由でこのキーを書けないと、フォールバックタイムアウトまで起動を待つことになる1。delayed=trueのサービス起動順は HLD で厳密には規定されていない。hostcfgd内のキャッシュ順かもしくはFEATURE列挙順依存になる可能性。順序が要件のサービス間では追加の依存関係定義が必要。- 既存 systemd timer の撤去によって、timer に暗黙的に依存していた他コンポーネント がある場合は影響が出る可能性。HLD では単純化として timer を消すが、第三者プラグインまでは網羅していない。
db_migrator変更が前提。古いhas_timerフィールドを保持したままでは、新hostcfgdが delayed 判定を誤る可能性1。- HLD 内には Config / Show CLI 変更が 新規無し と明記されている1ため、ユーザは
delayedを直接見るためにはredis-cli/sonic-db-cliでFEATUREを覗く必要がある。
干渉する機能¶
hostcfgd: 本機構の中心。FEATURE購読・PORT_TABLE購読・waitAdvancedBootDone利用が同時に追加される1。portsyncd:PortInitDoneを APPL_DB に publish する責務1。本 HLD はこの publish に依存している。portsyncd側の挙動変化があれば本機構も追従が必要。- systemd unit / timer: 既存
*.timerの撤去。残存していると本機構と二重に起動制御がかかってタイミングがズレる1。 - warm-reboot / fast-reboot コマンド: warm boot 完了判定に「全 delayed サービス起動完了」を含める拡張1。warm reboot のスクリプト経路に新たな wait が増える。
- db_migrator: 旧
has_timerを新delayedに書き換える1。config_db.jsonのバージョン管理上のマイルストーンとなる。 - YANG (
sonic-featureモジュール):delayedleaf の追加。CLI / GNMI 経由でこの値を扱う場合は YANG モデルとの整合確認が必要1。
トラブルシューティング¶
config reload後に snmp / telemetry が起動しない:FEATURE.<name>.delayedがtrueで、PortInitDoneが出ていない可能性。sonic-db-cli APPL_DB HGETALL PORT_TABLE:PortInitDoneで確認1。PortInitDoneが来ないまま長時間止まる: フォールバックタイムアウト到達まで delayed サービスは起動しない(HLD はタイムアウト後に起動すると規定)1。portsyncdのログを確認。- 旧 image からアップグレード後に動作が変:
has_timerのまま残っている可能性。db_migratorが走ったかを確認1。 - warm reboot がいつまでも完了しない: 全 delayed サービスの起動を待つ拡張により、待ちが長くなっている可能性1。
hostcfgdのログで未起動サービスを特定する。 - syncd の SDK タイムアウトログ(30 秒超)が出る: 本 HLD はこのログ自体を
config reloadの同時起動による CPU 競合のせいと指摘している1。本機構が有効なら起動順分散により解消が期待される。解消していないならクリティカルサービス自体(swss/syncd/bgp)の競合が残っている可能性。
コマンド例: config reload 動作確認¶
下記コマンドで関連する CONFIG_DB / APP_DB / STATE_DB と CLI 出力・syslog を 突き合わせ、HLD 記載の挙動と現在の挙動が一致しているか確認できる。
# config reload の実行ログとサービス再起動状況
sudo config reload -y -f
sudo journalctl -u config-setup -n 100 --no-pager
show services
コマンド例: config reload 動作確認¶
下記コマンドで関連する CONFIG_DB / APP_DB / STATE_DB と CLI 出力・syslog を 突き合わせ、HLD 記載の挙動と現在の挙動が一致しているか確認できる。
# config reload の実行ログとサービス再起動状況
sudo config reload -y -f
sudo journalctl -u config-setup -n 100 --no-pager
show services
引用元¶
運用入口¶
この HLD に対応する運用面の入口(CLI / CONFIG_DB / YANG / Runbook)を以下にまとめる。