성능 모니터링

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