성능 모니터링
Linux 시스템 성능 측정, 모니터링, 튜닝의 완벽 가이드
Linux 시스템 성능 측정, 모니터링, 튜닝의 완벽 가이드
목표: 병목 현상을 식별하고, 데이터 기반으로 성능을 최적화할 수 있는 수준
📊 성능 지표 체계
USE 방법론 (Brendan Gregg)
| 지표 | 설명 | 측정 대상 |
|---|---|---|
| Utilization | 자원 사용률 | CPU, 메모리, 디스크, 네트워크 |
| Saturation | 포화도 | 대기 큐 길이 |
| Errors | 에러 | 에러 카운트 |
RED 방법론 (마이크로서비스)
| 지표 | 설명 |
|---|---|
| Rate | 요청률 (RPS) |
| Errors | 에러률 |
| Duration | 응답 시간 |
🖥️ CPU 성능
기본 모니터링
# 실시간
mpstat -P ALL 1 # 모든 코어 1초 간격
mpstat 1 10 # 1초 간격, 10회
# 요약
lscpu # CPU 정보
cat /proc/cpuinfo # 상세 정보
nproc # 코어 수
CPU 사용률 분석
# 사용자/시스템/IO-wait/idle 구분
sar -u 1 10
# 프로세스별 CPU
pidstat 1 # 1초 간격
pidstat -u 1 # CPU 통계
pidstat -t 1 # 스레드별
# 부하 평균
uptime
cat /proc/loadavg
부하 평균 해석:
load average: 0.52, 0.58, 0.59
│ │ └─ 15분 평균
│ └────── 5분 평균
└──────────── 1분 평균
# CPU 코어 수 대비
# 값 < 코어 수: 여유
# 값 ≈ 코어 수: 적정
# 값 > 코어 수: 과부하
CPU 프로파일링
# perf (Linux Performance Counter)
sudo perf top # 실시간 함수 사용률
sudo perf record -a -g -- sleep 30
sudo perf report
# flame graph 생성
git clone https://github.com/brendangregg/FlameGraph
cd FlameGraph
sudo perf record -F 99 -a -g -- sleep 60
sudo perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > cpu.svg
💾 메모리 성능
메모리 사용량
# 요약
free -h
vmstat 1 10
# 상세
cat /proc/meminfo
# 프로세스별
smem -r # RSS 기준
smem -u # 사용자별
smem -m # 매핑별
메모리 압력 (Pressure Stall Information)
# PSI 확인 (커널 4.20+)
cat /proc/pressure/memory
cat /proc/pressure/cpu
cat /proc/pressure/io
# 출력 예시
# some avg10=0.00 avg60=0.00 avg300=0.00 total=123456
# full avg10=0.00 avg60=0.00 avg300=0.00 total=789012
# some: 일부 작업이 지연됨
# full: 모든 작업이 지연됨
# avg10: 10초 평균 백분율
OOM (Out of Memory)
# OOM 로그
dmesg | grep -i "out of memory"
journalctl | grep -i "killed process"
# OOM 조정 (프로세스별)
cat /proc/PID/oom_score
cat /proc/PID/oom_adj
echo -1000 | sudo tee /proc/PID/oom_score_adj # OOM 방지
echo 1000 | sudo tee /proc/PID/oom_score_adj # OOM 우선
💿 디스크 I/O
I/O 모니터링
# iostat
iostat -xz 1 # 확장 통계, 1초 간격
# 주요 필드:
# await: 평균 I/O 대기시간 (< 10ms 양호)
# %util: 디스크 사용률 (< 70% 양호)
# svctm: 평균 서비스 시간
# iotop (프로세스별)
sudo iotop
sudo iotop -o # I/O 중인 프로세스만
# pidstat (프로세스별)
pidstat -d 1 # 1초 간격
I/O 스케줄러 튜닝
# 현재 스케줄러
cat /sys/block/sda/queue/scheduler
# [mq-deadline] kyber bfq none
# 스케줄러 변경
echo "kyber" | sudo tee /sys/block/sda/queue/scheduler
# 큐 깊이
cat /sys/block/sda/queue/nr_requests
# 읽기ahead
cat /sys/block/sda/queue/read_ahead_kb
파일시스템 성능
# 디렉토리 크기 (빠른)
du -sh /path
# 파일 수 (빠른)
find /path -type f | wc -l
# 파일시스템 단편화 (ext4)
sudo e4defrag /path
# XFS 유지보수
sudo xfs_fsr # 재배열
sudo xfs_db -c frag /dev/sda1 # 단편화 확인
🌐 네트워크 성능
기본 모니터링
# 인터페이스 통계
sar -n DEV 1 # 1초 간격
ip -s link show eth0
# 소켓 통계
ss -s
# TCP 연결 상태
ss -tan | awk '{print $1}' | sort | uniq -c
# 대역폭 모니터링
iftop
nload
네트워크 지연시간
# ping
ping -c 100 google.com
# traceroute
traceroute google.com
mtr --report google.com
# TCP 연결 시간
curl -o /dev/null -w "Connect: %{time_connect} TTFB: %{time_starttransfer} Total: %{time_total}\n" https://example.com
네트워크 튜닝
# TCP 버퍼 크기
cat /proc/sys/net/ipv4/tcp_rmem # 읽기: min default max
cat /proc/sys/net/ipv4/tcp_wmem # 쓰기: min default max
# 연결 추적 테이블
cat /proc/sys/net/netfilter/nf_conntrack_max
cat /proc/sys/net/netfilter/nf_conntrack_count
# 포트 범위
cat /proc/sys/net/ipv4/ip_local_port_range
🛠️ 벤치마크 도구
CPU 벤치마크
# sysbench
sysbench cpu --cpu-max-prime=20000 run
sysbench cpu --threads=4 --cpu-max-prime=20000 run
# stress-ng
stress-ng --cpu 4 --cpu-method=all --timeout=60s --metrics-brief
메모리 벤치마크
# sysbench
sysbench memory --memory-block-size=1K --memory-total-size=10G run
# stream
# 메모리 대역폭 측정
디스크 벤치마크
# fio (Flexible I/O Tester)
# 랜덤 읽기
cat > randread.fio <<EOF
[global]
ioengine=libaio
direct=1
bs=4k
numjobs=4
runtime=60
[randread]
filename=/dev/sda
rw=randread
EOF
sudo fio randread.fio
# 순차 쓰기
cat > seqwrite.fio <<EOF
[global]
ioengine=libaio
direct=1
bs=1M
numjobs=1
runtime=60
[seqwrite]
filename=/dev/sda
rw=write
EOF
sudo fio seqwrite.fio
네트워크 벤치마크
# iperf3
# 서버
iperf3 -s
# 클라이언트
iperf3 -c server_ip
iperf3 -c server_ip -t 30 -P 4 # 30초, 4개 연결
iperf3 -c server_ip -R # 역방향 테스트
📈 성능 데이터 수집
sar (System Activity Reporter)
# 설치
sudo apt-get install sysstat
# 데이터 수집 활성화
sudo sed -i 's/false/true/' /etc/default/sysstat
sudo systemctl enable sysstat
# CPU
sar -u 1 10 # 1초 간격, 10회
sar -u -f /var/log/sysstat/sa01 # 특정 날짜
# 메모리
sar -r 1 10
# 디스크
sar -d 1 10
# 네트워크
sar -n DEV 1 10
sar -n TCP,ETCP 1 10
# 전체
sar -A # 모든 통계
Prometheus + Grafana
# docker-compose.yml
version: '3'
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana
ports:
- "3000:3000"
node-exporter:
image: prom/node-exporter
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
🐛 성능 문제 해결 워크플로우
1단계: 빠른 진단
#!/bin/bash
# quick_diag.sh
echo "=== 시스템 요약 ==="
uptime
echo
echo "=== CPU ==="
mpstat -P ALL 1 1 | tail -n +4
echo
echo "=== 메모리 ==="
free -h
echo
echo "=== 디스크 ==="
iostat -xz 1 1 | tail -n +4
echo
echo "=== 네트워크 ==="
sar -n DEV 1 1 | tail -n +4
echo
echo "=== 상위 프로세스 ==="
ps aux --sort=-%cpu | head -5
ps aux --sort=-%mem | head -5
2단계: 심화 분석
# CPU 병목
perf top
perf record -a -g -- sleep 30
# 메모리 병목
vmstat 1 10
pidstat -r 1
# I/O 병목
iotop
blktrace -d /dev/sda
# 네트워크 병목
tcpdump -i eth0 -w capture.pcap
ss -tan state established '( dport = :443 )'
3단계: 해결 및 검증
# 변경 전 벤치마크
sysbench cpu run > before.txt
# 튜닝 적용
sudo sysctl -w vm.swappiness=10
# 변경 후 벤치마크
sysbench cpu run > after.txt
# 비교
diff before.txt after.txt
📋 성능 체크리스트
- CPU 사용률 및 부하 평균
- 메모리 사용량 및 압력
- 디스크 I/O 대기시간
- 네트워크 대역폭 및 지연시간
- 프로세스별 리소스 사용
- 시스템콜 및 컨텍스트 스위치
- 벤치마크 기준선 설정
- 모니터링 대시보드 구성
🔗 관련 노트
- 01-04-프로세스-관리 — 프로세스 모니터링
- 02-05-디스크-관리 — 디스크 I/O
- 02-04-네트워크-설정 — 네트워크 성능
- 03-00-Linux-내부동작-자가학습 — 커널 낮은 수준
- 성능-용량-산정 — 용량 계획
마지막 업데이트: 2026-06-01