結論:上限を置く前に、誰のメモリかを分けて測る

Claude Code 2.1.233では、Linux上のBash tool commandへopt-inのmemory cgroupを適用するCLAUDE_CODE_TOOL_MEMORY_LIMITが追加されました。buildやtestのchild processがhost全体を圧迫する事故を、制御された失敗へ変えるための機能です。Claude Code本体、会話context、plugin、MCP serverの使用量まで同じ変数で制限できるとは扱いません。

読者の具体的な困りごとは、Claudeが大きなbuildを始めた後に端末全体が応答しなくなり、原因がClaude本体なのかcompilerやtest workerなのか分からないことです。この記事を読むと、cgroup上限、Claude本体の診断、sandbox、container・CI limit、HOLDを6軸で選べます。

次の行動:代表build一つについて、通常時peak、異常時peak、hostの総memory、同時実行数、失敗後に消すprocessとartifactを一行へ記録してください。

正式な対象範囲と提供条件を確認する

公式changelogの表現は「Bash tool commands on Linux」へのopt-in memory cgroupです。対象はClaudeがBash toolから起動するcommandとその作業負荷であり、Claude Code process全体の一般的なmemory capとは区別します。追加料金の記載はありませんが、失敗後の再試行が増えればmodel利用量とCI時間は増えるため、費用が無関係になるわけではありません。

まずclaude --versionで2.1.233以降を確認し、release channelとinstall方法を台帳へ残します。環境変数の値形式や子processへの適用結果は、導入時点の公式environment variable referenceと実機の診断出力で再確認してください。changelogの一行だけから、単位、既定値、hard/soft limit、swap動作を推測して社内標準へ固定しません。

Linuxでも、hostがcgroupを利用できること、containerやrunnerの上位limitと矛盾しないことが必要です。上位containerが先にOOM killする構成ではClaude Code側のlimitだけを見ても原因を説明できません。native Windows向け機能とも解釈しません。Windows利用者はWSL2、container、VM、runner側のresource controlを別途選びます。

Claude Code公式troubleshootingは、高memory時に/compact、session再起動、大きなbuild directoryの除外、--safe-modeによるcustomization切り分けを案内します。さらに/heapdumpはJS heapとnative memoryの診断に使えますが、snapshotには会話全文やcredential文字列が含まれ得ます。公開issueへそのまま添付しないことが明記されています。

原因別に6つの制御を使い分ける

  1. Bash child process:compiler、test worker、package buildが増えるならLinux memory cgroupの候補です。
  2. Claude本体:長い会話、巨大paste、JS heap、native memoryならcompact、再起動、heap診断を使います。
  3. customization:plugin、MCP、Hook、LSPが疑わしい場合はsafe modeで差を測り、原因を一つずつ戻します。
  4. filesystem・network:sandboxはBashの到達範囲を制限します。memory上限とは別の境界なので両方を設計します。
  5. container・CI:複数sessionやjobを同居させる場合はpod、container、runnerのmemory request・limitと並列数を正本にします。
  6. host:swap、OOM killer、他process、監視不能が残るなら専用VMまたは使い捨てrunnerへ移します。

cgroup上限は「どのfileへ触れるか」や「どのhostへ通信するか」を決めません。Claude CodeのsandboxはmacOS、Linux、WSL2でBashのfilesystemとnetworkを隔離し、native Windowsは対象外です。Linuxではbubblewrapとsocatが必要で、dependency不足時にも無隔離で続けたくない組織はsandbox.failIfUnavailableを検討します。memoryとaccessの二つを別gateにしてください。

上限設定をcanary導入する8手順

  1. 一つのrepositoryと代表buildを選び、同時実行するClaude session、test worker、compiler jobを固定します。
  2. Claude Code本体とBash child processを別PID・cgroup・container metricで観測し、通常peakを複数回測ります。
  3. host総memoryからOS、監視、他service、Claude本体、並列余力を引き、Bash jobへ割り当てられる上限を決めます。
  4. 2.1.233以降とLinux実行を確認し、環境変数はprojectの秘密ではなく管理された起動設定から渡します。
  5. canary端末またはrunner一台だけで適用し、通常build、意図的な高負荷、複数workerを順番に試します。
  6. 上限到達時のexit、stderr、残存child process、一時file、lock、partial artifactを記録します。
  7. Claudeが同じcommandを無限再試行しないよう、失敗回数、時間、token、再実行許可をgoalや運用ruleで固定します。
  8. 一週間のpeakと失敗率をreviewし、上限調整、job分割、並列数削減、専用runner移行のどれかを決めます。

正常buildのpeakへ近すぎるlimitは、cache missやdependency更新のたびに失敗します。反対にhost限界と同じ値では他processの余力がありません。通常peak、p95、異常例、host予約分を分け、再現可能なjobだけ自動化します。buildが分割できるなら、単一の大きなlimitよりstageごとの小さな上限の方が原因を説明しやすくなります。

監視・復旧チェックリストとHOLD条件

  • 2.1.233以降を確認した
  • Linux実行を確認した
  • Claude本体とchild processを分けた
  • 通常peakを複数回測った
  • host予約memoryを残した
  • 上位container limitを確認した
  • 並列session数を固定した
  • 上限到達時のexitを記録した
  • 残存processを確認した
  • partial artifactの削除手順がある
  • 再試行回数を制限した
  • heap snapshotを公開しない
  • rollback方法を確認した

HOLDするのは、値の単位や適用対象を公式資料・実機で確認できない、host metricを取得できない、production serviceと同居し余力を予約できない、OOM後のdata整合性を確認できない、credentialを含むheap snapshotの保管先がない、上限到達を無条件retryする場合です。hostが落ちなかったことだけを成功とせず、正常jobの完了率も見ます。

よくある質問と次の行動

/compactとmemory cgroupは同じ対策ですか?

違います。compactは会話contextを整理し、memory cgroupはLinuxのBash tool command負荷を制限します。症状の主体を測って選びます。

sandboxを有効にすればmemoryも制限されますか?

sandboxの主目的はfilesystemとnetworkの隔離です。memory上限の代替として扱わず、両方を独立して検証します。

上限到達後は自動retryしてよいですか?

同じ条件の再試行は再び失敗し、tokenと時間を消費します。job分割、worker削減、cache確認、limit見直しのいずれかを人が選びます。

memory cgroupの追加versionはClaude Code公式changelog、Claude本体の高memory切り分けとheapdump注意は公式Troubleshooting、Bashのfilesystem・network隔離条件は公式Sandboxing guideで公開直前にも確認してください。

更新経路はrelease channelの選び方、WindowsとWSL2の違いはWindows環境比較、全体の停止設計は企業導入チェックリストへつなげます。Miraigentの無料診断では、代表job、metric、上限、失敗、復旧、reviewを一枚の運用表へ整理します。