월간 CPU 메모리 사용률 추출

  • 1st June 2026
  • 3 min read

유지보수 문서 작성할 때 매번 해야하니 정리해둔다.

sysstat 패키지 설치 및 서비스 활성화

 sar는 sysstat 패키지에 포함되어 있습니다. dnf 로 설치한다.

dnf install sysstat
systemctl enable sysstat
systemctl start sysstat   
                  

로그 보관기간 설정 

월간 리포트를 작성해야 한다면 31일 이상으로 늘려야 한다. 리포트 작성 기간에 맞추서 셋팅

vi /etc/sysconfig/sysstat
HISTORY=60

sar 동작확인

# 수동으로 즉시 수집
sudo /usr/lib64/sa/sa1 1 1

# 로그 파일 생성 확인

ls -l /var/log/sa/


# 오늘 CPU 사용률 확인

sar -u


# 오늘 메모리 사용률 확인

sar -r

리포트 확인 스크립트

#!/bin/bash

echo "========================================"
echo "       시스템 월간 리소스 리포트"
echo "========================================"

# ── 시스템 기본 정보 ──────────────────────────
echo ""
echo "[ 시스템 기본 정보 ]"
echo "----------------------------------------"

cpu_sockets=$(lscpu | grep "Socket(s)" | awk '{print $NF}')
cpu_cores=$(lscpu | grep "^Core(s) per socket" | awk '{print $NF}')
cpu_threads=$(lscpu | grep "^Thread(s) per core" | awk '{print $NF}')
cpu_model=$(lscpu | grep "Model name" | sed 's/Model name[[:space:]]*:[[:space:]]*//')
total_cores=$(($cpu_sockets * $cpu_cores))

echo "  CPU 모델       : $cpu_model"
echo "  물리 CPU(소켓) : ${cpu_sockets}개"
echo "  코어 수        : ${total_cores}개 (소켓당 ${cpu_cores}코어)"
echo "  스레드 수      : $(($total_cores * $cpu_threads))개 (코어당 ${cpu_threads}스레드)"

mem_total_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
mem_total_gb=$(echo "scale=1; $mem_total_kb / 1024 / 1024" | bc)
mem_total_mb=$(echo "scale=0; $mem_total_kb / 1024" | bc)

echo "  물리 메모리    : ${mem_total_gb}GB (${mem_total_mb}MB)"

# ── 월간 CPU 사용률 ───────────────────────────
echo ""
echo "[ 월간 CPU 사용률 ]"
echo "----------------------------------------"

total_idle=0
cpu_day_count=0

for i in {1..31}; do
    day=$(printf "%02d" $i)
    file="/var/log/sa/sa$day"
    if [ -f "$file" ]; then
        idle=$(sar -u -f "$file" | grep "Average" | awk '{print $NF}')
        if [[ $idle =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
            total_idle=$(echo "$total_idle + $idle" | bc)
            ((cpu_day_count++))
        fi
    fi
done

if [ $cpu_day_count -eq 0 ]; then
    echo "  수집된 sar CPU 로그가 없습니다."
else
    avg_idle=$(echo "scale=2; $total_idle / $cpu_day_count" | bc)
    avg_cpu=$(echo "scale=2; 100 - $avg_idle" | bc)
    echo "  📊 월간 평균 CPU 사용률: ${avg_cpu}%  (기준: ${cpu_day_count}일 데이터)"
fi

# ── 월간 메모리 사용률 ────────────────────────
echo ""
echo "[ 월간 메모리 사용률 ]"
echo "----------------------------------------"

total_memused=0
mem_day_count=0

for i in {1..31}; do
    day=$(printf "%02d" $i)
    file="/var/log/sa/sa$day"
    if [ -f "$file" ]; then
        memused=$(sar -r -f "$file" | grep "Average" | awk '{print $4}')
        if [[ $memused =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
            total_memused=$(echo "$total_memused + $memused" | bc)
            ((mem_day_count++))
        fi
    fi
done

if [ $mem_day_count -eq 0 ]; then
    echo "  수집된 sar 메모리 로그가 없습니다."
else
    avg_mem=$(echo "scale=2; $total_memused / $mem_day_count" | bc)
    echo "  📊 월간 평균 메모리 사용률: ${avg_mem}%  (기준: ${mem_day_count}일 데이터)"
fi

echo ""
echo "========================================"
echo "  리포트 생성 완료: $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"