sunucu.com.tr
Linux Sunucular

GPU sunucu izleme: nvidia-smi ile sıcaklık, VRAM ve ECC hatası için Telegram uyarısı gönderen bash betiği

GPU sunucu izleme için nvidia-smi çıktısını okuyan bir bash betiği kurun. Betik sıcaklık, VRAM doluluğu, güç ve ECC hatalarını eşiklerle karşılaştırır, sorun olunca Telegram ve e-posta uyarısı gönderir, 5 dakikada bir systemd timer ile çalışır ve geçmişi CSV olarak saklar.

15 dk okuma

LLM servisi ya da model eğitimi çalışan bir makinede sorunlar genellikle sessiz başlar. Kart ısınınca saat hızı düşer, VRAM dolunca süreç "out of memory" ile kapanır, belleğe ECC hatası düşerse eğitim yarıda kalır. GPU sunucu izleme için ayrı bir izleme yığını kurmanız gerekmez. nvidia-smi çıktısını okuyan, eşik aşılınca Telegram ve e-postayla haber veren küçük bir bash betiği çoğu tek sunuculu kurulum için yeterlidir.

Yazı NVIDIA kartlı Linux sunucuyu kendisi yöneten sistem yöneticileri için hazırlandı. Sonunda 5 dakikada bir çalışan, aynı uyarıyı sürekli tekrarlamayan, sorun düzelince de bildirim gönderen ve geçmişi CSV olarak saklayan bir kurulumunuz olacak.

GPU sunucu izleme neden gerekli: ısınma, VRAM taşması ve ECC hataları

Bir GPU sunucusunda izlenmesi gereken dört temel durum vardır:

  • Sıcaklık: Kart, üreticinin belirlediği yavaşlama sıcaklığına yaklaşınca saat hızını düşürür. İş durmaz ama yavaşlar, bu yüzden fark edilmesi zordur. Kartınıza ait sınırları nvidia-smi -q -d TEMPERATURE komutuyla görebilirsiniz. Çıktıdaki "GPU Slowdown Temp" ve "GPU Shutdown Temp" satırları eşiğinizi belirlerken başvuracağınız değerlerdir.
  • VRAM doluluğu: Eğitimde batch boyutu ya da çıkarımda eşzamanlı istek sayısı arttığında bellek taşar ve süreç çöker. Hangi sürecin belleği tuttuğunu bilmek sorunu çözmenin yarısıdır.
  • Güç: Kart güç sınırına sürekli dayanıyorsa performans o sınırla kısıtlanır. Bilgi amaçlı izlenir, çoğu zaman alarm gerektirmez.
  • ECC hataları: Veri merkezi kartlarında bellek hataları sayılır. Düzeltilen (corrected) hatalar tek başına sorun değildir. Düzeltilemeyen (uncorrected) hata ise sürecin çökmesine ve sonucun bozulmasına yol açabilir. Bu durum her zaman uyarı gerektirir.

Bunlara bir beşinci kontrol daha eklemek iyi olur: kartın sistemden kaybolması. Sürücü ya da donanım sorunu yüzünden nvidia-smi bir kartı listelemiyorsa, betik beklenen kart sayısıyla görüneni karşılaştırıp sizi uyarmalıdır.

Ön koşullar

  • NVIDIA sürücüsü kurulu ve nvidia-smi çalışıyor olmalı. Kurulum adımları için GPU sunucu kurulumu rehberine bakabilirsiniz.
  • curl paketi gerekir. E-posta gönderecekseniz mail komutu (mailutils ya da s-nail) ve çalışan bir MTA ya da SMTP aktarıcısı da gerekir.
  • Root ya da sudo yetkisi.
  • Bir Telegram botu. BotFather üzerinden bot oluşturun ve verilen token'ı not alın.

Sohbet kimliğini (chat_id) bulmak için önce botunuza Telegram'dan bir mesaj yazın, sonra aşağıdaki komutu çalıştırın. ORNEK_BOT_TOKEN yerine kendi token'ınızı yazın. Komut, Bot API'nin getUpdates yöntemini çağırır ve sohbet kimliğini ekrana yazar. Sistemde hiçbir şeyi değiştirmez.

bash
# Botun aldığı son mesajlardan chat id değerini çıkarır.
# --proto-default https: adres şemasız verildiği için https ile tamamlanır.
TOKEN="ORNEK_BOT_TOKEN"
curl -s --proto-default https "api.telegram.org/bot${TOKEN}/getUpdates" \
  | grep -o '"chat":{"id":-\?[0-9]*' | head -n 1

Çıktıdaki sayı sizin TELEGRAM_CHAT_ID değerinizdir. Grup sohbetlerinde bu değer eksi işaretiyle başlar. getUpdates ve sendMessage yöntemlerinin parametreleri Telegram'ın resmi Bot API belgesinde anlatılır.

nvidia-smi --query-gpu ile betikte kullanılacak alanlar

nvidia-smi insan okuması için tablo üretir. Betikte bu tabloyu ayrıştırmaya çalışmak yerine --query-gpu ile alanları tek tek isteyip CSV olarak almak gerekir. --format=csv,noheader,nounits seçeneği başlık satırını ve birimleri (MiB, W, %) kaldırır. Böylece her satır bir kartı, her sütun bir sayıyı gösterir.

Betikte kullanılan alanlar:

Alan Anlamı
index, uuid, name Kart sırası, kalıcı kimliği ve modeli
temperature.gpu Çekirdek sıcaklığı (°C)
memory.used, memory.total Kullanılan ve toplam VRAM (MiB)
utilization.gpu Son örnekleme aralığındaki hesaplama kullanımı (%)
power.draw, power.limit Anlık güç çekişi ve güç sınırı (W)
ecc.errors.uncorrected.volatile.total Son açılıştan bu yana düzeltilemeyen ECC hatası
ecc.errors.corrected.volatile.total Son açılıştan bu yana düzeltilen ECC hatası

Alan adları sürücü sürümüne göre değişebilir. Kurulu sürücünüzün kabul ettiği alanların tam listesini şu komutla alın:

bash
# Kurulu sürücünün desteklediği tüm sorgu alanlarını listeler
nvidia-smi --help-query-gpu | less
# Betiğin kullanacağı sorguyu elle deneyin
nvidia-smi --query-gpu=index,name,temperature.gpu,memory.used,memory.total,power.draw,ecc.errors.uncorrected.volatile.total --format=csv,noheader,nounits

Her kart için virgülle ayrılmış tek satır görmelisiniz. Bir alan için [N/A] ya da [Not Supported] dönüyorsa o kart o değeri raporlamıyor demektir. Örneğin ECC olmayan masaüstü kartlarında durum budur. Betik bu değerleri boş sayar ve o kontrolü atlar. Alanların resmi tanımları NVIDIA nvidia-smi belgesinde bulunur.

Bash betiği: sıcaklık, VRAM yüzdesi, güç ve ECC eşik kontrolü

Betik Ubuntu 24.04 ve Debian 12 için hazırlandı. Bash, curl ve awk bulunan RHEL tabanlı dağıtımlarda da aynı şekilde çalışması beklenir. Betik şunları yapar:

  1. /etc/gpu-izle.conf dosyasından eşikleri ve Telegram bilgilerini okur.
  2. nvidia-smi çalışmazsa ya da beklenen kart sayısı görünmezse uyarı gönderir.
  3. Her kart için bir CSV satırı yazar ve dört eşiği kontrol eder.
  4. Aynı sorun sürerken uyarıyı yalnız TEKRAR_DK dakikada bir yineler. Sorun ortadan kalkınca "DÜZELDİ" bildirimi gönderir.
  5. VRAM uyarısının içine, o kartta bellek tutan süreçlerin PID, kullanıcı ve bellek miktarını ekler.

Betik sistemde yalnız şunları oluşturur: /var/lib/gpu-izle altındaki durum dosyalarını ve /var/log/gpu-izle/gecmis.csv dosyasını. Geri almak için bu iki dizini ve betik dosyasını silmeniz yeterlidir. Kaldırma adımları aşağıdaki kurulum bölümünde ayrıca verilmiştir.

/usr/local/sbin/gpu-izle.sh olarak kaydedin:

bash
#!/usr/bin/env bash
# /usr/local/sbin/gpu-izle.sh
# nvidia-smi ile GPU sıcaklık, VRAM, güç ve ECC kontrolü yapar.
# Eşik aşılınca Telegram ve/veya e-posta uyarısı gönderir, geçmişi CSV'ye yazar.
# Kullanım:  gpu-izle.sh          -> normal kontrol (systemd timer bunu çağırır)
#            gpu-izle.sh --test   -> yalnız deneme mesajı gönderir
# Not: set -e bilinçli olarak kullanılmadı; bir kartta hata olsa da diğerleri kontrol edilsin.
set -uo pipefail

# ---- Varsayılan ayarlar (yapılandırma dosyası bunları ezer) ----
SICAKLIK_ESIK=83            # °C. Kartınızın "GPU Slowdown Temp" değerinin birkaç derece altına çekin
VRAM_ESIK=95                # VRAM doluluk yüzdesi. 0 = kontrol kapalı
GUC_ESIK=0                  # power.draw / power.limit yüzdesi. 0 = kontrol kapalı
ECC_DUZELTILEMEYEN_ESIK=0   # Bu sayının ÜSTÜ uyarı verir (0 => ilk hatada uyarı)
BEKLENEN_GPU=0              # Sunucudaki kart sayısı. 0 = kontrol etme
TEKRAR_DK=60                # Sorun sürerken uyarı kaç dakikada bir yinelensin
TELEGRAM_BOT_TOKEN=""
TELEGRAM_CHAT_ID=""
TG_API_HOST="api.telegram.org"
MAIL_TO=""
DURUM_DIZINI="/var/lib/gpu-izle"
CSV_DOSYA="/var/log/gpu-izle/gecmis.csv"

# Test için farklı bir yapılandırma dosyası verilebilir
CONF="${GPU_IZLE_CONF:-/etc/gpu-izle.conf}"
# shellcheck source=/dev/null
[ -r "$CONF" ] && . "$CONF"

HOST="$(hostname -f 2>/dev/null || hostname)"
ZAMAN="$(date '+%Y-%m-%d %H:%M:%S')"
mkdir -p "$DURUM_DIZINI" "$(dirname "$CSV_DOSYA")"

# ---- Yardımcı işlevler ----
# Baştaki ve sondaki boşlukları kırpar
kirp() { local v="$1"; v="${v#"${v%%[![:space:]]*}"}"; v="${v%"${v##*[![:space:]]}"}"; printf '%s' "$v"; }

# Değer sayı değilse ([N/A], [Not Supported] gibi) boş döndürür
sayi() { local v; v="$(kirp "$1")"; [[ "$v" =~ ^[0-9]+([.][0-9]+)?$ ]] && printf '%s' "$v"; return 0; }

# Ondalıklı karşılaştırma: A > B ise başarı (0) döner
buyuk() { awk -v a="$1" -v b="$2" 'BEGIN{ exit !(a > b) }'; }

# Mesajı Telegram'a, e-postaya ve sistem günlüğüne gönderir
gonder() {
  local mesaj="[$HOST] $1"
  if [ -n "$TELEGRAM_BOT_TOKEN" ] && [ -n "$TELEGRAM_CHAT_ID" ]; then
    # --proto-default https: şemasız verilen adres https ile tamamlanır
    curl -fsS --max-time 15 --proto-default https \
      "${TG_API_HOST}/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
      --data-urlencode "chat_id=${TELEGRAM_CHAT_ID}" \
      --data-urlencode "text=${mesaj}" >/dev/null \
      || logger -t gpu-izle "Telegram gönderimi başarısız"
  fi
  if [ -n "$MAIL_TO" ] && command -v mail >/dev/null 2>&1; then
    printf '%s\n' "$mesaj" | mail -s "GPU uyarısı: $HOST" "$MAIL_TO" \
      || logger -t gpu-izle "E-posta gönderimi başarısız"
  fi
  logger -t gpu-izle "$mesaj"
}

# Uyarı gönderir ama aynı anahtar için TEKRAR_DK dolmadan yinelemez
uyar() {
  local dosya="$DURUM_DIZINI/$1"
  if [ -f "$dosya" ] && [ -z "$(find "$dosya" -mmin +"$TEKRAR_DK" 2>/dev/null)" ]; then
    return 0
  fi
  gonder "UYARI: $2"
  touch "$dosya"
}

# Daha önce uyarı verilmiş bir sorun düzeldiyse bildirir ve durum dosyasını kaldırır
duzeldi() {
  local dosya="$DURUM_DIZINI/$1"
  if [ -f "$dosya" ]; then
    gonder "DÜZELDİ: $2"
    rm -f -- "$dosya"
  fi
}

# Verilen UUID'li kartta bellek tutan süreçleri listeler
surecler() {
  local hedef="$1" u pid ad bellek kul
  nvidia-smi --query-compute-apps=gpu_uuid,pid,process_name,used_memory \
    --format=csv,noheader,nounits 2>/dev/null |
  while IFS=',' read -r u pid ad bellek; do
    [ "$(kirp "$u")" = "$hedef" ] || continue
    pid="$(kirp "$pid")"
    kul="$(ps -o user= -p "$pid" 2>/dev/null | tr -d ' ')"
    printf '  PID %s (%s) %s: %s MiB\n' "$pid" "${kul:-?}" "$(kirp "$ad")" "$(kirp "$bellek")"
  done
}

# ---- Deneme kipi ----
if [ "${1:-}" = "--test" ]; then
  gonder "Deneme mesajı: gpu-izle çalışıyor ($ZAMAN)"
  exit 0
fi

# ---- nvidia-smi erişilebilir mi? ----
ALANLAR="index,uuid,name,temperature.gpu,memory.used,memory.total,utilization.gpu,power.draw,power.limit,ecc.errors.uncorrected.volatile.total,ecc.errors.corrected.volatile.total"

if ! command -v nvidia-smi >/dev/null 2>&1; then
  uyar "nvidia_smi" "nvidia-smi bulunamadı (sürücü kaldırılmış olabilir)"
  exit 1
fi
if ! CIKTI="$(timeout 60 nvidia-smi --query-gpu="$ALANLAR" --format=csv,noheader,nounits 2>&1)"; then
  uyar "nvidia_smi" "nvidia-smi hata verdi: $(printf '%s' "$CIKTI" | head -n 2)"
  exit 1
fi
duzeldi "nvidia_smi" "nvidia-smi yeniden yanıt veriyor"

# ---- Kart sayısı kontrolü ----
GPU_SAYISI="$(printf '%s\n' "$CIKTI" | grep -c .)"
if [ "$BEKLENEN_GPU" -gt 0 ]; then
  if [ "$GPU_SAYISI" -lt "$BEKLENEN_GPU" ]; then
    uyar "gpu_sayisi" "Beklenen $BEKLENEN_GPU kart, görünen $GPU_SAYISI kart"
  else
    duzeldi "gpu_sayisi" "Tüm kartlar görünüyor ($GPU_SAYISI)"
  fi
fi

# ---- CSV başlığı (dosya yoksa ya da boşsa) ----
[ -s "$CSV_DOSYA" ] || echo "zaman,gpu,sicaklik_c,vram_kullanilan_mib,vram_toplam_mib,vram_yuzde,kullanim_yuzde,guc_w,guc_limit_w,ecc_duzeltilemeyen,ecc_duzeltilen" > "$CSV_DOSYA"

# ---- Kart başına kontrol ----
while IFS=',' read -r idx uuid ad sic vkul vtop kull guc glim eccu eccc; do
  idx="$(kirp "$idx")"; uuid="$(kirp "$uuid")"; ad="$(kirp "$ad")"
  sic="$(sayi "$sic")";  vkul="$(sayi "$vkul")"; vtop="$(sayi "$vtop")"
  kull="$(sayi "$kull")"; guc="$(sayi "$guc")";  glim="$(sayi "$glim")"
  eccu="$(sayi "$eccu")"; eccc="$(sayi "$eccc")"

  vyuz=""
  if [ -n "$vkul" ] && [ -n "$vtop" ] && [ "${vtop%.*}" -gt 0 ]; then
    vyuz=$(( ${vkul%.*} * 100 / ${vtop%.*} ))
  fi

  echo "$ZAMAN,$idx,$sic,$vkul,$vtop,$vyuz,$kull,$guc,$glim,$eccu,$eccc" >> "$CSV_DOSYA"
  etiket="GPU$idx ($ad)"

  # Sıcaklık
  if [ -n "$sic" ]; then
    if buyuk "$sic" "$SICAKLIK_ESIK"; then
      uyar "gpu${idx}_sicaklik" "$etiket sıcaklık ${sic}°C (eşik ${SICAKLIK_ESIK}°C)"
    else
      duzeldi "gpu${idx}_sicaklik" "$etiket sıcaklık ${sic}°C"
    fi
  fi

  # VRAM doluluğu
  if [ "$VRAM_ESIK" -gt 0 ] && [ -n "$vyuz" ]; then
    if [ "$vyuz" -ge "$VRAM_ESIK" ]; then
      uyar "gpu${idx}_vram" "$etiket VRAM %${vyuz} (${vkul}/${vtop} MiB)
$(surecler "$uuid")"
    else
      duzeldi "gpu${idx}_vram" "$etiket VRAM %${vyuz}"
    fi
  fi

  # Güç sınırına yakınlık
  if [ "$GUC_ESIK" -gt 0 ] && [ -n "$guc" ] && [ -n "$glim" ]; then
    gyuz="$(awk -v a="$guc" -v b="$glim" 'BEGIN{ if (b > 0) printf "%d", a*100/b; else print 0 }')"
    if [ "$gyuz" -ge "$GUC_ESIK" ]; then
      uyar "gpu${idx}_guc" "$etiket güç ${guc} W / ${glim} W (%${gyuz})"
    else
      duzeldi "gpu${idx}_guc" "$etiket güç %${gyuz}"
    fi
  fi

  # Düzeltilemeyen ECC hatası
  if [ -n "$eccu" ]; then
    if buyuk "$eccu" "$ECC_DUZELTILEMEYEN_ESIK"; then
      uyar "gpu${idx}_ecc" "$etiket düzeltilemeyen ECC hatası: $eccu (düzeltilen: ${eccc:-N/A})"
    else
      duzeldi "gpu${idx}_ecc" "$etiket ECC sayacı sıfırlandı"
    fi
  fi
done <<< "$CIKTI"

exit 0

Eşikleri nasıl seçmelisiniz

  • Sıcaklık: nvidia-smi -q -d TEMPERATURE çıktısındaki "GPU Slowdown Temp" değerini bulun ve eşiği bunun birkaç derece altına koyun. Bu satır yerine "GPU Max Operating Temp" görüyorsanız onu esas alın. Betikteki 83 sadece başlangıç değeridir.
  • VRAM: vLLM gibi çıkarım sunucuları açılışta VRAM'in büyük bölümünü önceden ayırır. vLLM'de gpu_memory_utilization için varsayılan değer 0,9'dur. Böyle bir sunucuda %90 doluluk normaldir ve %95 eşiği gereksiz uyarı üretebilir. Bu durumda eşiği 98 ya da 99'a çekin veya VRAM_ESIK=0 ile kontrolü kapatın. Eğitim yapılan sunucularda ise %95 uyarısı, OOM hatasından önce müdahale etmeniz için zaman kazandırır.
  • Güç: Tam yükle eğitim yapan bir kartın güç sınırına dayanması beklenen bir durumdur. Bu yüzden kontrol varsayılan olarak kapalıdır. Kartlarınızın sınırlandırılıp sınırlandırılmadığını öğrenmek istediğinizde açın.
  • ECC: Düzeltilemeyen hata için sıfır tolerans uygulamak doğru yaklaşımdır. Volatile sayaç yeniden başlatmaya ya da sürücünün yeniden yüklenmesine kadar sıfırlanmaz. Bu yüzden uyarı her TEKRAR_DK dakikada bir gelmeye devam eder ve konu unutulmaz.

Telegram ve e-posta ile uyarı gönderme

Telegram bilgileri ve eşikler, betiğin içine değil ayrı bir yapılandırma dosyasına yazılır. Böylece betiği güncellerken ayarlarınız silinmez. Token bu dosyada durduğu için dosyayı yalnız root okuyabilmelidir. Aşağıdaki kurulum bloğu dosyayı 600 izniyle oluşturur.

E-posta için MAIL_TO değişkenini doldurmanız yeterlidir. Ancak sunucuda e-posta gönderebilen bir yapılandırma olmalıdır. Örneğin mailutils ile birlikte Postfix ya da harici bir SMTP'ye aktaran msmtp kullanılabilir. Telegram ve e-posta birlikte de tanımlanabilir. Biri başarısız olursa diğeri yine gönderilir ve hata logger ile sistem günlüğüne yazılır.

Disk doluluğu için aynı yapıyı kullanmak isterseniz Linux disk doluluk uyarısı betiği aynı Telegram ve timer düzeniyle çalışır. İki betik aynı botu ve aynı sohbeti paylaşabilir.

systemd timer ile 5 dakikada bir çalıştırma ve CSV geçmiş kaydı

Aşağıdaki kurulum betiği Ubuntu 24.04 ve Debian 12 için hazırlandı. Tekrar çalıştırılabilir. Yapılandırma dosyası zaten varsa üzerine yazmaz. Servis ve timer dosyalarını oluşturur, CSV için aylık logrotate kuralı ekler ve timer'ı başlatır. Servis flock ile çalıştırılır, böylece nvidia-smi takılsa bile iki kopya üst üste binmez.

bash
#!/usr/bin/env bash
# gpu-izle kurulumu: yapılandırma, systemd servis/timer ve logrotate kuralı
set -euo pipefail

# 1) Betiğe çalıştırma izni ver (dosyayı önceden /usr/local/sbin/gpu-izle.sh olarak kaydetmiş olun)
sudo chmod 750 /usr/local/sbin/gpu-izle.sh

# 2) Yapılandırma dosyası: yalnız yoksa oluştur, varsa dokunma
if [ ! -f /etc/gpu-izle.conf ]; then
  sudo install -m 600 -o root -g root /dev/null /etc/gpu-izle.conf
  sudo tee /etc/gpu-izle.conf >/dev/null <<'EOF'
# gpu-izle ayarları
TELEGRAM_BOT_TOKEN="ORNEK_BOT_TOKEN"
TELEGRAM_CHAT_ID="ORNEK_CHAT_ID"
MAIL_TO=""                 # ör. ops@example.com, boş bırakılırsa e-posta gönderilmez
SICAKLIK_ESIK=83
VRAM_ESIK=95
GUC_ESIK=0
ECC_DUZELTILEMEYEN_ESIK=0
BEKLENEN_GPU=0             # sunucudaki kart sayısını yazın, ör. 8
TEKRAR_DK=60
EOF
fi

# 3) systemd servis birimi
sudo tee /etc/systemd/system/gpu-izle.service >/dev/null <<'EOF'
[Unit]
Description=GPU izleme (nvidia-smi eşik kontrolü)
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/flock -n /run/gpu-izle.lock /usr/local/sbin/gpu-izle.sh
Nice=10
EOF

# 4) systemd timer birimi: açılıştan 2 dk sonra, ardından 5 dakikada bir
sudo tee /etc/systemd/system/gpu-izle.timer >/dev/null <<'EOF'
[Unit]
Description=GPU izleme 5 dakikada bir

[Timer]
OnBootSec=2min
OnCalendar=*:0/5
AccuracySec=30s

[Install]
WantedBy=timers.target
EOF

# 5) CSV geçmişi için aylık döndürme, 12 ay sakla
sudo tee /etc/logrotate.d/gpu-izle >/dev/null <<'EOF'
/var/log/gpu-izle/gecmis.csv {
    monthly
    rotate 12
    compress
    missingok
    notifempty
}
EOF

# 6) Birimleri yükle ve timer'ı başlat
sudo systemctl daemon-reload
sudo systemctl enable --now gpu-izle.timer

Kurulumdan sonra /etc/gpu-izle.conf dosyasındaki ORNEK_BOT_TOKEN ve ORNEK_CHAT_ID değerlerini kendi bilgilerinizle değiştirin. Logrotate dosyayı döndürdükten sonra betik ilk çalışmada yeni dosyayı başlık satırıyla oluşturur.

Kaldırmak için şunları çalıştırın:

bash
# gpu-izle'yi devre dışı bırakır ve yalnız kendi oluşturduğu dosyaları kaldırır
sudo systemctl disable --now gpu-izle.timer
sudo rm -f /etc/systemd/system/gpu-izle.service /etc/systemd/system/gpu-izle.timer \
           /etc/logrotate.d/gpu-izle /usr/local/sbin/gpu-izle.sh
sudo systemctl daemon-reload
# İsterseniz CSV geçmişini önce yedekleyin, sonra durum ve günlük dizinlerini kaldırın
sudo cp -a /var/log/gpu-izle /root/gpu-izle-gecmis-yedek
sudo rm -rf /var/lib/gpu-izle /var/log/gpu-izle

Timer söz dizimi ve OnCalendar ifadelerinin ayrıntıları için sunucuda man systemd.timer ve man systemd.time sayfalarına bakabilirsiniz. Bir ifadenin ne zaman tetikleneceğini systemd-analyze calendar '*:0/5' komutuyla da önceden görebilirsiniz.

Hangi süreç GPU'yu tutuyor: query-compute-apps ile rapor

VRAM uyarısı geldiğinde ilk sorulacak soru hangi sürecin belleği tuttuğudur. Betik bunu uyarı mesajına otomatik olarak ekler. Aynı bilgiyi elle de alabilirsiniz:

bash
# Kart UUID'si ile kart sırasını eşleştir
nvidia-smi --query-gpu=index,uuid --format=csv,noheader
# Bellek tutan hesaplama süreçleri: kart UUID, PID, süreç adı, kullanılan MiB
nvidia-smi --query-compute-apps=gpu_uuid,pid,process_name,used_memory --format=csv,noheader,nounits
# Bir PID'in sahibi, çalışma süresi ve tam komut satırı
ps -o user=,etime=,args= -p 12345   # 12345 yerine yukarıdaki PID'i yazın

Konteyner içinde çalışan süreçler için önemli bir ayrıntı var. Betiği her zaman ana makinede çalıştırın. Konteyner içinden çalıştırılan nvidia-smi süreç listesini boş ya da eksik gösterebilir. Ana makinede görünen PID'in hangi konteynere ait olduğunu bulmak için cat /proc/12345/cgroup çıktısındaki konteyner kimliğine bakabilirsiniz.

Doğrulama

Kurulumu dört adımda kontrol edin:

bash
# 1) Deneme mesajı: Telegram'a "Deneme mesajı" düşmeli
sudo /usr/local/sbin/gpu-izle.sh --test

# 2) Timer kayıtlı mı ve bir sonraki çalışma ne zaman?
systemctl list-timers gpu-izle.timer

# 3) Son çalışmaların günlüğü ve CSV geçmişi
journalctl -u gpu-izle.service -n 20 --no-pager
tail -n 5 /var/log/gpu-izle/gecmis.csv

# 4) Yapay alarm: sıcaklık eşiği 1 °C olan geçici bir yapılandırmayla UYARI üret,
#    ardından gerçek ayarlarla çalıştırıp DÜZELDİ mesajını gör
sudo cp /etc/gpu-izle.conf /root/gpu-izle-test.conf
echo 'SICAKLIK_ESIK=1' | sudo tee -a /root/gpu-izle-test.conf >/dev/null
sudo env GPU_IZLE_CONF=/root/gpu-izle-test.conf /usr/local/sbin/gpu-izle.sh
sudo /usr/local/sbin/gpu-izle.sh
sudo rm -f /root/gpu-izle-test.conf

Dördüncü adımda önce her kart için bir "UYARI: GPUx ... sıcaklık" mesajı, ardından "DÜZELDİ" mesajı gelmelidir. list-timers çıktısında NEXT sütunu en fazla 5 dakika sonrasını göstermelidir. CSV dosyasında her çalışma için kart sayısı kadar satır bulunmalıdır.

ECC tarafında ayrıca kontrol etmeniz gereken iki kaynak vardır. Veri merkezi kartlarında nvidia-smi -q -d ROW_REMAPPER komutu, bellek satırı yeniden eşlemesinin bekleyip beklemediğini ve başarısız olup olmadığını gösterir. Bekleyen bir eşleme varsa kartın sıfırlanması ya da sunucunun yeniden başlatılması gerekir. Çekirdek günlüğündeki NVIDIA Xid kayıtlarını da journalctl -k | grep -i xid ile görebilirsiniz.

Sık yapılan hatalar

N/A dönen alanlar. Bazı kartlar ECC ya da güç değerlerini raporlamaz. MIG kipindeki kartlarda bellek değerleri de beklediğiniz gibi gelmeyebilir. Betik sayı olmayan değerleri boş kabul eder ve o kontrolü atlar. Yine de CSV'de bir sütun sürekli boş kalıyorsa, o kontrolün sizin kartınızda çalışmadığını bilin ve buna güvenmeyin.

Sürücü güncellemesi sonrası bozulan betik. Paket yöneticisi sürücüyü güncelleyip makine yeniden başlatılmadığında nvidia-smi genellikle "Failed to initialize NVML: Driver/library version mismatch" hatası verir. Betik bunu "nvidia-smi hata verdi" uyarısıyla bildirir. Çözüm, uygun bir bakım penceresinde yeniden başlatmaktır. Sürücüyü sabitlemek için apt-mark hold kullanabilirsiniz. Bu konu kurulum rehberinde de anlatılır.

Değişen alan adları. Yeni sürücüler bazı alanları yeniden adlandırabilir ya da yeni alanlar ekleyebilir. Örneğin saat kısıtlama nedenleri yeni sürümlerde clocks_event_reasons adıyla da geçer. Sorguda geçersiz bir alan olursa nvidia-smi hiçbir kart için çıktı vermez ve betik hata uyarısı gönderir. Her sürücü güncellemesinden sonra --help-query-gpu ile alanları kontrol edin.

Yavaş nvidia-smi. Persistence mode kapalıysa her çağrıda sürücü yeniden başlatılır ve sorgu saniyeler sürebilir. nvidia-persistenced servisinin çalıştığını systemctl status nvidia-persistenced ile doğrulayın.

Uyarı yağmuru. Durum dizini silinirse ya da TEKRAR_DK çok küçük seçilirse aynı uyarı her 5 dakikada bir gelir. Bu gereksiz uyarılar zamanla göz ardı edilmeye başlar. Gerçek bir sorunun kaçırılmaması için tekrar süresini 60 dakika civarında tutun.

Token'ı betiğe gömmek. Token betiğin içine yazılırsa, betiği kopyalayan ya da bir depoya gönderen herkes botunuzu kullanabilir. Token yalnız 600 izinli yapılandırma dosyasında durmalıdır.

Sık sorulan sorular

5 dakikalık aralık yeterli mi, daha sık çalıştırmalı mıyım?

Sıcaklık ve ECC sorunları için 5 dakika çoğu durumda yeterlidir, çünkü bu sorunlar dakikalar içinde gelişir. Ani VRAM sıçramalarını yakalamak istiyorsanız OnCalendar=*:0/1 ile her dakika çalıştırabilirsiniz. Saniye düzeyinde çözünürlük gerekiyorsa betik doğru araç değildir. Bu durumda NVIDIA DCGM exporter ile Prometheus gibi sürekli metrik toplayan bir yapı daha uygundur.

Birden fazla GPU sunucum var, her birine bu betiği kurmalı mıyım?

Birkaç sunucu için evet, betik her makinede bağımsız çalışır ve mesajda sunucu adı yazar. Sunucu sayısı arttıkça eşikleri tek yerden yönetmek ve geçmişi grafikte görmek önemli hale gelir. Bu noktada Zabbix şablonları ve uyarıları gibi merkezi bir sistem daha düzenli bir yönetim sağlar.

Düzeltilen (corrected) ECC hataları için de uyarı almalı mıyım?

Tek tük düzeltilen hata normaldir ve kart bunları kendisi telafi eder. Ancak sayının hızla artması bir bellek bölgesinin bozulmaya başladığını gösterebilir. CSV'deki ecc_duzeltilen sütununu haftalık olarak inceleyin. Sürekli artış görürseniz sağlayıcınızla iletişime geçin.

Betik konteyner içinde çalışabilir mi?

Çalışabilir, ama süreç listesi ve bazı değerler eksik gelebilir. Ana makinede çalıştırmak daha güvenilir sonuç verir. Yönetilen bir ortamda ana makineye erişiminiz yoksa en azından sıcaklık ve ECC kontrolleri konteyner içinden de anlamlı sonuç verir.

Kiralık GPU sunucuda bu izlemeyi kim yapmalı?

Kart donanımı sağlayıcının, üzerinde çalışan iş sizin sorumluluğunuzdadır. VRAM taşması ve hangi sürecin belleği tuttuğu sizi ilgilendirir. Düzeltilemeyen ECC hatası ya da kaybolan kart ise sağlayıcıya bildirmeniz gereken donanım sorunlarıdır. Bu betik iki durumu da size haber verir. Frankfurt lokasyonlu GPU sunucu seçenekleri de dahil olmak üzere her NVIDIA kartlı Linux makinede aynı şekilde çalışır.

Sonuç

GPU sunucu izleme için yalnız nvidia-smi --query-gpu ve küçük bir bash betiği yeterlidir. Sıcaklık eşiğini kartın yavaşlama değerine göre, VRAM eşiğini iş yükünüze göre belirleyin. Düzeltilemeyen ECC hatasında ise sıfır tolerans uygulayın. systemd timer, betiğin 5 dakikada bir çalışmasını sağlar. CSV geçmişi, bir sorun olduğunda sorunun ne zaman başladığını gösterir. Her sürücü güncellemesinden sonra deneme mesajını ve yapay alarmı yeniden çalıştırarak izlemenin hâlâ çalıştığını doğrulayın.

  • #gpu sunucu
  • #nvidia-smi
  • #bash betiği
  • #telegram uyarısı
  • #systemd timer
  • #ecc hatası
  • #izleme

Yazar

Kurucu, sunucu.com.tr · Bulut altyapısı ve yapay zeka otomasyonları

sunucu.com.tr ve Sunucu UK'in kurucusu. Bulut altyapısı, sanallaştırma ve sunucu yönetimi üzerine çalışıyor; şirketlerin iş yazılımlarını, web sitelerini ve yapay zeka iş yüklerini güvenli sunuculara taşıyor. Blogdaki rehberler sahada karşılaşılan kurulum, güvenlik ve taşıma işlerinden derlenir; yazılar yapay zeka desteğiyle hazırlanır ve kaynaklarla doğrulanır.

Tüm yazılarıProfil