Linux Cannot fork 오류가 발생하는 원인과 해결 방법

Linux 서버를 운영하다 보면 명령어를 실행하거나 새로운 프로세스를 생성하는 과정에서 Cannot fork 또는 fork: Resource temporarily unavailable 오류를 만나는 경우가 있습니다. 이 오류는 운영체제가 새로운 프로세스를 생성하지 못하는 상태를 의미하며, 메모리 부족뿐만 아니라 프로세스 개수 제한이나 시스템 리소스 부족 등 다양한 원인으로 발생합니다.

특히 웹 서버, 데이터베이스, Java 애플리케이션처럼 많은 프로세스를 생성하는 환경에서는 자주 발생하는 오류입니다. 이번 글에서는 Cannot fork 오류의 원인과 해결 방법을 자세히 알아보겠습니다.

Cannot fork란 무엇인가?

Linux에서는 새로운 프로세스를 생성할 때 fork() 시스템 호출을 사용합니다.

운영체제가 새로운 프로세스를 만들 수 없는 경우 다음과 같은 오류가 발생합니다.

대표적인 오류 예시는 다음과 같습니다.

-bash: fork: Cannot allocate memory

또는

fork: Resource temporarily unavailable

또는

Cannot fork

즉, 새로운 프로세스를 생성하기 위한 시스템 자원이 부족한 상태입니다.

Cannot fork 오류가 발생하는 대표적인 원인

다음과 같은 경우에 자주 발생합니다.

  • 메모리(RAM) 부족
  • Swap 부족
  • 최대 프로세스 수 초과
  • ulimit 제한
  • PID 고갈
  • 메모리 누수(Memory Leak)
  • Docker 컨테이너 제한
  • Kubernetes 리소스 제한
  • 시스템 과부하
  • 커널 리소스 부족

실무에서는 메모리와 프로세스 개수를 함께 확인하는 것이 중요합니다.

1. 메모리 상태 확인하기

현재 메모리 사용량을 확인합니다.

free -h

메모리와 Swap이 모두 부족한지 확인합니다.

2. 프로세스 개수 확인하기

현재 실행 중인 프로세스 개수를 확인합니다.

ps -ef | wc -l

프로세스 수가 비정상적으로 많다면 원인을 확인해야 합니다.

3. 메모리 사용량이 높은 프로세스 확인하기

ps aux --sort=-%mem | head

메모리를 많이 사용하는 프로세스를 확인합니다.

4. CPU 사용률 확인하기

top

또는

htop

CPU 사용률과 프로세스 상태를 함께 확인합니다.

5. ulimit 확인하기

현재 사용자의 리소스 제한을 확인합니다.

ulimit -a

특히 다음 항목을 확인합니다.

max user processes
open files
virtual memory

max user processes 값이 너무 낮으면 새로운 프로세스를 생성할 수 없습니다.

현재 최대 프로세스 수만 확인하려면 다음 명령을 사용합니다.

ulimit -u

6. PID 최대값 확인하기

Linux에서 사용할 수 있는 PID 범위를 확인합니다.

cat /proc/sys/kernel/pid_max

PID가 부족한 상황은 드물지만 장기간 운영되는 서버에서는 확인할 필요가 있습니다.

7. OOM Killer 로그 확인하기

커널 로그에서 OOM 발생 여부를 확인합니다.

dmesg | grep -i oom

또는

journalctl -k | grep -i oom

OOM Killer가 동작했다면 메모리 부족이 원인일 가능성이 높습니다.

8. Docker 환경 확인하기

Docker 컨테이너에서 실행 중이라면 리소스 제한을 확인합니다.

docker stats

메모리와 CPU 제한이 너무 낮게 설정되어 있지 않은지 확인합니다.

9. Kubernetes 환경 확인하기

Pod의 리소스 제한을 확인합니다.

kubectl describe pod POD_NAME

다음 항목을 확인합니다.

  • Limits
  • Requests

메모리 제한으로 인해 새로운 프로세스를 생성하지 못할 수 있습니다.

10. 불필요한 프로세스 종료하기

프로세스를 확인합니다.

ps -ef

필요 없는 프로세스를 종료합니다.

kill PID

강제 종료가 필요한 경우

kill -9 PID

운영 중인 서비스는 영향도를 반드시 확인한 후 종료해야 합니다.

Cannot fork 문제를 확인하는 순서

실무에서는 다음 순서대로 점검하는 것이 가장 효율적입니다.

  1. free -h 확인
  2. ps -ef | wc -l 확인
  3. ps aux 확인
  4. top 확인
  5. ulimit 확인
  6. pid_max 확인
  7. OOM 로그 확인
  8. Docker 리소스 확인
  9. Kubernetes 리소스 확인
  10. 불필요한 프로세스 종료

이 순서대로 점검하면 대부분의 원인을 빠르게 찾을 수 있습니다.

오류를 해결할 때 주의할 점

Cannot fork 오류가 발생했다고 해서 무조건 서버를 재부팅하는 것은 권장되지 않습니다.

먼저 메모리 부족인지, 프로세스 개수 제한인지, ulimit 설정 문제인지 원인을 정확히 확인해야 합니다. 특히 동일한 프로세스가 계속 증가하는 경우에는 애플리케이션의 메모리 누수나 무한 프로세스 생성(Bomb Fork) 여부도 함께 점검하는 것이 좋습니다.

자주 묻는 질문

메모리는 충분한데 Cannot fork가 발생합니다.

ulimit -u 값이 너무 낮거나 최대 프로세스 수를 초과했을 가능성이 있습니다.

Docker에서도 발생할 수 있나요?

네. 컨테이너의 메모리 제한이나 PID 제한이 설정되어 있다면 동일한 오류가 발생할 수 있습니다.

재부팅하면 해결되나요?

일시적으로는 해결될 수 있지만 근본 원인이 메모리 누수나 프로세스 폭증이라면 다시 동일한 문제가 발생할 가능성이 높습니다.

마무리

Cannot fork 오류는 Linux 서버에서 새로운 프로세스를 생성하지 못할 때 발생하는 대표적인 시스템 오류입니다. free, ps, top, ulimit, pid_max, dmesg 등을 활용해 메모리와 프로세스 상태를 단계적으로 점검하면 대부분의 원인을 빠르게 찾을 수 있습니다. 특히 장시간 운영되는 서버에서는 프로세스 수와 메모리 사용량을 지속적으로 모니터링하는 것이 안정적인 운영에 도움이 됩니다.

댓글 남기기