Recent Posts
Recent Comments
Link
160x600
반응형
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

일상과 여행 사이, 작은 발견들을 기록합니다

Solaris mpstat 완전 가이드 - CPU 성능 분석의 핵심 본문

Oracle_Unix_Server

Solaris mpstat 완전 가이드 - CPU 성능 분석의 핵심

kerasi 2025. 9. 26. 15:30
728x90
반응형

Solaris mpstat 완전 가이드 - CPU 성능 분석의 핵심

📋 개요

mpstat는 Multi-Processor Statistics의 줄임말로, Solaris에서 CPU별 성능 통계를 제공하는 핵심 도구입니다. vmstat이 전체 시스템의 평균을 보여준다면, mpstat은 각 CPU 코어별로 상세한 정보를 제공합니다.

🔧 기본 사용법

기본 구문

mpstat [interval] [count]
mpstat [-aq] [interval [count]]

간단한 예시

# 현재 CPU 상태 1회 출력
mpstat

# 2초 간격으로 5번 출력
mpstat 2 5

# 모든 CPU에 대한 상세 정보
mpstat -a 1 3

📊 mpstat 출력 해석

기본 출력 형태

$ mpstat 2 3
CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
  0    0   0    0   516  274  562    7    1    1    0   887   12   5   0  83
  1    0   0    0   89   45   234    2    0    0    0   445    8   3   0  89
  2    0   0    0   102  58   198    1    0    1    0   321    5   2   0  93
  3    0   0    0   95   52   176    0    1    0    0   289    6   4   0  90

각 필드 상세 설명

필드 설명 단위 정상 범위

CPU CPU 번호 - 0부터 시작
minf Minor Page Faults 개/초 < 100
mjf Major Page Faults 개/초 0 (이상적)
xcal Cross Calls 개/초 < 50
intr Interrupts 개/초 100-2000
ithr Interrupt Threads 개/초 < intr
csw Context Switches 개/초 100-1000
icsw Involuntary Context Switches 개/초 < csw/2
migr Thread Migrations 개/초 < 10
smtx Spin Mutex Operations 개/초 < 50
srw Readers/Writer Locks 개/초 < 10
syscl System Calls 개/초 100-5000
usr User CPU Time % 가변
sys System CPU Time % < 30
wt Wait Time (I/O) % < 10
idl Idle Time % > 70 (정상)

🎯 주요 옵션들

-a 옵션: 모든 프로세서 표시

$ mpstat -a 2 3
CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
  0    1   0    2   645  356  723    9    2    3    0  1124   15   7   1  77
  1    0   0    1   112  67   289    3    1    1    0   578   10   4   0  86
  2    0   0    0   98   54   201    1    0    2    0   445    7   3   0  90
  3    1   0    1   104  61   185    2    1    0    0   398    9   5   0  85
all   0   0    1   240  135  350    4    1    2    0   636   10   5   0  85

특징:

  • 각 CPU별 상세 통계
  • 마지막에 전체 평균('all') 표시
  • CPU 불균형 확인 가능

-q 옵션: 큐 통계 표시

$ mpstat -q 2 3
CPU runq_sz %runocc swpq_sz %swpocc
  0      1.2      45      0.0       0
  1      0.8      32      0.0       0  
  2      0.5      18      0.0       0
  3      0.7      28      0.0       0

큐 통계 의미:

  • runq_sz: 평균 실행 대기열 크기
  • %runocc: 실행 대기열 점유율
  • swpq_sz: 평균 스왑 대기열 크기
  • %swpocc: 스왑 대기열 점유율

🔍 실제 시나리오 분석

시나리오 1: 균등한 부하 분산 (정상)

$ mpstat -a 1 5
CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
  0    1   0    1   234  128  445    5    1    2    0   678   25   8   2  65
  1    0   0    1   198  108  389    4    1    1    0   612   23   7   1  69
  2    1   0    0   212  115  421    6    2    2    0   645   26   9   1  64
  3    0   0    1   187  102  367    3    1    1    0   589   24   8   2  66
all   1   0    1   208  113  406    5    1    2    0   631   25   8   2  66

분석 포인트:

  • ✅ 모든 CPU의 사용률이 비슷함 (25% 내외)
  • ✅ 낮은 대기 시간 (wt 1-2%)
  • ✅ 적절한 컨텍스트 스위치 (400대)
  • ✅ 균등한 인터럽트 분산

시나리오 2: CPU 불균형 (문제 상황)

$ mpstat -a 1 5  
CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
  0   15   2   12  1890 1245 2344   45   15   23    5  3456   85  12   1   2
  1    1   0    0   145   78  234    2    1    1    0   445    8   3   0  89
  2    0   0    1   123   65  198    1    0    2    0   321    5   2   0  93
  3    1   0    0   134   71  189    1    1    0    0   298    6   4   0  90
all   4   1    3   573  365  741   12    4    7    1  1130   26   5   0  69

문제 분석:

  • ⚠️ CPU 0이 과부하 상태 (usr=85%, sys=12%)
  • ⚠️ CPU 0에 인터럽트 집중 (1890 vs 평균 145)
  • ⚠️ 높은 페이지 폴트 (minf=15, mjf=2)
  • ⚠️ 과다한 컨텍스트 스위치 (2344)

시나리오 3: I/O 대기 문제

$ mpstat -a 2 4
CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
  0    2   1    3   456  234  567    8    2    4    1   789   15  18  25  42
  1    1   0    2   389  198  489    6    1    3    0   678   12  16  28  44
  2    3   1    4   423  218  523    9    3    5    1   734   14  19  26  41
  3    1   0    2   367  187  445    5    1    2    0   645   13  17  27  43
all   2   1    3   409  209  506    7    2    4    1   712   14  18  27  43

I/O 병목 징후:

  • ⚠️ 높은 대기 시간 (wt 25-28%)
  • ⚠️ 낮은 유휴 시간 (idl 40%대)
  • ⚠️ 상대적으로 낮은 사용자 시간 (usr 12-15%)
  • 💡 해결: I/O 성능 개선 필요

💡 고급 분석 기법

CPU Affinity 확인

# 특정 프로세스가 어느 CPU를 사용하는지 확인
pbind -q [PID]

# 프로세스를 특정 CPU에 바인딩
pbind -b 2 [PID]  # CPU 2에 바인딩

# 바인딩 해제
pbind -u [PID]

인터럽트 분산 확인

# 인터럽트 분산 상태 확인
intrstat 1 5

# 네트워크 인터럽트 분산
dladm show-linkprop -p rxfanout

SMT (Simultaneous Multi-Threading) 상태 확인

# SMT 상태 확인
psrinfo -v | grep -E "Status|core"

# SMT 비활성화 (필요시)
psradm -f [cpu_id]

🛠️ 성능 최적화 전략

1. CPU 불균형 해결

인터럽트 분산 개선

# 네트워크 카드 인터럽트 분산 설정
# 예: 4개 CPU에 균등 분산
for i in 0 1 2 3; do
    echo "CPU $i 인터럽트 설정..."
    # 실제 설정은 하드웨어에 따라 다름
done

프로세스 CPU 바인딩

# 중요한 프로세스를 특정 CPU에 할당
# 예: 데이터베이스를 CPU 0-1에, 웹서버를 CPU 2-3에
pbind -b 0,1 $(pgrep oracle)
pbind -b 2,3 $(pgrep httpd)

2. 컨텍스트 스위치 최적화

프로세스 우선순위 조정

# CPU 집약적 작업의 우선순위 낮추기
renice +10 $(pgrep "batch_job")

# 중요한 서비스의 우선순위 높이기
renice -5 $(pgrep "critical_service")

스레드 풀 크기 조정

# Apache 워커 프로세스 수 최적화
# CPU 코어 수 × 2 정도가 일반적
cpu_count=$(psrinfo | wc -l)
recommended_workers=$((cpu_count * 2))
echo "Recommended Apache workers: $recommended_workers"

📋 간단한 모니터링 방법

CPU 불균형 감지

# 모든 CPU 사용률을 한눈에 확인
mpstat -a 1 1

# 80% 이상 사용하는 CPU 찾기  
mpstat -a 1 1 | awk '$12+$13>80 && $1!="CPU" && $1!="all" {print "CPU"$1" overloaded: "$12+$13"%"}'

# CPU별 사용률 차이 확인
mpstat -a 1 3 | grep -v CPU

CPU 성능 트렌드 관찰

# 10분간 30초 간격으로 모니터링
mpstat -a 30 20

# 특정 CPU만 관찰 (예: CPU 0)
mpstat 1 | awk '$1 == 0 || NR == 1'

# 전체 시스템 평균만 보기
mpstat -a 1 5 | grep "all"

인터럽트 분산 상태 확인

# 인터럽트 수가 높은 CPU 찾기
mpstat -a 1 1 | awk '$5>1000 && $1!="CPU" && $1!="all" {print "CPU"$1" high interrupts: "$5"/sec"}'

# 인터럽트 분산 상세 확인
intrstat 1 5

# 네트워크 인터럽트 확인
netstat -i

🎯 문제 해결 가이드

높은 시스템 시간 (sys > 30%)

원인 분석:

# 시스템 콜이 많은 프로세스 확인
dtrace -n 'syscall:::entry { @[execname] = count(); }'

# I/O 집약적 프로세스 확인
iosnoop -D

해결 방안:

  • I/O 성능 개선 (SSD, RAID 구성)
  • 시스템 콜 최적화 (애플리케이션 튜닝)
  • 버퍼 크기 조정

높은 컨텍스트 스위치 (csw > 2000)

원인 분석:

# 스레드가 많은 프로세스 확인
ps -eLo pid,nlwp,comm | sort -k2 -nr | head -10

# 스레드별 CPU 사용률
prstat -L 1 3

해결 방안:

  • 스레드 풀 크기 최적화
  • 프로세스 우선순위 조정
  • CPU 바인딩 적용

CPU 불균형 (특정 CPU > 80%)

즉시 조치:

# 과부하 CPU의 프로세스 확인
prstat -c 1 3  # CPU별 프로세스 확인

# 인터럽트 재분산
# (실제 명령은 하드웨어에 따라 다름)

장기 해결책:

  • 인터럽트 분산 설정
  • 애플리케이션 아키텍처 개선
  • 로드 밸런서 도입

📊 모니터링 베스트 프랙티스

일일 CPU 상태 점검

# 간단한 CPU 건강도 체크
mpstat -a 1 1 | awk '
/^[ ]*[0-9]+/ && $1 != "all" {
    cpu=$1; usr=$12; sys=$13; wt=$14; idl=$15
    
    total_util = usr + sys
    if(total_util > 80) status="HIGH"
    else if(total_util > 50) status="MEDIUM" 
    else status="LOW"
    
    if(wt > 10) io_status="HIGH_WAIT"
    else io_status="OK"
    
    printf "CPU%s: %s load (%.1f%%), I/O wait: %s (%.1f%%)\n", 
           cpu, status, total_util, io_status, wt
}'

주간 성능 리포트 생성

#!/bin/bash
# weekly_cpu_report.sh

generate_weekly_report() {
    local report_file="/var/log/cpu_weekly_$(date +%Y%m%d).log"
    
    {
        echo "=== Weekly CPU Performance Report ==="
        echo "Report Period: $(date -d '7 days ago' +%Y-%m-%d) to $(date +%Y-%m-%d)"
        echo ""
        
        echo "=== Current CPU Configuration ==="
        psrinfo -v | grep -E "Status|operates|core" | head -10
        echo ""
        
        echo "=== Average CPU Utilization (last 7 days) ==="
        # sar 데이터가 있다면 활용
        sar -u -f /var/adm/sa/sa* | grep "Average" | tail -7
        echo ""
        
        echo "=== Current CPU Balance ==="
        mpstat -a 1 1
        echo ""
        
        echo "=== Recommendations ==="
        echo "1. Monitor CPU balance daily"
        echo "2. Check interrupt distribution weekly"  
        echo "3. Review process CPU binding monthly"
        
    } > "$report_file"
    
    echo "Weekly CPU report saved: $report_file"
}

# 실행
generate_weekly_report

📝 정리 및 핵심 포인트

🎯 반드시 확인해야 할 지표들

  1. CPU 사용률 균형: 모든 CPU가 비슷한 부하를 가져야 함
  2. 대기 시간 (wt): 10% 미만 유지
  3. 컨텍스트 스위치: CPU당 1000 미만 권장
  4. 인터럽트 분산: 특정 CPU에 집중되지 않아야 함

💡 실무 활용 팁

# 📊 현재 CPU 상태 빠른 확인
mpstat -a 1 1

# 🔍 CPU 불균형 감지
mpstat -a 1 3 | awk '$1 != "CPU" && $1 != "all" && $12+$13 > 80 {print "CPU"$1" overloaded:"$12+$13"%"}'

# 📈 5분간 트렌드 관찰  
mpstat 30 10

# 🎯 특정 CPU만 모니터링 (예: CPU 0)
mpstat 1 | awk '$1 == 0'

🚨 주의해야 할 상황들

  • usr + sys > 90%: CPU 과부하
  • wt > 20%: I/O 병목
  • csw > 5000: 과도한 컨텍스트 스위치
  • mjf > 0: 메모리 부족으로 인한 스와핑
  • CPU간 사용률 차이 > 30%: 불균형 상태

mpstat은 CPU 성능 분석의 핵심 도구입니다. 정기적인 모니터링을 통해 시스템의 CPU 상태를 파악하고, 문제를 조기에 발견하여 대응하세요! 🚀

728x90