GPU 모니터링 자동화 — 셸 스크립트 하나로 24/7 감시
GPU 서버를 운영하면서 "갑자기 느려졌는데 원인을 모르겠다"는 상황을 겪어보셨나요? nvidia-smi와 cron을 조합하면 셸 스크립트 하나로 GPU 상태를 24시간 기록하고, 이상 징후를 즉시 감지할 수 있습니다. Prometheus 같은 무거운 도구 없이 바로 시작하는 방법을 정리합니다. 서버가 늘어나면 Grafana + Prometheus 통합 모니터링 도 고려해 보세요.
5분
수집 간격
CSV
로그 포맷
24/7
무인 운영
~50줄
스크립트 크기
1nvidia-smi 기본 사용법
nvidia-smi는 NVIDIA 드라이버에 포함된 GPU 관리 도구입니다. 기본 실행만으로도 GPU 상태를 한눈에 볼 수 있지만, 모니터링 자동화에는 쿼리 모드가 핵심입니다.
# 기본 명령어
# GPU 상태 전체 조회 nvidia-smi # 특정 항목만 CSV로 출력 (핵심) nvidia-smi --query-gpu=timestamp,name,temperature.gpu,\ utilization.gpu,utilization.memory,memory.used,\ memory.total,power.draw --format=csv,noheader,nounits # 출력 예시: # 2026/02/24 14:30:05, NVIDIA RTX PRO 6000, 62, 87, 45, 38400, 98304, 285.32
| 쿼리 항목 | 설명 | 단위 |
|---|---|---|
| timestamp | 기록 시각 | YYYY/MM/DD HH:MM:SS |
| name | GPU 모델명 | 문자열 |
| temperature.gpu | GPU 코어 온도 | °C |
| utilization.gpu | GPU 연산 사용률 | % |
| utilization.memory | 메모리 컨트롤러 사용률 | % |
| memory.used | 사용 중인 VRAM | MiB |
| memory.total | 전체 VRAM | MiB |
| power.draw | 현재 소비 전력 | W |
--format 옵션이 핵심입니다
csv,noheader,nounits 조합을 사용하면 파싱하기 쉬운 깨끗한 CSV를 얻을 수 있습니다. 단위(°C, MiB 등)를 제거해야 후처리가 편합니다.
2모니터링 스크립트 작성
nvidia-smi 출력을 파일로 저장하는 셸 스크립트를 작성합니다. 날짜별로 로그 파일을 분리하고, 헤더를 자동으로 추가하는 로직이 포함되어 있습니다.
# gpu-monitor.sh
#!/bin/bash LOG_DIR="/var/log/gpu-monitor" DATE=$(date +%Y-%m-%d) LOG_FILE="$LOG_DIR/gpu_$DATE.csv" # 로그 디렉토리 생성 mkdir -p "$LOG_DIR" # 헤더가 없으면 추가 if [ ! -f "$LOG_FILE" ]; then echo "timestamp,gpu_name,temp_c,gpu_util,mem_util,\ mem_used_mib,mem_total_mib,power_w" > "$LOG_FILE" fi # GPU 데이터 수집 및 저장 nvidia-smi --query-gpu=timestamp,name,\ temperature.gpu,utilization.gpu,\ utilization.memory,memory.used,\ memory.total,power.draw \ --format=csv,noheader,nounits >> "$LOG_FILE" echo "[$(date)] GPU 로그 기록 완료"
# 실행 및 권한 설정
# 실행 권한 부여 chmod +x gpu-monitor.sh # 테스트 실행 ./gpu-monitor.sh # 로그 확인 cat /var/log/gpu-monitor/gpu_2026-02-24.csv
멀티 GPU 환경에서는
GPU가 여러 장일 경우 nvidia-smi가 자동으로 모든 GPU 데이터를 출력합니다. -i 옵션으로 특정 GPU만 모니터링할 수도 있습니다. (예: nvidia-smi -i 0)
3CSV 포맷 설계
잘 설계된 CSV 포맷은 나중에 분석할 때 큰 차이를 만듭니다. 어떤 항목을 수집하고, 어떤 형식으로 저장할지 미리 정해두는 게 좋습니다.
| 컬럼 | 타입 | 설명 | 활용 |
|---|---|---|---|
| timestamp | datetime | 수집 시각 | 시간대별 패턴 분석 |
| gpu_name | string | GPU 모델명 | 멀티 GPU 구분 |
| temp_c | int | GPU 온도 | 발열 추세 감지 |
| gpu_util | int | GPU 사용률 | 부하 패턴 분석 |
| mem_util | int | 메모리 사용률 | 메모리 병목 감지 |
| mem_used_mib | int | VRAM 사용량 | 모델 크기 추적 |
| mem_total_mib | int | 전체 VRAM | 잔여 용량 계산 |
| power_w | float | 소비 전력 | 전기료 추정 |
# 실제 CSV 출력 예시
timestamp,gpu_name,temp_c,gpu_util,mem_util,mem_used_mib,mem_total_mib,power_w 2026/02/24 14:30:05, NVIDIA RTX PRO 6000, 62, 87, 45, 38400, 98304, 285.32 2026/02/24 14:35:05, NVIDIA RTX PRO 6000, 64, 92, 48, 38400, 98304, 298.15 2026/02/24 14:40:05, NVIDIA RTX PRO 6000, 63, 85, 44, 38400, 98304, 280.47
날짜별 파일 분리를 권장합니다
하나의 파일에 계속 쌓으면 용량이 커져서 분석이 힘들어집니다. 날짜별로 분리하면 특정 날짜 데이터만 빠르게 조회할 수 있고, 오래된 파일을 자동 삭제하기도 편합니다.
4cron 스케줄링 설정
스크립트를 수동으로 실행하면 의미가 없습니다. cron에 등록해서 자동으로 5분마다 실행되게 설정합니다.
# cron 등록
# crontab 편집 crontab -e # 5분마다 GPU 모니터링 실행 */5 * * * * /opt/scripts/gpu-monitor.sh >> /var/log/gpu-monitor/cron.log 2>&1 # 1분마다 (더 정밀한 모니터링) */1 * * * * /opt/scripts/gpu-monitor.sh >> /var/log/gpu-monitor/cron.log 2>&1 # 등록 확인 crontab -l
| 수집 간격 | 일일 레코드 수 | 월간 CSV 크기 | 권장 용도 |
|---|---|---|---|
| 1분 | 1,440 | ~5MB | 실시간 디버깅 중 |
| 5분 | 288 | ~1MB | 일반 운영 (권장) |
| 15분 | 96 | ~350KB | 장기 추세 분석 |
| 1시간 | 24 | ~90KB | 최소 모니터링 |
5분 간격이 가장 실용적입니다
1분 간격은 디스크 부담이 크고, 15분은 급격한 변화를 놓칠 수 있습니다.5분 간격이면 대부분의 이상 패턴을 잡으면서도 저장 부담이 적습니다.GPU 1장 기준 월 1MB 수준이라 디스크 걱정도 없습니다.
5임계값 알림 설정
데이터를 쌓기만 하면 의미가 없습니다. 임계값을 넘으면 즉시 알림을 보내는 로직을 추가합니다.
# gpu-alert.sh - 임계값 알림 스크립트
#!/bin/bash
TEMP_THRESHOLD=85
UTIL_THRESHOLD=95
MEM_THRESHOLD=90
ALERT_LOG="/var/log/gpu-monitor/alerts.log"
# GPU 데이터 수집
DATA=$(nvidia-smi --query-gpu=temperature.gpu,\
utilization.gpu,utilization.memory \
--format=csv,noheader,nounits)
TEMP=$(echo "$DATA" | awk -F', ' '{print $1}')
GPU_UTIL=$(echo "$DATA" | awk -F', ' '{print $2}')
MEM_UTIL=$(echo "$DATA" | awk -F', ' '{print $3}')
ALERT=""
if [ "$TEMP" -ge "$TEMP_THRESHOLD" ]; then
ALERT+="[경고] GPU 온도 $TEMP°C (임계값: $TEMP_THRESHOLD°C)\n"
fi
if [ "$GPU_UTIL" -ge "$UTIL_THRESHOLD" ]; then
ALERT+="[경고] GPU 사용률 $GPU_UTIL% (임계값: $UTIL_THRESHOLD%)\n"
fi
if [ "$MEM_UTIL" -ge "$MEM_THRESHOLD" ]; then
ALERT+="[경고] VRAM 사용률 $MEM_UTIL% (임계값: $MEM_THRESHOLD%)\n"
fi
if [ -n "$ALERT" ]; then
echo -e "[$(date)] $ALERT" >> "$ALERT_LOG"
# 여기에 Slack/이메일 알림 추가 가능
fi| 모니터링 항목 | 주의 임계값 | 위험 임계값 | 대응 방안 |
|---|---|---|---|
| GPU 온도 | 80°C | 90°C | 쿨링 확인, 전력 제한 |
| GPU 사용률 | 95% | 100% 지속 | 작업 분산, 큐 조정 |
| VRAM 사용률 | 90% | 98%+ | 모델 크기 조정, 배치 축소 |
| 소비 전력 | TDP 90% | TDP 초과 | 전력 제한 설정 |
멀티 GPU 환경에서의 알림 스크립트
위 알림 스크립트는 단일 GPU 환경 기준입니다. GPU가 여러 장이면 nvidia-smi가 GPU당 한 줄씩 출력하므로,while read 루프로 각 줄을 순회하거나nvidia-smi -i 0, -i 1처럼 GPU 인덱스를 지정하여 개별 확인해야 합니다. 단일 GPU 스크립트를 멀티 GPU 서버에 그대로 적용하면 첫 번째 GPU만 모니터링되므로 주의하세요.
온도 90°C 이상은 즉각 대응하세요
GPU 온도가 90°C를 넘으면 쓰로틀링이 시작되어 성능이 급감합니다. 95°C 이상이 지속되면 하드웨어 수명에도 영향을 줍니다. 알림을 받으면 즉시 쿨링 환경을 점검하세요.
6로그 로테이션
로그를 계속 쌓기만 하면 디스크가 가득 찹니다. logrotate를 활용해 오래된 로그를 자동으로 압축하고 삭제합니다.
# /etc/logrotate.d/gpu-monitor
/var/log/gpu-monitor/gpu_*.csv {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 644 root root
}
# 설명:
# daily - 매일 로테이션
# rotate 30 - 최근 30일 보관
# compress - gzip 압축
# delaycompress - 하루 뒤 압축 (당일 로그는 압축 안 함)
# missingok - 파일 없어도 에러 안 냄# 또는 셸 스크립트로 직접 관리
#!/bin/bash # cleanup-gpu-logs.sh - 30일 이상 된 로그 삭제 LOG_DIR="/var/log/gpu-monitor" RETENTION_DAYS=30 find "$LOG_DIR" -name "gpu_*.csv" \ -mtime +$RETENTION_DAYS -delete echo "[$(date)] $RETENTION_DAYS일 이상 된 로그 삭제 완료"
저장 용량 계산 (GPU 1장 기준)
디스크 풀(full)은 서버를 멈춥니다
로그가 디스크를 가득 채우면 OS 자체가 멈출 수 있습니다. 특히 /var 파티션이 분리되지 않은 환경에서는 더 위험합니다. 로그 로테이션은 모니터링 자체보다 중요한 설정입니다.
이 글의 핵심 정리
- ✓nvidia-smi --query-gpu로 원하는 항목만 CSV 포맷으로 추출
- ✓셸 스크립트 ~50줄로 날짜별 로그 수집 자동화 구현
- ✓cron 5분 간격이 일반 운영에 가장 적합 — GPU 1장당 월 1MB 수준
- ✓임계값 알림으로 온도 85°C, 사용률 95% 초과 시 즉시 감지
- ✓logrotate로 30일 로테이션 — 디스크 풀 방지는 필수
함께 읽으면 좋은 글
본 글은 2026년 2월 기준으로 작성되었습니다. nvidia-smi의 쿼리 항목은 드라이버 버전에 따라 달라질 수 있으며, 스크립트는 환경에 맞게 수정이 필요할 수 있습니다. 임계값은 GPU 모델과 운영 환경에 따라 조정해야 합니다. 본 콘텐츠의 비상업적 공유는 자유이나, 상업적 이용 시 문의 페이지를 통해 연락 바랍니다.
댓글
(4개)로그인하면 댓글을 작성할 수 있습니다.
nvidia-smi 옵션이 이렇게 다양한 줄 몰랐습니다. --query-gpu 옵션으로 원하는 항목만 뽑는 게 깔끔하네요.
로그 로테이션을 logrotate로 연동하는 부분이 특히 좋습니다. 디스크가 가득 차서 서버가 멈춘 적이 있어서요.
Prometheus + Grafana 세팅이 부담스러운 소규모 환경에서는 이 방법이 최고입니다. CSV로 쌓아놓으면 나중에 분석도 편하고요.
관련 글
© 2026 TreeRU. All rights reserved.
본 콘텐츠의 저작권은 TreeRU에 있으며, 출처를 밝히지 않은 무단 전재 및 재배포를 금합니다. 인용 시 출처(treeru.com)를 반드시 명시해 주세요.