리눅스에서 메모리는 단순히 “사용량”만 보는 것이 아니라 구조를 이해해야 한다.
프로세스 메모리와 시스템 메모리 구조를 함께 봐야 성능 문제를 정확히 판단할 수 있다.
특히 메모리 부족, OOM, swap 발생 같은 문제는 구조를 모르면 원인을 찾기 어렵다.
리눅스 메모리는 크게 프로세스 관점과 시스템 관점으로 나눠 이해한다.
1. 프로세스 메모리 구조
각 프로세스는 독립된 가상 메모리 공간을 가진다.
이 공간은 다음과 같은 영역으로 나뉜다.
Text (코드 영역)
실행 파일의 코드가 저장되는 영역이다.
읽기 전용이며 여러 프로세스가 공유할 수 있다.
Data 영역
전역 변수와 static 변수가 저장되는 영역이다.
프로그램 실행 시 할당되고 종료 시 해제된다.
Heap (힙)
동적으로 메모리를 할당하는 영역이다.
malloc, new 같은 연산이 이 영역을 사용한다.
프로그램 실행 중 계속 증가할 수 있으며, 개발자가 직접 관리해야 한다.
메모리 누수가 발생하기 쉬운 영역이다.
Stack (스택)
함수 호출 시 생성되는 지역 변수와 호출 정보가 저장된다.
함수가 끝나면 자동으로 해제된다.
Stack은 크기가 제한되어 있어 너무 깊은 재귀 호출 시 Stack Overflow가 발생한다.
2. 가상 메모리(Virtual Memory)
리눅스는 모든 프로세스에 가상 메모리를 제공한다.
실제 물리 메모리보다 큰 주소 공간을 사용할 수 있다.
필요한 부분만 물리 메모리에 올리고 나머지는 디스크에 저장한다.
이때 사용하는 것이 swap이다.
가상 메모리 덕분에 여러 프로세스를 동시에 안정적으로 실행할 수 있다.
3. 시스템 메모리 구조
시스템 전체 관점에서 메모리는 다음과 같이 나뉜다.
free -m
출력 항목은 다음 의미를 가진다.
- total — 전체 메모리
- used — 사용 중인 메모리
- free — 완전히 비어 있는 메모리
- buff/cache — 캐시로 사용 중인 메모리
- available — 실제 사용 가능한 메모리
리눅스는 남는 메모리를 캐시로 적극 활용한다.
따라서 free 값이 낮아도 available이 충분하면 문제가 없다.
4. Cache와 Buffer
리눅스는 디스크 접근 속도를 줄이기 위해 메모리를 캐시로 사용한다.
이 영역은 필요하면 언제든 회수된다.
- Buffer — 파일 시스템 메타데이터 캐시
- Cache — 파일 데이터 캐시
캐시가 많다고 해서 메모리가 부족한 것은 아니다.
오히려 성능을 위해 정상적으로 사용되는 상태다.
5. Swap
Swap은 물리 메모리가 부족할 때 디스크를 메모리처럼 사용하는 공간이다.
하지만 디스크는 RAM보다 훨씬 느리기 때문에 성능이 크게 저하된다.
swapon -s
Swap 사용량이 지속적으로 증가하면 메모리 부족 상태를 의미한다.
이 경우 애플리케이션 메모리 사용량을 점검해야 한다.
6. OOM (Out Of Memory)
메모리가 완전히 부족해지면 리눅스는 OOM Killer를 실행한다.
메모리를 많이 사용하는 프로세스를 강제로 종료한다.
dmesg | grep -i "killed process"
운영 환경에서 갑자기 프로세스가 종료되면 OOM을 의심해야 한다.
7. 실무 점검 방법
- top / htop으로 프로세스별 메모리 확인
- free -m으로 전체 메모리 상태 확인
- swap 사용 여부 점검
- 로그로 OOM 발생 여부 확인
메모리 문제는 단순 수치보다 “증가 패턴”을 보는 것이 중요하다.
지속적으로 증가하면 메모리 누수 가능성이 있다.
한 줄 요약
리눅스 메모리는 프로세스 단위(Heap, Stack 등)와 시스템 단위(Cache, Swap)로 나뉜다. free 값만 보지 말고 available, cache, swap, OOM 여부까지 함께 확인해야 정확한 상태를 판단할 수 있다.
댓글 0