Linux 성능 튜닝 트러블슈팅: top, iostat, vmstat로 문제 해결

Linux 서버 성능 병목 현상을 해결하는 것은 시스템 관리자와 DevOps 엔지니어의 핵심 역량입니다. top, iostat, vmstat과 같은 기본 제공 도구를 활용하면 CPU, 메모리, 디스크 I/O, 페이징 등 다양한 지표에서 발생하는 문제를 정확히 진단할 수 있습니다. 이 가이드에서는 각 도구의 기본 사용법부터 실제 트러블슈팅 사례까지 단계별로 설명합니다.

1. Linux 성능 모니터링 도구 기본 사용법

1.1 top: 실시간 CPU/메모리 모니터링

top은 Linux 시스템의 실시간 상태를 확인하는 가장 기본적인 도구입니다. CPU 사용률, 메모리 사용량, 실행 중인 프로세스 목록 등을 1초 단위로 업데이트하여 보여줍니다.

# 기본 top 실행 (1초 간격)
top

# 상세 프로세스 정보 확인 (커널 스레드 포함)
top -H

# CPU 사용률 높은 프로세스 상위 10개 출력
ps auxf --sort=-%cpu | head -n 12

Tip: top 실행 후 1 키를 눌러 CPU 코어별 사용률을 확인할 수 있습니다. shift + p는 CPU 사용률 기준 정렬, shift + m은 메모리 사용률 기준 정렬입니다.

1.2 iostat: 디스크 I/O 병목 진단

iostat(I/O statistics)는 디스크 장치의 읽기/쓰기 성능, 대기 시간, 처리량 등을 모니터링합니다. sysstat 패키지에 포함되어 있으며, CentOS/RHEL에서는 yum install sysstat으로 설치 가능합니다.

# 1초 간격으로 5회 디스크 I/O 통계 출력
iostat -xz 1 5

# 특정 디스크 장치(sda) 모니터링
iostat -x sda 1 10

주의: iostatawait(평균 I/O 처리 시간) 값이 10ms 이상이면 디스크 병목 가능성이 높습니다. avgqu-sz(평균 요청 큐 크기)가 1을 초과하면 I/O 대기열이 쌓이기 시작한다는 신호입니다.

1.3 vmstat: 시스템 전체 상태 종합 분석

vmstat(Virtual Memory Statistics)는 CPU, 메모리, 페이징, 블록 I/O, 트랩, 디스크 등 시스템 전반의 상태를 한 번에 확인할 수 있는 강력한 도구입니다.

# 1초 간격으로 10회 시스템 통계 출력
vmstat 1 10

# 5초 간격으로 20회 상세 출력 (disk stats 포함)
vmstat -d 5 20

중요 지표:

  • us(user), sy(system), id(idle): CPU 사용 시간 비율
  • si(swap in), so(swap out): 스와핑 발생 여부
  • cs(context switch): 컨텍스트 스위칭 빈도 (10,000 이상이면 문제 가능성)

2. CPU 과부하 문제 해결 방법

2.1 top으로 CPU 집약적 프로세스 식별

CPU 사용률이 80% 이상 지속적으로 높게 나타난다면, top을 통해 문제 프로세스를 식별해야 합니다.

# 명령행 인자까지 표시 (CPU 사용률 높은 프로세스 확인)
top -c

# CPU 사용률 기준 상위 5개 프로세스
ps -eo pid,comm,%cpu --sort=-%cpu | head -n 6

예시 시나리오: 특정 Python 프로세스가 95% CPU를 점유하는 경우, 코드 내의 무한 루프 또는 비효율적인 알고리즘이 원인일 수 있습니다.

2.2 iostat으로 디스크 관련 CPU 지연 확인

CPU 사용률은 낮지만 시스템이 느리게 반응할 경우, 디스크 I/O 대기 시간으로 인한 CPU 지연이 발생할 수 있습니다.

# 확장된 디스크 통계 출력 (avgqu-sz, await 확인)
iostat -xz 1

await 값이 20ms 이상이면 스토리지 성능 문제를 의심해야 합니다. SSD 기준 일반적으로 0.1ms 미만, HDD는 5~10ms 사이가 정상입니다.

2.3 vmstat으로 컨텍스트 스위칭 분석

높은 컨텍스트 스위칭(cs) 비율은 스레드 경합 또는 과도한 멀티태스킹을 나타냅니다.

# 1초 간격으로 컨텍스트 스위칭 모니터링
vmstat 1 5

cs 값이 CPU 코어당 초당 2,000회를 초과하면 성능 저하가 발생할 수 있습니다. 예를 들어 4코어 시스템에서 cs 값이 10,000 이상이면 조사가 필요합니다.

3. 메모리 및 디스크 병목 트러블슈팅

3.1 메모리 부족 현상 감지

vmstat에서 si/so 값이 0보다 크면 스와핑이 발생하고 있음을 의미합니다.

# 메모리 및 스와핑 모니터링
vmstat -s

# 실시간 메모리 사용량 확인
free -m

스와핑이 지속되면 애플리케이션 성능이 급격히 저하됩니다. swapiness 값을 조정하여 스와핑을 최소화할 수 있습니다.

# swapiness 값 확인 및 조정
cat /proc/sys/vm/swappiness
sysctl vm.swappiness=10

3.2 디스크 I/O 병목 해결

iostat에서 %util(디스크 사용률)이 100%에 가까우면 디스크 대역폭이 포화 상태임을 의미합니다.

# 디스크 사용률 모니터링
iostat -d 1 5

해결 방안:

  1. I/O 집약적 작업을 비동기 처리
  2. 파일 시스템 캐싱 최적화 (noatime 옵션)
  3. RAID 구성 또는 SSD로 업그레이드
  4. ionice로 I/O 우선순위 조정
    # 백그라운드 작업에 ionice 적용
    

tar -cf backup.tar /data/ | ionice -c 3 > backup.tar.bz2

4. 실제 사례: CPU 과부하 문제 해결

4.1 문제 상황

  • CPU 사용률 95% 이상 지속
  • top에서 java 프로세스 1개가 90% CPU 점유
  • iostat에서 await 0.5ms (정상)
  • vmstat에서 cs 1,200/초 (정상 범위)

4.2 해결 과정

  1. top -H -p <PID>로 Java 프로세스 내 스레드 확인
  2. jstack <PID>로 스레드 덤프 분석
  3. 특정 HTTP 요청 처리 시 무한 루프 발견
  4. 코드 수정 후 CPU 사용률 15%로 감소

5. 공식 문서 및 추가 자료

결론

top, iostat, vmstat은 Linux 성능 문제의 80% 이상을 해결할 수 있는 핵심 도구입니다. 이 세 가지 도구를 조합해 사용하면 CPU, 메모리, 디스크, 네트워크 등 다양한 계층에서 발생하는 병목 현상을 정확히 진단할 수 있습니다. 문제 발생 시 반드시 지표 간 상관관계를 분석하는 습관을 기르세요. 예를 들어 CPU 사용률이 높은데 iostatawait도 높다면, 디스크 I/O로 인한 CPU 대기 상태일 수 있습니다.

최종 점검 리스트:

  1. top으로 CPU/메모리 사용 프로세스 확인
  2. iostat으로 디스크 병목 여부 판단
  3. vmstat으로 컨텍스트 스위칭/페이징 이상 패턴 감지
  4. 모든 지표를 종합적으로 분석