【要約】「Control request timeout: initialize」 の正体は SIGKILL だった話 (Claude Code C [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
Codens Greenの開発チームが、リポジトリ解析タスクの失敗に直面した。
- ・現象:
analyze_code_specificationタスクが間欠的に失敗する。 - ・誤認: エラー文字列からSDKの通信タイムアウトと判断し、調査を誤った。
- ・真因: Claude Code CLIが大量のメモリを消費し、OSのOOM killerに殺された。
- ・構造的要因: 汎用Celery workerが複数の重いタスクを並列実行し、メモリ上限を超過した。
- ・課題: エラーメッセージが真因を隠蔽し、デバッグを困難にしていた。
// Approach
開発チームは、リソース消費の激しいタスクを他のタスクから物理的・論理的に隔離する手法を採用した。
- ・タスクのルーティング:
task_routesを用い、解析タスクを専用のanalysisキューへ分離した。 - ・専用インフラの構築: 解析タスク専用のECS Fargate worker tierを構築し、メモリを8GB確保した。
- ・並列度の制限:
concurrency=1を設定し、1つのworkerで1つのCLIプロセスのみが動くよう制御した。 - ・運用の定石化: メモリ計算根拠をドキュメント化し、ルーティングの整合性をテストで担保した。
// Result
リソースの分離と制御により、解析タスクの安定稼働を実現した。
- ・安定性: OOM killerによるプロセスの強制終了を回避し、タスクの失敗を解消した。
- ・隔離性: 重いタスクが他の軽量なタスクを巻き込んで停止させるリスクを排除した。
- ・運用の改善: メモリ計算の根拠を明文化し、将来の誤った最適化を防ぐ体制を整えた。
- ・トレードオフ: インフラコストの増加やスケーリングの遅延という課題は残るが、信頼性を優先した。
Senior Engineer Insight
> エラーメッセージを鵜呑みにせず、exit codeを確認すべきである。AI CLIのような「巨大な子プロセス」を扱う場合、メモリ管理の主役は子プロセスのピークRSSである。リソース分離はコストを伴うが、重い隣人が他の住人を殺す事態を防ぐための必須の防衛策である。