テクノロジー · 実用ガイド

Linux の「fork: Resource temporarily unavailable」?枯渇したタスク予算を先に証明する

上限変更、プロセス終了、再起動の前に、ユーザー、cgroup、systemd、カーネルの PID/スレッド上限を切り分けます。

Linux プロセスツリーを囲む多層タスク予算のオリジナル図。
Watch at Ease オリジナルイラスト:停止した枝は、ユーザー、cgroup、systemd、ホストの最も近い枯渇境界を測る必要を示します。 Watch at Ease

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 が動き、関連イベントが増えず、観測期間中に使用量が境界以下で安定することです。証拠と戻し方を残し、検証のない再起動成功を診断と呼びません。

タスク群から制御された fork 成功までの証明経路のオリジナル図。
Watch at Ease オリジナルイラスト:増加元を特定し、範囲を限定して修正し、全上限を広げず余裕を確認します。 Watch at Ease