서버에 성능 문제가 발생했을 때 빠르게 원인을 파악하는 능력은 시스템 관리자와 백엔드 개발자의 핵심 역량이다. 이 글에서는 Linux 시스템의 CPU, 메모리, 디스크, 네트워크 성능을 분석하는 도구들을 실전 시나리오별로 정리한다.

1단계: 60초 안에 전체 상태 파악

서버 문제 발생 시 가장 먼저 실행해야 할 명령어들이다.

# 1. 시스템 부하 확인 (가장 먼저)
uptime
# 10:30:00 up 45 days, load average: 8.25, 4.15, 2.30
# load average: 1분, 5분, 15분 평균
# CPU 코어 수 대비 높으면 과부하 (nproc으로 코어 수 확인)

# 2. 커널 메시지 확인 (OOM Killer 등)
dmesg -T | tail -20

# 3. 전체 시스템 상태
vmstat 1 5
# procs ---------memory--------- ---swap-- ----io---- -system-- -----cpu----
#  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
#  4  0      0 245612  48320 1234560  0    0    12   156 2345 4567 45 10 40  5
# r: 실행 대기 프로세스 수 (CPU 코어보다 많으면 CPU 병목)
# b: I/O 대기 프로세스 수 (높으면 디스크 병목)

# 4. CPU 상세 (코어별)
mpstat -P ALL 1 3
# CPU    %usr   %sys   %iowait  %idle
# all    45.12   9.88    5.23   39.77
# 0      99.00   1.00    0.00    0.00  -- 특정 코어만 100%면 싱글스레드 병목

# 5. 프로세스별 CPU/메모리
pidstat 1 5

# 6. 디스크 I/O
iostat -xz 1 3
# Device  r/s  w/s  rkB/s  wkB/s  await  svctm  %util
# sda    12.0 156.0 48.0  2496.0   4.5    1.2   18.7

# 7. 메모리 상세
free -h

# 8. 네트워크 인터페이스 통계
sar -n DEV 1 3

# 9. TCP 연결 상태
ss -s

# 10. 시스템 전체 요약
sar -u -r -d -n DEV 1 3

CPU 병목 분석

# top - 실시간 프로세스 모니터링
top -o %CPU
# 주요 단축키:
# 1: 코어별 CPU 표시
# M: 메모리 기준 정렬
# P: CPU 기준 정렬
# H: 스레드별 표시
# c: 전체 명령어 경로 표시

# htop - 더 직관적인 모니터링
htop -t  # 트리 뷰

# 프로세스의 스레드별 CPU 사용량
top -H -p 478

# CPU를 많이 사용하는 프로세스의 시스템 콜 추적
strace -c -p 1234
# % time     calls  syscall
# 45.23      12345  futex
# 23.45       6789  write
# 12.34       3456  read

# perf로 CPU 프로파일링 (커널 레벨)
perf top -p 1234
# 어떤 함수에서 CPU를 많이 사용하는지 확인

# perf로 Flame Graph 데이터 수집
perf record -g -p 1234 -- sleep 30
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg

메모리 문제 분석

# 프로세스별 메모리 사용량 상세
ps aux --sort=-rss | head -20

# 특정 프로세스 메모리 맵
pmap -x 1234 | tail -5

# 메모리 누수 의심 시 - 시간별 RSS 추적
while true; do
    echo "Sat Apr  4 08:13:22 KST 2026 " >> /tmp/mem_track.log
    sleep 60
done

# OOM Killer 로그 확인
dmesg -T | grep -i "oom"

# 시스템 전체 메모리 사용 상세
cat /proc/meminfo | head -20

# slab 캐시 확인 (커널 메모리)
slabtop -o | head -20

디스크 I/O 분석

# 실시간 I/O 모니터링
iotop -oP

# 파일시스템 사용량
df -hT

# inode 사용량 (파일 수 제한)
df -i

# 디렉토리별 디스크 사용량
du -sh /var/log/* | sort -rh | head -10

# 큰 파일 찾기
find / -type f -size +100M 2>/dev/null | head -20

# 삭제했지만 프로세스가 아직 열고 있는 파일
lsof +L1

# 파일시스템 성능 벤치마크 - 순차 쓰기
dd if=/dev/zero of=/tmp/test bs=1M count=1024 conv=fdatasync
# 1073741824 bytes (1.0 GB) copied, 2.345 s, 458 MB/s

# 랜덤 I/O (fio 사용)
fio --name=random-rw --ioengine=libaio --iodepth=16 --rw=randrw     --bs=4k --size=1G --numjobs=4 --runtime=60 --group_reporting

네트워크 분석

# 연결 상태 확인
ss -tlnp  # TCP LISTEN 포트
ss -tanp  # 모든 TCP 연결
ss -s     # 요약 통계

# 연결 수 상위 IP
ss -tn | awk '{print }' | cut -d: -f1 | sort | uniq -c | sort -rn | head

# TIME_WAIT 연결 수
ss -tan state time-wait | wc -l

# 네트워크 처리량
nload eth0       # 실시간 대역폭
iftop -i eth0    # 연결별 트래픽

# 패킷 캡처
tcpdump -i eth0 -nn port 8080 -c 100

# HTTP 응답 시간 측정
curl -o /dev/null -s -w 'Total: %{time_total}s
' https://example.com

종합 모니터링 도구

# glances - Python 기반 모니터링
pip install glances
glances
# 웹 모드: glances -w (http://localhost:61208)

# dstat - vmstat/iostat/netstat 통합
dstat -cdnm --top-cpu --top-mem 5

Linux 성능 분석은 uptime으로 시작하여 점차 상세한 도구로 좁혀가는 것이 효과적이다. 일상적으로는 top/htop과 vmstat을 활용하고, 깊은 분석이 필요할 때 perf, strace 도구를 사용한다. 가장 중요한 것은 평소 시스템의 정상 수치를 알고 있어야 이상 상황을 빠르게 감지할 수 있다는 점이다.