기술 · 실용 가이드
Linux “fork: Cannot allocate memory”: 재부팅 전에 실패 경계를 증명하세요
남은 RAM은 진단이 아닙니다. 실패한 fork context를 보존하고 PID namespace init, cgroup memory event, host commit ledger를 차례로 확인한 뒤 swap이나 재부팅을 결정하세요.

남은 RAM은 진단이 아닙니다. 실패한 fork context를 보존하고 PID namespace init, cgroup memory event, host commit ledger를 차례로 확인한 뒤 swap이나 재부팅을 결정하세요.
fork ENOMEM은 kernel memory 부족뿐 아니라 대상 PID namespace의 init 종료로도 발생합니다. host에 available memory가 있어도 cgroup은 memory.max에 도달할 수 있습니다.
1. 정확한 fork 실패와 실행 context를 보존하세요
재부팅 전에 시각, parent PID, service/container, command, syscall errno, 첫 journal/trace, cgroup과 namespace path를 보존합니다. shell 문구만으로 거부 경계를 알 수 없습니다.
drop_caches, global OOM trigger, 무제한 설정이나 host reboot부터 하지 마세요. 실패 상태를 지우고 다른 workload를 해치며 성공 원인을 증명할 수 없게 합니다.
2. PID namespace가 child를 만들 수 있는지 증명하세요
fork manual은 대상 PID namespace의 init이 종료된 경우에도 ENOMEM이라고 설명합니다. 실패 parent와 정상 process의 namespace link를 비교하고 살아 있는 PID 1이 있는지 확인합니다.
이 branch라면 container/namespace lifecycle을 고쳐 supervised init을 유지합니다. swap 추가나 MemoryMax 증가는 죽은 namespace를 복구하지 못합니다.
3. service cgroup과 ancestor limit를 감사하세요
실패 PID를 cgroup에 매핑하고 한 번의 controlled attempt 전후에 memory.current, max, high, swap.current, memory.events를 저장하며 parent slice도 읽습니다.
host 전체 pressure 없이 max나 oom이 증가하면 workload-local evidence입니다. killer를 호출하지 않는 allocation failure도 있으므로 oom_kill=0은 면책이 아닙니다.
4. host commit과 물리 pressure 증거를 비교하세요
MemAvailable, swap, CommitLimit, Committed_AS, pressure와 kernel log를 함께 봅니다. strict overcommit에서는 free snapshot이 넉넉해도 commit ledger 도달로 실패할 수 있습니다.
ENOMEM과 task-count failure를 구분합니다. RLIMIT_NPROC, threads-max, pid_max, pids.max는 보통 EAGAIN을 내므로 limit 변경 전에 errno를 보존합니다.
5. 한 경계만 수정하고 같은 시작을 반복하세요
dead namespace는 init supervision을, cgroup boundary는 leak 또는 좁은 policy를, host pressure는 증명된 consumer나 capacity를 수정합니다.
같은 namespace, cgroup, commit ledger를 보며 두 번 이상 같은 start를 반복합니다. child 시작, 올바른 supervisor, event delta 없음, hidden OOM kill 없음, 정상 restart 통과를 요구합니다.
