テクノロジー · 実用ガイド
Linux の「fork: Resource temporarily unavailable」?枯渇したタスク予算を先に証明する
上限変更、プロセス終了、再起動の前に、ユーザー、cgroup、systemd、カーネルの PID/スレッド上限を切り分けます。

Linux の fork や clone は、メモリやファイル記述子に余裕が見えても EAGAIN を返すことがあります。枯渇した予算はユーザー、cgroup、systemd ユニット、またはホストに属します。
この監査は証拠を保存し、有効な境界とプロセス/スレッド増加の所有者を特定してから、最小で戻せる修正を検証します。
タスクを解放する前に障害を固定する
復旧用シェルを一つ残し、再起動前に完全なコマンド、時刻、ユーザー、サービス/コンテナ、stderr、終了状態を保存します。EAGAIN と ENOMEM を区別し、見た目のメモリ不足で実 errno を置き換えません。
同じ範囲で PID、PPID、ユーザー、コマンド、NLWP を採取し、最近のデプロイや負荷変化を記録します。最初の一括 kill は、予算と増加元を示すツリーや計数器を消します。
ユーザー単位の予算を先に調べる
fork(2) は RLIMIT_NPROC を EAGAIN 原因に挙げます。Linux では実 UID のタスク、より正確にはスレッドが対象です。失敗プロセスの実 UID と soft/hard limit を比較し、プロセス行だけでなく生きたスレッドを数えます。
調査シェルの高い ulimit はサービスの有効値を証明しません。失敗した文脈やサービス管理機構から制限を取り、サービス口座と運用者を分けます。上限に近ければ増加中の実行ファイルと親を特定します。
cgroup を特定して PID 台帳を読む
cgroup v2 の pids コントローラーは各スレッドを含むタスク ID を数えます。対象 cgroup の pids.current、pids.peak、pids.events、pids.max を読み、max イベント増加を越境と EAGAIN の証拠にします。
systemd ユニットでは TasksCurrent、TasksMax、EffectiveTasksMax を比較します。TasksMax は pids.max に対応し、有効値はより厳しい親境界を反映します。実ユニットと cgroup を読み、ホストと同じ余裕だと仮定しません。
近い境界に余裕があってからホスト上限を見る
ユーザーと cgroup に余裕があれば threads-max、pid_max、ホストのタスク数を確認します。fork(2) は両方を EAGAIN 原因に挙げ、pid_max が大きくても threads-max や入れ子境界を排除できません。
ファイル記述子上限とは分離します。nofile を増やしても PID/スレッド予算は増えません。reset-on-fork のない SCHED_DEADLINE も記録しますが、特殊例を既定説明にはしません。
増加の所有者を見つけ分類する
スレッド数と子孫数で並べ、先頭の親、サービス、負荷を健康時と比較します。一つの NLWP が急増すればスレッド漏れ、多数の短命子なら再試行嵐、過剰 worker、上流並行度変更を疑います。
正当な並行処理か制御不能な増加かを決め、緩和前にログ、スタック、ツリーを保存します。再起動や kill だけでは原因と増加形が失われ、再発します。
最小で戻せる修正を行う
漏れや暴走元を止め、worker/再試行並行度を下げ、実際に低過ぎたサービス境界だけを直します。定常負荷と安全余裕が測定できた場合のみ上限を増やし、無制限や全ユーザー変更を避けます。
旧値、新値、所有者、理由、戻し方を記録します。systemd は管理されたユニット設定、cgroup/コンテナは元設定を更新し、一時的な実行時書き込みに依存しません。
元の生成経路を再実行して余裕を証明する
同じユーザー、ユニット、コンテナから元コマンドや制御負荷を再実行し、子が本当に生成されたか確認します。ユーザースレッド、pids.current と pids.max、pids.events、ホスト上限を再確認します。
成功とは fork/clone が動き、関連イベントが増えず、観測期間中に使用量が境界以下で安定することです。証拠と戻し方を残し、検証のない再起動成功を診断と呼びません。
