Ana içeriğe geç
Kategoriye Dön

Yüksek CPU ve RAM Kullanımı Teşhisi

Sunucuda yüksek CPU ve RAM kullanımını teşhis etmek için top, htop, ps komutları, OOM killer mekanizması, process analizi ve kaynak optimizasyonu rehberi.

Okuma süresi: 15 dk Sorun Giderme
cpuramtophtoppsoom-killerbellekperformans

İçindekiler

Giriş

Sunucunuzda yüksek CPU veya RAM kullanımı, performans düşüklüğüne, servis kesintilerine ve hatta sunucunun yanıt vermemesine neden olabilir. Bu rehberde, kaynak tüketen süreçleri tespit etmek ve sorunu çözmek için kullanabileceğiniz araçları ve yöntemleri detaylı olarak inceleyeceğiz.

Anlık Durum Kontrolü

top Komutu

top, sistem kaynaklarını gerçek zamanlı izlemek için en temel araçtır:

hljs bash
top

Önemli alanlar:

  • %CPU: İşlemcinin kullanım yüzdesi
  • %MEM: Bellek kullanım yüzdesi
  • RES: Fiziksel RAM kullanımı
  • VIRT: Sanal bellek kullanımı
  • TIME+: Toplam CPU zamanı

Kullanışlı kısayollar:

  • P — CPU kullanımına göre sırala
  • M — Bellek kullanımına göre sırala
  • k — Process sonlandır (PID gir)
  • 1 — Her CPU çekirdeğini ayrı göster
  • c — Tam komut satırını göster

htop Komutu

htop, top'un daha gelişmiş ve kullanıcı dostu versiyonudur:

hljs bash
# Kurulum
sudo apt install htop -y

# Çalıştırma
htop

htop avantajları:

  • Renkli ve görsel arayüz
  • Mouse desteği
  • Yatay ve dikey kaydırma
  • Ağaç görünümü (F5)
  • Filtreleme (F4) ve arama (F3)

Tek Seferlik Durum Görüntüleme

hljs bash
# CPU kullanımına göre ilk 10 process
ps aux --sort=-%cpu | head -11

# RAM kullanımına göre ilk 10 process
ps aux --sort=-%mem | head -11

# Belirli bir kullanıcının process'leri
ps -u www-data --sort=-%cpu

# Process ağacı görünümü
ps auxf

CPU Kullanımı Analizi

Yüksek CPU Kullanan Process Tespiti

hljs bash
# Anlık CPU kullanımı
mpstat -P ALL 1 5

# Process bazlı CPU kullanımı (5 saniye aralıkla)
pidstat -u 5 3

# Belirli bir process'in CPU kullanımı
pidstat -p PID_NUMARASI 1

CPU Kullanım Geçmişi

hljs bash
# sar ile geçmiş CPU verileri
sar -u 1 10

# Son 24 saatlik CPU kullanımı
sar -u -f /var/log/sysstat/sa$(date +%d)

# Load average kontrolü
uptime
cat /proc/loadavg

Load average değeri, CPU çekirdek sayınızla karşılaştırılmalıdır. 4 çekirdekli bir sunucuda load average 4.0 ise CPU %100 kullanımdadır. 8.0 ise aşırı yük altındadır.

CPU Yoğun Process'i Analiz Etme

hljs bash
# Process'in detaylı bilgileri
ps -p PID_NUMARASI -o pid,ppid,user,%cpu,%mem,etime,cmd

# Process'in açık dosyaları
lsof -p PID_NUMARASI

# Process'in sistem çağrıları
strace -p PID_NUMARASI -c

# Process'in thread'leri
ps -T -p PID_NUMARASI

RAM Kullanımı Analizi

Bellek Durumu Kontrolü

hljs bash
# Genel bellek durumu
free -h

# Detaylı bellek bilgisi
cat /proc/meminfo

# Bellek kullanım özeti
vmstat 1 5

free -h çıktısını okuma:

              total        used        free      shared  buff/cache   available
Mem:           16Gi       8.2Gi       1.1Gi       256Mi       6.7Gi       7.2Gi
Swap:          4.0Gi       512Mi       3.5Gi

Linux'ta "free" bellek düşük görünebilir çünkü sistem boş belleği disk cache olarak kullanır. Gerçek kullanılabilir bellek "available" sütunundadır.

RAM Yoğun Process Tespiti

hljs bash
# RSS (Resident Set Size) bazlı sıralama
ps aux --sort=-rss | head -11

# smem ile detaylı bellek analizi
sudo apt install smem -y
smem -t -k -s rss

# Process bazlı bellek kullanımı
pmap -x PID_NUMARASI

Swap Kullanımı Analizi

hljs bash
# Swap kullanan process'ler
for file in /proc/*/status; do
  awk '/VmSwap|Name/{printf $2 " " $3}END{print ""}' $file
done | sort -k 2 -n -r | head -10

# Swap aktivitesi izleme
vmstat 1 10

# Swappiness değeri
cat /proc/sys/vm/swappiness

# Swappiness ayarlama (geçici)
sudo sysctl vm.swappiness=10

# Swappiness ayarlama (kalıcı)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

OOM Killer Mekanizması

Linux çekirdeği, bellek tükendiğinde OOM (Out of Memory) Killer mekanizmasını devreye sokar ve en çok bellek kullanan process'i sonlandırır.

OOM Killer Loglarını Kontrol Etme

hljs bash
# OOM killer olaylarını arama
dmesg | grep -i "oom\|out of memory"

# Sistem loglarında OOM
journalctl -k | grep -i oom

# Son OOM olayları
grep -i 'oom' /var/log/syslog

OOM Score Kontrolü

hljs bash
# Bir process'in OOM score'u
cat /proc/PID_NUMARASI/oom_score

# Tüm process'lerin OOM score'ları
for proc in $(find /proc -maxdepth 1 -regex '/proc/[0-9]+'); do
  printf "%s\t%s\t%s\n" "$(cat $proc/oom_score 2>/dev/null)" "$(cat $proc/oom_adj 2>/dev/null)" "$(cat $proc/comm 2>/dev/null)"
done | sort -rn | head -10

OOM Killer'dan Koruma

hljs bash
# Kritik process'i OOM killer'dan koru
echo -1000 > /proc/PID_NUMARASI/oom_score_adj

# Systemd servisinde OOM koruma
# /etc/systemd/system/kritik-servis.service
[Service]
OOMScoreAdjust=-1000

OOM Killer'ın bir process'i sonlandırması, sunucunuzda ciddi bellek sorunu olduğunun göstergesidir. Kök nedeni bulmadan sadece OOM koruması eklemek sorunu çözmez.

Process Yönetimi

Process Öncelik Ayarlama

hljs bash
# Nice değeri ile başlatma (-20 en yüksek, 19 en düşük öncelik)
nice -n 10 ./uzun-islem.sh

# Çalışan process'in önceliğini değiştirme
renice -n 15 -p PID_NUMARASI

# Tüm kullanıcı process'lerinin önceliğini düşürme
renice -n 10 -u kullanici_adi

Process Sonlandırma

hljs bash
# Nazik sonlandırma (SIGTERM)
kill PID_NUMARASI

# Zorla sonlandırma (SIGKILL)
kill -9 PID_NUMARASI

# İsme göre sonlandırma
killall process_adi
pkill -f "process_pattern"

# Belirli CPU eşiğini aşan process'leri sonlandırma
ps aux | awk '$3 > 90 {print $2}' | xargs kill -9

Kaynak İzleme Script'i

hljs bash
#!/bin/bash
# Kaynak kullanım izleme ve uyarı script'i

CPU_THRESHOLD=90
MEM_THRESHOLD=90
LOG_FILE="/var/log/resource-monitor.log"

while true; do
  TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
  
  # CPU kontrolü
  CPU_USAGE=$(top -bn1 | grep 'Cpu(s)' | awk '{print $2}' | cut -d'.' -f1)
  if [ "$CPU_USAGE" -gt "$CPU_THRESHOLD" ]; then
    echo "[$TIMESTAMP] UYARI: CPU kullanımı %$CPU_USAGE" >> $LOG_FILE
    echo "En çok CPU kullanan process'ler:" >> $LOG_FILE
    ps aux --sort=-%cpu | head -6 >> $LOG_FILE
  fi
  
  # RAM kontrolü
  MEM_USAGE=$(free | grep Mem | awk '{printf("%.0f", $3/$2 * 100)}')
  if [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
    echo "[$TIMESTAMP] UYARI: RAM kullanımı %$MEM_USAGE" >> $LOG_FILE
    echo "En çok RAM kullanan process'ler:" >> $LOG_FILE
    ps aux --sort=-%mem | head -6 >> $LOG_FILE
  fi
  
  sleep 60
done

Sonuç

Yüksek CPU ve RAM kullanımı, sunucu performansını doğrudan etkileyen kritik sorunlardır. top, htop, ps ve vmstat gibi araçlarla sorunlu process'leri tespit edebilir, nice/renice ile öncelik ayarlayabilir ve gerektiğinde process'leri sonlandırabilirsiniz. OOM Killer loglarını düzenli kontrol ederek bellek sorunlarını erken tespit etmek önemlidir.