MCP 風ツールを子プロセスで呼び出す OpenClaw ゲートウェイは、やがて EMFILE に直面する。原因は OS の意地悪ではなく、並列度 ×(パイプ・ソケット・ログ)がプロセス単位のファイル記述子テーブルを想定より速く埋めるからだ。2026 年は 境界付きワーカー信号量 と正直な ulimit -n 余白を同一 runbook に書き、トークン予算とツール絞りおよび openclaw doctor ゲートウェイ診断と整合させよう。そうすれば並列スパイクが上流障害に見えなくなる。
本稿のガードレール:8 GiB Mac mini ではゲートウェイワーカーあたり子プロセス並列の既定を 8、HTTP スタックとメトリクスに 256 記述子を予約。本番テナントに触れる前に、1 日あたり約 $16.9 のレンタル Apple ハードで検証する。
プロセスモデルと隠れ FD 消費
子プロセスは標準ストリーム三套を継承し、PTY を噛ませると複製が増える。モデル提供者ソケット、Prometheus スクレイプ、任意の WebSocket、ローテログ、SQLite/Redis が加わる。単純な 32 並列 でもユーザー処理の前に 1000 超の記述子を消費し得る。統合チャネルごとの長寿命接続数を設計レビュー表に書くと、メトリクスクライアントとキューが同じ FD 予算を奪い合う事故を防げる。
ワーカー信号量と公平キュー
ツール実行器を囲む計数信号量を一本化し、exec 前に取得、シグナル取消を含む解放パスで返却。テナント内は FIFO を優先し、インシデント用ジョブには重み付き優先度を。
| プロファイル | 並列上限 | 根拠 |
|---|---|---|
| ファイル読取 | 12 | Apple NVMe QD のスイートスポット |
| ネットクローラ | 6 | TLS ソケットは追加 FD |
| CPU コンパイル | 性能コア数の 2 倍 | 熱制限が先に来る |
macOS ソフト/ハード上限
変更前後で launchctl limit maxfiles を実行。対話シェルはソフト 256 既定のことが多く、サーバはソフト 10240 を要する。両方を runbook 冒頭に明記し、profile だけ直すミスを防ぐ。
LaunchAgent plist SoftResourceLimits
SoftResourceLimits の NumberOfFiles は信号量計算に 20% のバースト余裕を足す。ThrottleInterval で誤設定時の exec 嵐を抑える。
記述子リークの早期検出
ソーク中は 60 秒 ごとに lsof -p $GATEWAY_PID をサンプリングし CLOSE_WAIT を差分。ソフト上限の 70% を 5 分 超えたらアラート。直近 3 リリースのハッシュを添付すると原因切り分けが速い。
IO 境界と CPU 境界
マニフェストに io_bound / cpu_bound を付け、スケジューラが別信号量を適用。単一上限だとシェルユーティリティが長時間 ffmpeg に飢える。
キュー深さとバックプレッシャ
gateway_tool_queue_depth をゲージ化し、p95 が 50 を 10 分 超えたら異常。構造化ログにキュー位置を出し、SSH なしでも説明可能にする。
ロールアウトチェックリスト
- 本番親 PID の
ulimit -nをスナップショット。 - ステージングで先に並列を下げ p95 を測定。
- 72 時間 リーク退行が無いことを証明してからソフト上限を上げる。
- doctor でチャネル疎通を再確認。
共有 Mac mini のマルチテナント
Unix グループや環境名前空間で信号量を分割し、暴走テナントが全体を食いつぶすのを防ぐ。対話セッション用に最低 30% を予約し、財務にはインシデントバッファとして計上する。
ベンチハーネスの期待値
合成負荷は 5 分 ごとに並列 +4 で段階上げし、CPU パッケージ電力とファンDutyを記録。GPU 常駐とツールが衝突すると Apple Silicon は早めにサーマルスロットルする。
絞りと 429 の協調
高並列は上流レートリミットを増幅する。トークン絞りの記事参照。429 が跳ねたら先に並列を下げ、その後バックオフを伸ばすと体感レイテンシが両方改善する。
オブザーバビリティとオンコール
ヒストグラムに exemplar を付け、並列ツール数と FD を相関。着信後 5 分 で「多すぎ」と「リーク」を切り分ける。
サンドボックス相互作用
Seatbelt が IPC の FD を複製すると上限が二重計上されることがある。ステージングでプロファイルを検証してから本番で caps を厳格化する。
ドキュメントドリフト
ツール家族ごとの既定信号量を単一 Markdown 表で管理。陳腐化すると運用がリーク修正より ulimit 引き上げを選びがちで監査に不利。
vnode と一時ディレクトリ
/var/folders 下に大量スクラッチを作ると FD が健康でも vnode が先に詰まる。CI で sysctl vfs.numvnodes を監視し、明示的バルク展開以外はジョブあたり 10000 ファイル上限。
kqueue ウォッチ
ワークスペース監視はパスごとに記述子が必要。5000 超の追跡ファイルでは再帰監視を単一根+ユーザー空間フィルタに畳む。
gRPC と HTTP/2
多重ストリームもウィンドウを食う。接続あたりの outbound ストリームは 100 未満を目安にし、SETTINGS フレーム churn で効率コア CPU が跳ねるのを避ける。
Redis プール
スレッドごと接続は 8 GiB ホストでは最大 32 共有接続にプールし、TLS セッション再開を確認。再接続嵐で握手回数が FD に乗る。
ローリング再起動
新旧バイナリ重複で記述子が一時二倍。メンテ中はソフト上限 +15% か、2 スクレイプ間だけ並列縮小。
サポートマクロ
「開きすぎ」チケットには openclaw doctor、信号量上限、plist キーを定型文で。成熟環境では重複チケットが約 40% 減る例がある。
キャパシティ表の出発点
最悪ケースは (workers × tools_parallel × (3 パイプ + 2 ログ + 2 ソケット)) + fixed_overhead。8×8 で固定分だけでも 1500 に迫る——plist 選定前に 25% バッファ。新統合のたびに長寿命接続が増えるので四半期レビュー。
財務承認はリーク修正チケットとセット。硬上限だけ上げるのは債務の先送りに見える。
SLO ダッシュボード横に数値を掲示し、大規模ローンチや監査、連休スパイク、ベンダメンテ前に「並列倍増」を断る理由を共有する。
MacHTML の Apple Silicon Mac mini レンタルは、本番に近い launchd 継承と静かな持続負荷で信号量検証に向く。約 $16.9/日 で容量実験を OpEx 化しつつ、ファイルテーブルを root レベルで観測できる。
弾力あるレンタル期間により、FD 回帰調査を他チームの共有ステージングに触れず隔離ホストで複製できる。