Runbook: orchagent が CPU 100% で詰まる¶
HLD-only
orchagent の event loop と Orch::doTask のリトライメカニズムからの一般運用ノート。
実行前提
docker restart swss は ASIC 構成を再 sync するため数十秒〜数分の中断が発生し、warm-restart 未設定時は転送断となる。本番では計画 maintenance window で行う。
症状¶
topでorchagentプロセスが 1 コアを使い切ったままconfig/showの応答が極端に遅く、新規設定が反映されない/var/log/swss/sairedis.recの更新が止まる、または逆に膨張- syslog に
doTaskループの繰り返し WARN が大量出力
切り分けフロー¶
flowchart TD
A[orchagent CPU 100%] --> B{特定 Orch でループ?}
B -- routeorch --> C[大量 route churn / BGP flap]
B -- aclorch --> D[ACL rule 大量 add / ASIC table full]
B -- neighorch --> E[ARP storm / SAI 失敗の retry]
B -- 不明 --> F[gdb / perf で stack 取得]
F --> G[サポート / コミュニティ向け bug report]
確認コマンド¶
# CPU 使用率
docker exec swss top -b -n 1 | head -20
ps -eLo pid,tid,pcpu,comm | grep orchagent | sort -k3 -n -r | head
# 直近のループメッセージ
sudo grep -E "doTask|retry" /var/log/swss/swss.rec 2>/dev/null | tail -40
sudo grep -i orchagent /var/log/syslog | tail -100
# SAI 操作の頻度
sudo tail -n 200 /var/log/swss/sairedis.rec
sudo wc -l /var/log/swss/sairedis.rec.*
# どの Orch が busy か (perf)
sudo perf top -p $(pgrep -f orchagent) -d 5 # Ctrl-C で抜ける
# Redis 側 queue 滞留
sonic-db-cli APPL_DB info | grep -E "db|keys"
sonic-db-cli COUNTERS_DB dbsize
よくある原因¶
- BGP flap による大量 route churn — routeorch が
SAI_STATUS_ITEM_NOT_FOUNDretry でループ - ACL rule 大量挿入で ASIC table full — aclorch が同一エラーを retry し続ける(
sai-table-full.md参照) - CRM / sai resource 枯渇 —
crm-threshold-exceeded.md参照 - 依存関係解決の循環 — port / vlan / neigh の add 順序が逆で
SAI_STATUS_OBJECT_IN_USE - syncd レスポンス遅延 — orchagent は応答待ちで spin(厳密にはブロックだが top では busy に見える)
- flex-counter の polling 頻度過剰 —
flex-counter-stuck.md参照
対処¶
- 一時的に
config bgp shutdown allで route churn を止め、orchagent が収束するか確認 - ACL / route の bulk delete を試す前に
config save -yで backup - 最終手段として
docker restart swss(中断発生)→ warm-restart 設定がある場合のみ無瞬断に近い
Orch::doTask は ConsumerStateTable から取り出した変更を 1 件ずつ ASIC へ適用し、SAI が失敗を返したエントリは m_toSync に残して次回ループで再試行する設計のため、解消不能なエラーが入ると CPU を使い切る1。
関連 reference / topics¶
-
sonic-net/sonic-swssorchagent/orch.cpp::Orch::doTaskおよびorchagent/orchdaemon.cppのメインループ実装。SAI_STATUS_*エラーは consumer 側で再キューイングされ、根本原因が解決するまで指数バックオフ無しで retry される。 ↩