Linux 서버를 운영하다 보면 프로그램 실행, 파일 복사, 애플리케이션 구동 또는 프로세스 생성 과정에서 Cannot allocate memory라는 오류를 만나는 경우가 있습니다. 이 오류는 시스템이 필요한 메모리를 확보하지 못해 작업을 수행할 수 없다는 의미입니다.
메모리가 부족한 경우뿐 아니라 Swap 공간 부족, 메모리 제한(ulimit), 컨테이너 리소스 제한, 메모리 단편화 등의 원인으로도 발생할 수 있습니다. 단순히 RAM 용량만 확인해서는 해결되지 않는 경우가 많기 때문에 체계적인 점검이 필요합니다.
이번 글에서는 Cannot allocate memory 오류가 발생하는 원인과 해결 방법을 알아보겠습니다.
Cannot allocate memory란 무엇인가?
프로그램이 새로운 메모리를 요청했지만 운영체제가 할당할 수 없는 경우 발생하는 오류입니다.
대표적인 오류 예시는 다음과 같습니다.
malloc: Cannot allocate memory
또는
fork: Cannot allocate memory
또는
Cannot allocate memory
즉, 시스템에서 사용할 수 있는 메모리가 부족하거나 메모리 할당이 제한된 상태를 의미합니다.
Cannot allocate memory 오류가 발생하는 대표적인 원인
다음과 같은 경우에 자주 발생합니다.
- RAM 부족
- Swap 공간 부족
- 메모리 누수(Memory Leak)
- ulimit 제한
- Docker 메모리 제한
- Kubernetes 리소스 제한
- 너무 많은 프로세스 실행
- 대용량 애플리케이션 실행
- 메모리 단편화
- 커널 메모리 부족
실무에서는 실제 메모리 사용량과 Swap 사용량을 먼저 확인하는 것이 중요합니다.
1. 메모리 사용량 확인하기
현재 메모리 상태를 확인합니다.
free -h
예시
total used free
Mem: 16G 15G 500M
Swap: 4G 4G 0B
Swap까지 모두 사용 중이라면 메모리 부족 가능성이 높습니다.
2. 실시간 메모리 확인하기
현재 메모리를 많이 사용하는 프로세스를 확인합니다.
top
또는
htop
메모리 사용량이 높은 프로세스를 우선 확인합니다.
3. 메모리 사용 프로세스 확인하기
메모리 사용량 기준으로 정렬합니다.
ps aux --sort=-%mem | head
가장 많은 메모리를 사용하는 프로세스를 빠르게 확인할 수 있습니다.
4. Swap 사용량 확인하기
Swap 정보를 확인합니다.
swapon --show
또는
cat /proc/swaps
Swap이 없거나 모두 사용 중이라면 메모리 부족 가능성이 높습니다.
5. ulimit 확인하기
프로세스 제한을 확인합니다.
ulimit -a
특히 다음 항목을 확인합니다.
max memory size
max user processes
virtual memory
제한값이 너무 낮게 설정되어 있지는 않은지 확인합니다.
6. OOM 로그 확인하기
커널 로그를 확인합니다.
dmesg | grep -i oom
또는
journalctl -k | grep -i oom
OOM Killer가 동작했다면 메모리 부족이 발생한 것입니다.
7. Docker 메모리 제한 확인하기
컨테이너 환경에서는 메모리 제한을 확인합니다.
docker stats
또는
docker inspect 컨테이너명
컨테이너 메모리 제한이 너무 낮게 설정되어 있는지 확인합니다.
8. Kubernetes 환경 확인하기
Pod의 리소스 제한을 확인합니다.
kubectl describe pod POD_NAME
다음 항목을 확인합니다.
- Limits
- Requests
메모리 제한으로 인해 오류가 발생할 수 있습니다.
9. 메모리 캐시 확인하기
Linux는 사용하지 않는 메모리를 캐시로 활용합니다.
free -h
buff/cache 항목이 크다고 해서 메모리가 부족한 것은 아닙니다.
Linux는 필요할 때 캐시를 자동으로 반환합니다.
10. 시스템 재부팅 검토하기
메모리 누수가 계속 발생하는 경우 서비스 재시작이나 시스템 재부팅이 필요할 수 있습니다.
다만 운영 환경에서는 원인을 분석한 후 재부팅을 진행하는 것이 좋습니다.
Cannot allocate memory 문제를 확인하는 순서
실무에서는 다음 순서대로 점검하는 것이 가장 효율적입니다.
- free -h 확인
- top 또는 htop 확인
- ps aux 확인
- Swap 확인
- ulimit 확인
- OOM 로그 확인
- Docker 메모리 제한 확인
- Kubernetes 리소스 확인
- 메모리 캐시 확인
- 서비스 재시작 또는 재부팅 검토
이 순서대로 확인하면 대부분의 원인을 빠르게 찾을 수 있습니다.
오류를 해결할 때 주의할 점
메모리가 부족하다고 해서 무조건 캐시를 삭제하거나 서버를 재부팅하는 것은 좋은 방법이 아닙니다.
먼저 어떤 프로세스가 메모리를 많이 사용하는지 확인하고, 메모리 누수 여부를 분석한 뒤 필요하다면 애플리케이션을 수정하거나 메모리를 증설하는 것이 근본적인 해결 방법입니다.
자주 묻는 질문
메모리가 많이 남아 있는데도 오류가 발생합니다.
ulimit 제한이나 Docker/Kubernetes 메모리 제한 때문에 발생할 수 있습니다.
Swap을 늘리면 해결되나요?
일시적으로는 도움이 될 수 있지만 메모리 누수가 있다면 근본적인 해결책은 아닙니다.
OOM Killer와 관련이 있나요?
네. 메모리 부족이 심하면 OOM Killer가 프로세스를 강제 종료하며, 그 이전 단계에서 Cannot allocate memory 오류가 발생할 수 있습니다.
마무리
Cannot allocate memory 오류는 Linux 서버에서 메모리 부족이나 리소스 제한으로 인해 발생하는 대표적인 오류입니다. free, top, ps, swapon, ulimit, dmesg 등을 활용해 메모리 상태를 단계적으로 점검하면 대부분의 원인을 빠르게 파악할 수 있습니다. 특히 메모리 누수나 컨테이너 리소스 제한이 있는 환경에서는 로그와 설정을 함께 확인하는 것이 중요합니다.