Linux 시스템에서 메모리 관리는 안정적인 서버 운영과 최적화된 성능 유지를 위해 필수적입니다. 메모리 사용량을 정확히 파악하고 문제를 조기에 발견하는 것은 시스템 관리자의 중요한 업무 중 하나죠. 오늘은 Linux에서 메모리 관리를 위한 필수 명령어들을 자세히 알아보겠습니다. 각 명령어의 사용법부터 실전 활용 사례까지, 이번 포스트로 Linux 메모리 관리의 모든 것을 알아보도록 하겠습니다.
1. free 명령어: 시스템 메모리 사용량 확인하기
free 명령어는 시스템의 물리적 메모리와 스왑 메모리의 총량, 사용량, 여유 공간을 빠르게 확인할 수 있는 기본 도구입니다. 간단하지만 강력한 이 명령어는 메모리 부족 문제를 진단하는 첫 단계로 자주 사용됩니다.
기본 사용법
가장 기본적인 형태로 free 명령어를 실행하면 바이트 단위로 메모리 정보가 표시됩니다.
free
하지만 더 읽기 쉬운 형태로 출력하기 위해 다양한 옵션을 활용할 수 있습니다.
주요 옵션
- -b, –bytes: 바이트 단위로 표시
- -k, –kilo: 킬로바이트 단위로 표시 (기본값)
- -m, –mega: 메가바이트 단위로 표시
- -g, –giga: 기가바이트 단위로 표시
- -h, –human: 사람이 읽기 쉬운 형태로 단위 자동 변환
- -s N, –seconds=N: N초마다 연속적으로 정보 업데이트
- -t, –total: 합계 행 추가
- -w, –wide: 넓은 형식으로 출력
사용 예시
메가바이트 단위로 메모리 정보를 확인하고 싶을 때는 다음과 같이 사용합니다:
free -m
사람이 읽기 쉬운 형태로 표시하려면:
free -h
2초마다 메모리 정보를 업데이트하여 5회 반복하려면:
free -h -s 2 -c 5
free 출력 이해하기
free 명령어 실행 결과를 올바르게 이해해야 메모리 문제를 정확히 진단할 수 있습니다.
total used free shared buff/cache available
Mem: 15.6G 4.8G 2.2G 1.1G 8.6G 9.5G
Swap: 2.0G 0B 2.0G
- total: 설치된 총 물리적 메모리 양
- used: 사용 중인 메모리 양
- free: 완전히 사용되지 않은 메모리 양
- shared: tmpfs와 같은 공유 메모리에 사용되는 양
- buff/cache: 버퍼와 캐시에 할당된 메모리 양
- available: 스왑 없이 새로운 애플리케이션을 시작할 수 있는 메모리 양
여기서 주목할 부분은 ‘available’ 열입니다. Linux는 성능을 위해 사용하지 않는 메모리를 버퍼와 캐시로 활용하기 때문에 ‘free’ 열의 값이 작더라도 ‘available’ 값이 충분하다면 메모리는 여유가 있는 상태입니다.
2. top 명령어: 실시간 시스템 모니터링
top은 시스템의 실시간 상태를 종합적으로 모니터링할 수 있는 강력한 도구입니다. CPU, 메모리, 프로세스 정보 등을 한 화면에서 확인할 수 있어 문제 진단에 매우 유용합니다.
기본 사용법
다음과 같이 간단히 실행할 수 있습니다:
top
주요 메모리 관련 정보
top 실행 시 화면 상단에는 시스템 요약 정보가 표시되는데, 그 중 메모리 관련 정보는 다음과 같습니다:
KiB Mem : 16046460 total, 2279240 free, 4880836 used, 8886384 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 10016460 avail Mem
주요 키보드 단축키
top을 실행한 상태에서 다음 키를 사용하여 메모리 관련 보기를 조정할 수 있습니다:
- M: 메모리 사용량 기준으로 프로세스 정렬
- m: 메모리 통계 표시 형식 변경
- t: CPU 통계 표시 형식 변경
- E: 메모리 단위 변경 (KiB, MiB, GiB, TiB, PiB, EiB)
- e: 프로세스 메모리 단위 변경
주요 옵션
- -d N: N초마다 화면 갱신 (기본값: 3.0초)
- -n N: N회만 업데이트 후 종료
- -p N: PID N인 프로세스만 모니터링
- -u user: 특정 사용자의 프로세스만 표시
- -b: 배치 모드로 실행 (출력을 파일로 리다이렉트할 때 유용)
사용 예시
메모리 사용량이 높은 상위 10개 프로세스만 확인하고 싶다면:
top -o %MEM -n 1 | head -n 17
특정 사용자(예: mysql)의 프로세스만 모니터링하려면:
top -u mysql
1초마다 업데이트하며 실시간으로 모니터링하려면:
top -d 1
top에서 메모리 문제 식별하기
프로세스 목록에서 %MEM 열을 주시하여 메모리를 과도하게 사용하는 프로세스를 식별할 수 있습니다. 특히 RES(상주 메모리) 값이 비정상적으로 높거나 지속적으로 증가하는 프로세스는 메모리 누수 가능성이 있으므로 주의해야 합니다.
3. vmstat 명령어: 가상 메모리 통계 확인하기
vmstat(Virtual Memory Statistics)는 시스템의 프로세스, 메모리, 페이징, 블록 I/O, CPU 활동 등에 대한 정보를 제공합니다. 특히 가상 메모리 활용 상황을 분석하는 데 매우 유용합니다.
기본 사용법
기본적으로 시스템이 부팅된 이후의 평균 통계를 확인할 수 있습니다:
vmstat
주요 옵션
- -a: 활성/비활성 메모리 정보 포함
- -d: 디스크 통계 표시
- -f: 포크 수 표시
- -m: slab 정보 표시
- -s: 메모리 통계 표시
- -t: 타임스탬프 추가
- interval: 통계를 수집할 간격(초)
- count: 통계를 표시할 횟수
주요 출력 항목 (메모리 관련)
- swpd: 사용 중인 가상 메모리 양
- free: 유휴 메모리 양
- buff: 버퍼로 사용 중인 메모리 양
- cache: 캐시로 사용 중인 메모리 양
- si: 디스크에서 스왑인 된 메모리(KB/s)
- so: 디스크로 스왑아웃 된 메모리(KB/s)
사용 예시
2초 간격으로 5회 측정하여 메모리 상태 변화를 관찰하려면:
vmstat 2 5
활성/비활성 메모리 정보를 포함하여 확인하려면:
vmstat -a
상세한 메모리 통계를 확인하려면:
vmstat -s
타임스탬프와 함께 1초 간격으로 모니터링하려면:
vmstat -t 1
메모리 문제 식별하기
vmstat 출력에서 메모리 문제를 식별하는 방법:
- 높은 si/so 값: 지속적인 스왑 활동은 물리적 메모리 부족 상태를 나타냄
- 낮은 free + buff/cache 값: 가용 메모리가 부족한 상태
- 높은 r 값(실행 대기 중인 프로세스)과 함께 메모리 부족: CPU 바인딩이 아닌 메모리 문제로 인한 성능 저하 가능성
4. slabtop 명령어: 커널 슬랩 캐시 정보 모니터링
slabtop은 커널의 슬랩 캐시 사용 현황을 실시간으로 보여주는 도구입니다. 커널 객체 할당에 대한 상세 정보를 확인할 수 있어 커널 메모리 누수나 비효율적인 메모리 사용을 진단하는 데 유용합니다.
기본 사용법
slabtop
주요 옵션
- -d N: N초마다 화면 갱신 (기본값: 3초)
- -s c: 캐시 크기별로 정렬
- -s l: 슬랩 객체당 활성 객체 수로 정렬
- -s v: 캐시당 활성 슬랩 수로 정렬
- -s n: 캐시 이름별로 정렬
- -s a: 활성 객체 수(메모리 사용량)별로 정렬 (기본값)
- -o: 한 화면 모드 (top처럼)
주요 출력 항목
- OBJS: 활성 객체 수
- ACTIVE: 활성 객체 비율
- USE: 캐시 사용률
- OBJ SIZE: 각 객체의 크기
- SLABS: 슬랩 수
- OBJ/SLAB: 슬랩당 객체 수
- CACHE SIZE: 캐시 크기
- NAME: 캐시 이름
사용 예시
메모리 사용량이 가장 많은 슬랩 캐시 확인(기본값):
slabtop
1초마다 갱신하여 모니터링하려면:
slabtop -d 1
슬랩 캐시를 이름순으로 정렬하려면:
slabtop -s n
메모리 문제 식별하기
특정 캐시 객체가 예상보다 많은 메모리를 사용하고 있다면, 관련 커널 기능이나 드라이버에 문제가 있을 수 있습니다. 특히 dentry_cache와 inode_cache가 비정상적으로 큰 경우, 파일 시스템 관련 이슈가 있을 수 있습니다.
5. 추가 유용한 메모리 관리 명령어
위에서 살펴본 네 가지 명령어 외에도 Linux에서는 다양한 메모리 관리 명령어를 제공합니다. 이 중 꼭 알아두면 좋을 추가 명령어들을 살펴보겠습니다.
ps 명령어: 프로세스 메모리 사용량 확인
ps 명령어를 사용하여 개별 프로세스의 메모리 사용량을 상세히 확인할 수 있습니다.
ps aux --sort=-rss
이 명령어는 모든 프로세스를 메모리 사용량(RSS) 기준으로 내림차순 정렬하여 보여줍니다.
특정 프로세스의 자세한 메모리 정보를 확인하려면:
ps -o pid,user,%mem,rss,vsz,cmd -p <PID>
pmap 명령어: 프로세스 메모리 맵 확인
특정 프로세스의 메모리 맵을 상세히 확인할 수 있습니다.
pmap <PID>
더 자세한 정보를 원한다면:
pmap -x <PID>
메모리 영역별 권한까지 확인하려면:
pmap -XX <PID>
/proc 파일시스템 활용
/proc 가상 파일시스템을 통해 시스템과 프로세스의 메모리 정보를 확인할 수 있습니다.
시스템 메모리 정보 확인:
cat /proc/meminfo
특정 프로세스의 메모리 정보 확인:
cat /proc/<PID>/status | grep -i mem
smem 명령어: 실제 메모리 사용량 확인
smem은 프로세스의 실제 물리 메모리 사용량(PSS: Proportional Set Size)을 정확히 보여주는 도구입니다. 공유 메모리를 사용하는 프로세스의 정확한 메모리 사용량을 파악할 때 유용합니다.
smem -t -k
사용자별로 메모리 사용량을 집계하려면:
smem --userfilter=root -t -k
sar 명령어: 시스템 활동 보고서
sysstat 패키지의 일부인 sar 명령어를 사용하여 메모리 사용량 기록 및 분석이 가능합니다.
메모리 활용 현황 확인:
sar -r
스왑 활동 모니터링:
sar -S
페이징 통계 확인:
sar -B
6. 명령어 조합으로 심층 분석하기
단일 명령어만으로는 파악하기 어려운 복잡한 메모리 문제를 분석하기 위해 명령어를 조합하여 사용할 수 있습니다.
메모리 누수 감지하기
특정 프로세스의 메모리 사용량 증가를 모니터링하는 스크립트 예시:
while true; do
ps -o pid,rss,vsz,cmd -p <PID> | grep -v PID
sleep 10
done
이 스크립트는 10초마다 특정 프로세스의 메모리 사용량을 확인하여 지속적인 증가 여부를 파악할 수 있게 해줍니다.
메모리 사용량 상위 프로세스 분석
다음 명령어 조합으로 메모리 사용량 상위 10개 프로세스를 확인할 수 있습니다:
ps aux | sort -rn -k 4 | head -10
더 읽기 쉬운 형태로 메모리 단위를 변환하여 표시하려면:
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -11
시스템 메모리 압박 상태 종합 분석
시스템의 메모리 상태를 종합적으로 분석하는 예시:
echo "=== System Memory ==="; free -h; echo; \
echo "=== Top Memory Processes ==="; ps aux --sort=-%mem | head -11; echo; \
echo "=== Swap Activity ==="; vmstat 1 5; echo; \
echo "=== Detailed Memory Info ==="; cat /proc/meminfo | grep -E 'Mem|Cache|Swap'
이 스크립트는 시스템 메모리 상태, 메모리 사용량 상위 프로세스, 스왑 활동, 상세 메모리 정보를 한 번에 보여줍니다.
메모리 사용량 변화 추적
일정 시간 동안 메모리 사용량 변화를 기록하는 예시:
for i in $(seq 1 10); do
echo "=== Iteration $i ===";
free -m;
sleep 60;
done > memory_log.txt
이 스크립트는 1분 간격으로 10회 메모리 상태를 기록하여 파일로 저장합니다.
7. 메모리 명령어 사용 시 주의사항
메모리 관리 명령어를 사용할 때 주의해야 할 몇 가지 중요한 사항들을 알아보겠습니다.
시스템 부하 고려하기
특히 프로덕션 환경에서는 다음 사항에 주의해야 합니다:
- 너무 짧은 간격으로 명령어를 반복 실행하면 시스템에 추가 부하를 줄 수 있습니다.
- 대규모 시스템에서
-a
옵션이나 상세 정보를 요청하는 옵션은 추가 시스템 리소스를 소비할 수 있습니다.
메모리 해석 시 주의사항
- 캐시 메모리 오해: Linux는 사용 가능한 메모리를 캐시로 활용하므로, 단순히 free 값이 낮다고 메모리 부족으로 판단하지 마세요. available 메모리 값을 함께 고려해야 합니다.
- VSZ와 RSS의 차이: 가상 메모리 크기(VSZ)와 실제 사용 중인 물리 메모리(RSS)는 크게 다를 수 있습니다. 메모리 문제 분석 시 둘 다 고려해야 합니다.
- 공유 메모리 계산: 여러 프로세스가 공유하는 메모리는 각 프로세스의 RSS에 중복 계산될 수 있으므로 주의해야 합니다. 이 경우 smem 명령어의 PSS 값이 더 정확합니다.
튜닝 작업 전 백업 필수
메모리 분석 후 시스템 튜닝 작업 시 다음 사항을 명심하세요:
- 시스템 설정 변경 전 항상 현재 설정을 백업하세요.
/proc/sys/vm/
디렉토리의 값을 수정할 때는 신중해야 합니다.- 변경 사항을 영구적으로 적용하기 전에 임시 변경으로 테스트하세요.
8. 자주 마주치는 문제 및 해결방법
실제 시스템 관리에서 자주 마주치는 메모리 관련 문제와 이를 해결하기 위한 명령어 활용법을 살펴보겠습니다.
시나리오 1: 시스템 메모리 부족 문제 해결
시스템이 느려지고 메모리 부족 현상이 의심될 때:
- 먼저 현재 메모리 상태 확인:
free -h
- 메모리 사용량이 높은 프로세스 식별:
ps aux --sort=-%mem | head -10
- 스왑 활동 확인:
vmstat 1 10
- 필요시 불필요한 프로세스 종료 또는 리소스 제한:
kill <PID> # 또는
systemctl restart <service>
시나리오 2: 메모리 누수 의심 프로세스 분석
특정 프로세스의 메모리 사용량이 지속적으로 증가한다면:
- 프로세스 메모리 사용량 모니터링:
watch -n 10 'ps -o pid,ppid,rss,vsz,%mem,cmd -p <PID>'
- 프로세스의 메모리 맵 분석:
pmap -x <PID>
- 상세 메모리 정보 확인:
cat /proc/<PID>/smaps | grep -E 'Size|Rss|Pss|Referenced'
시나리오 3: 캐시 메모리 활용 최적화
캐시 메모리 사용 현황 및 최적화:
- 캐시 메모리 현황 확인:
cat /proc/meminfo | grep -E 'Cache|Buffer'
- 커널 슬랩 캐시 분석:
slabtop -o
- 필요시 캐시 메모리 일부 해제:
echo 1 > /proc/sys/vm/drop_caches # 페이지 캐시만 해제
echo 2 > /proc/sys/vm/drop_caches # dentry와 inode 캐시만 해제
echo 3 > /proc/sys/vm/drop_caches # 모든 캐시 해제
⚠️ 주의: 프로덕션 환경에서는 캐시 메모리 해제를 신중하게 수행해야 합니다. 캐시는 성능 향상을 위한 것이므로 불필요하게 해제하면 성능이 저하될 수 있습니다.
Linux 시스템에서 메모리 관리는 안정적인 서버 운영의 핵심입니다. 이 글에서 소개한 명령어들(free, top, vmstat, slabtop)을 적절히 활용하면 메모리 관련 문제를 조기에 발견하고 해결할 수 있습니다.
특히 중요한 점은 단일 명령어의 결과만으로 판단하지 말고, 여러 명령어를 조합하여 종합적으로 분석하는 것입니다. 또한 Linux의 메모리 관리 특성(특히 캐시 메모리 활용)을 이해하고 해석하는 것이 중요합니다. 메모리 관리는 지속적인 모니터링이 필요한 분야이므로, 여기서 소개한 명령어들을 실제 환경에서 충분히 연습하고 확인해 보시길 추천드립니다. 🙂