Sunucunuzda bir şeyler ters gittiğinde, ilk bakacağınız yerlerden biri CPU kullanımıdır. Ama top veya htop ile genel bir yüzde görmek çoğu zaman yeterli olmaz. Asıl soru şudur: hangi çekirdek ne kadar çalışıyor, yük dengeli mi dağılıyor, yoksa bir çekirdek patlarken diğerleri boş mu duruyor? İşte tam bu noktada mpstat devreye girer.
mpstat, sysstat paketinin bir parçası olarak gelen, çok çekirdekli sistemlerde her CPU çekirdeğini ayrı ayrı izlemenizi sağlayan güçlü bir araçtır. Tek satır komutla hem anlık hem de zaman serisi halinde CPU istatistiklerini toplayabilirsiniz. Bu yazıda mpstat‘ı uçtan uca ele alacağız: kurulumdan, gerçek dünya senaryolarına kadar her şeyi inceleyeceğiz.
mpstat Nedir ve Neden Kullanmalısınız?
mpstat, “multiprocessor statistics” kelimelerinin kısaltmasıdır. Temel olarak /proc/stat dosyasından veri okuyarak CPU kullanım istatistiklerini anlaşılır bir formatta sunar. top gibi araçlar size bir bütün olarak sistemin CPU yükünü gösterirken, mpstat her fiziksel veya mantıksal çekirdeği tek tek raporlayabilir.
Bu özellik özellikle şu durumlarda hayat kurtarır:
- NUMA topolojisi olan sunucularda belirli bir soket üzerindeki çekirdeklerin aşırı yüklenmesi
- Single-threaded uygulamalarda yükün tek çekirdeğe yığılması
- IRQ affinity sorunlarında kesme işlemlerinin yalnızca bir çekirdeğe gitmesi
- Sanallaştırma ortamlarında vCPU steal time analizleri
- Uygulama performans testlerinde çekirdek bazlı kıyaslama yapılması
Kurulum
Çoğu modern Linux dağıtımında sysstat paketi varsayılan olarak kurulu gelmez. Önce kontrol edelim:
which mpstat
# veya
mpstat --version
Eğer komut bulunamazsa ilgili paket yöneticinizle kurabilirsiniz:
# Debian/Ubuntu tabanlı sistemler
sudo apt update && sudo apt install sysstat -y
# RHEL/CentOS/Rocky Linux
sudo dnf install sysstat -y
# Arch Linux
sudo pacman -S sysstat
# Alpine Linux
sudo apk add sysstat
Kurulumdan sonra sysstat servisini aktifleştirmenizi de öneririm. Bu sayede sistem istatistikleri arka planda otomatik olarak toplanır ve ileride sar komutuyla geçmişe bakabilirsiniz:
sudo systemctl enable --now sysstat
Temel Kullanım
En basit haliyle mpstat komutunu parametresiz çalıştırdığınızda, sistemin başladığından bu yana olan ortalama CPU kullanımını gösterir:
mpstat
Çıktı şöyle görünür:
Linux 5.15.0-91-generic (webserver01) 12/15/2024 _x86_64_ (8 CPU)
14:32:18 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
14:32:18 all 12.34 0.00 3.21 1.45 0.00 0.23 0.00 0.00 0.00 82.77
Burada all satırı tüm çekirdeklerin ortalamasını gösterir. Ama biz çekirdek bazlı detayları görmek istiyoruz.
Çekirdek Bazlı İzleme
Her çekirdeği ayrı ayrı görmek için -P ALL parametresini kullanıyoruz:
mpstat -P ALL
Bu komut şöyle bir çıktı verir:
Linux 5.15.0-91-generic (webserver01) 12/15/2024 _x86_64_ (8 CPU)
14:35:22 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
14:35:22 all 15.42 0.00 4.11 2.03 0.00 0.31 0.12 0.00 0.00 77.94
14:35:22 0 87.23 0.00 8.44 0.00 0.00 2.11 0.22 0.00 0.00 2.00
14:35:22 1 2.10 0.00 1.02 8.33 0.00 0.00 0.00 0.00 0.00 88.55
14:35:22 2 3.45 0.00 1.23 0.00 0.00 0.10 0.00 0.00 0.00 95.22
14:35:22 3 1.22 0.00 0.89 0.00 0.00 0.00 0.00 0.00 0.00 97.89
...
Görüyorsunuz değil mi? Ortalama %15 görünüyor ama CPU 0 tam gaz %87 kullanımda. Bu tam olarak top‘un gözden kaçıracağı türden bir sorun.
Periyodik İzleme
Gerçek zamanlı izleme için mpstat‘a bir aralık ve tekrar sayısı verebilirsiniz:
# Her 2 saniyede bir, 5 kez ölç
mpstat -P ALL 2 5
# Her saniye sürekli izle (Ctrl+C ile durdur)
mpstat -P ALL 1
Belirli bir çekirdeği izlemek istiyorsanız -P parametresine çekirdek numarasını verebilirsiniz:
# Sadece CPU 0'ı izle
mpstat -P 0 1 10
# CPU 0 ve CPU 3'ü izle
mpstat -P 0,3 1 10
Parametreler ve Sütunların Anlamı
mpstat‘ın çıktısındaki her sütun farklı bir CPU kullanım kategorisini temsil eder. Bunları iyi anlamak, sorunları doğru teşhis etmenin anahtarıdır:
- %usr: Kullanıcı alanında çalışan processler tarafından harcanan CPU zamanı. Uygulamanızın kendisi burada görünür.
- %nice: Önceliği düşürülmüş (nice değeri pozitif) processlerin kullandığı CPU zamanı.
- %sys: Kernel alanında harcanan CPU zamanı. Yüksekse sistem çağrıları veya sürücüler sorun çıkarıyor olabilir.
- %iowait: CPU’nun disk veya ağ I/O beklerken boşta geçirdiği süre. Yüksekse depolama darboğazı var demektir.
- %irq: Donanım kesme işlemlerine harcanan zaman.
- %soft: Yazılım kesme işlemlerine (softirq) harcanan zaman. Yüksek ağ trafiğinde bu değer artar.
- %steal: Sanallaştırılmış ortamlarda hypervisor’ın başka bir sanal makineye CPU zamanı verirken sizin VM’inizin beklediği süre. Bulut sunucularda kritik bir metrik.
- %guest: Sanal makineler için harcanan CPU zamanı (hypervisor perspektifinden).
- %idle: Boşta geçirilen zaman. Ne kadar yüksekse o kadar iyi.
Gerçek Dünya Senaryosu 1: Single-Threaded Uygulama Sorunu
Bir Java uygulaması çalıştıran sunucuda kullanıcılar yavaşlık şikayeti yapıyor. top‘a bakıyorsunuz, genel CPU kullanımı %20 civarında. Normal görünüyor. Ama:
mpstat -P ALL 1 5
Çıktıda CPU 3’ün %99 usr’da olduğunu görüyorsunuz, diğer 7 çekirdek neredeyse boş. Bu uygulama tek iş parçacıklı çalışıyor ve tüm yükü bir çekirdeğe bindiriyor demektir.
Bu durumda yapabileceğiniz şeyler:
# Hangi process o çekirdeği yiyor?
ps -eo pid,psr,pcpu,comm --sort=-pcpu | head -20
# psr sütunu processin hangi CPU'da çalıştığını gösterir
# Uygulamayı belirli çekirdeklere pin'lemek yerine tüm çekirdekleri kullanmaya zorlamak
taskset -cp 0-7 <PID>
Gerçek Dünya Senaryosu 2: IRQ Dengesizliği
Yoğun ağ trafiği olan bir sunucuda mpstat çıktısı şöyle görünüyorsa:
CPU %usr %nice %sys %iowait %irq %soft %steal %idle
all 8.22 0.00 5.11 0.33 0.00 18.44 0.00 67.90
0 12.33 0.00 15.22 1.02 0.00 75.44 0.00 0.00 <- Problem
1 8.11 0.00 3.22 0.00 0.00 0.22 0.00 88.45
2 7.90 0.00 2.88 0.00 0.00 0.11 0.00 89.11
CPU 0’da %soft değeri %75! Bu, ağ kartı kesmelerinin tamamının CPU 0’a yönlendirildiği anlamına gelir. Çözüm:
# Mevcut IRQ dağılımını kontrol et
cat /proc/interrupts | grep -i eth
# IRQ affinity'yi tüm çekirdeklere dağıt
# Önce ağ kartınızın IRQ numarasını bulun
grep eth0 /proc/interrupts | awk '{print $1}' | tr -d ':'
# IRQ'yu tüm çekirdeklere dağıt (8 çekirdekli sistem için)
echo ff > /proc/irq/<IRQ_NO>/smp_affinity
# Daha modern yöntem: irqbalance servisi
sudo systemctl enable --now irqbalance
Gerçek Dünya Senaryosu 3: Bulut Sunucuda Steal Time
AWS, GCP veya Azure üzerinde çalışıyorsanız %steal değeri kritik önem taşır:
# 30 saniye boyunca steal time'ı izle
mpstat -P ALL 1 30 | grep -v "^$" | awk '$3 ~ /[0-9]/ {print $0}'
Eğer %steal değeri sürekli %5’in üzerindeyse, hypervisor aynı fiziksel sunucudaki başka VM’lere öncelik tanıyor demektir. Bu durumda:
- Instance tipini CPU kredili (burstable) tipten dedicated’a yükseltmeyi düşünebilirsiniz
- AWS üzerinde “dedicated host” seçeneğini değerlendirebilirsiniz
- Ya da workload’ı farklı bir availability zone’a taşıyabilirsiniz
Çıktıyı Dosyaya Kaydetme ve Log Analizi
Uzun süreli izleme için çıktıyı dosyaya yönlendirmek oldukça kullanışlıdır:
# Her 5 saniyede bir, 1 saat boyunca kaydet (720 örnek)
mpstat -P ALL 5 720 > /var/log/cpu_analysis_$(date +%Y%m%d_%H%M%S).log &
# Arka planda çalıştır ve PID'i kaydet
echo $! > /tmp/mpstat.pid
Kaydedilen logu analiz etmek için:
# En yüksek usr kullanımını bul
grep -v "CPU|Linux|^$" /var/log/cpu_analysis_*.log | awk '{print $4, $0}' | sort -rn | head -20
# Belirli bir çekirdeğin ortalama kullanımını hesapla
grep " 0 " /var/log/cpu_analysis_*.log | awk '{sum+=$4; count++} END {print "CPU0 avg usr:", sum/count "%"}'
JSON Formatında Çıktı Alma
Modern monitoring pipeline’larında JSON formatı tercih edilir. mpstat doğrudan JSON çıktısı destekler:
# JSON formatında çıktı al (sysstat 12.0+)
mpstat -P ALL -o JSON 1 3
Bu çıktıyı örneğin bir log aggregation sistemine veya basit bir script’e besleyebilirsiniz:
# Python ile parse etme örneği
mpstat -P ALL -o JSON 1 1 | python3 -c "
import sys, json
data = json.load(sys.stdin)
hosts = data['sysstat']['hosts'][0]
stats = hosts['statistics'][0]['cpu-load']
for cpu in stats:
if float(cpu['idle']) < 20:
print(f"UYARI: CPU {cpu['cpu']} - idle: {cpu['idle']}%, usr: {cpu['usr']}%")
"
Otomatik Uyarı Script’i
Üretim ortamında belirli bir eşiği geçince bildirim almak için basit bir script yazalım:
#!/bin/bash
# /usr/local/bin/cpu_alert.sh
# Çekirdek bazlı CPU uyarı scripti
THRESHOLD_USR=80
THRESHOLD_STEAL=5
LOG_FILE="/var/log/cpu_alerts.log"
ALERT_EMAIL="[email protected]"
check_cpu() {
# 5 saniyelik ortalama al
mpstat -P ALL 1 5 | grep -v "^$|CPU|Linux|Average" |
while read line; do
cpu_id=$(echo $line | awk '{print $3}')
usr=$(echo $line | awk '{print $4}' | cut -d. -f1)
steal=$(echo $line | awk '{print $10}' | cut -d. -f1)
idle=$(echo $line | awk '{print $12}' | cut -d. -f1)
if [ "$cpu_id" != "all" ]; then
if [ "$usr" -gt "$THRESHOLD_USR" ] 2>/dev/null; then
MSG="$(date): UYARI - CPU${cpu_id} usr kullanimi: %${usr} (esik: %${THRESHOLD_USR})"
echo "$MSG" >> "$LOG_FILE"
echo "$MSG" | mail -s "CPU Uyari: Sunucu $(hostname)" "$ALERT_EMAIL"
fi
if [ "$steal" -gt "$THRESHOLD_STEAL" ] 2>/dev/null; then
MSG="$(date): UYARI - CPU${cpu_id} steal time: %${steal} (esik: %${THRESHOLD_STEAL})"
echo "$MSG" >> "$LOG_FILE"
fi
fi
done
}
# Scripti cron'a ekle: */5 * * * * /usr/local/bin/cpu_alert.sh
check_cpu
mpstat ile sar Entegrasyonu
sysstat paketi yüklenip servis aktifleştirildiğinde, sistem otomatik olarak CPU istatistiklerini kaydeder. Bu verilere sar komutuyla ulaşabilirsiniz:
# Bugünün CPU istatistiklerini görüntüle
sar -P ALL
# Saat 14:00 ile 16:00 arasındaki verileri görüntüle
sar -P ALL -s 14:00:00 -e 16:00:00
# Dün akşam saat 23:00'daki duruma bak
sar -P ALL -f /var/log/sysstat/sa$(date -d yesterday +%d) -s 23:00:00 -e 23:30:00
Bu özellik özellikle “dün gece 03:00’da ne oldu” sorusunu yanıtlamak için paha biçilmezdir.
mpstat Çıktısını Grafana ile Görselleştirme
Eğer Prometheus kullanıyorsanız node_exporter zaten bu metrikleri toplar. Ama sysstat verilerini doğrudan kullanmak istiyorsanız:
# sysstat verilerini Prometheus formatına dönüştüren basit bir çözüm
# sadf komutu ile JSON çıktısı al, ardından pushgateway'e gönder
sadf -j -- -P ALL | python3 /usr/local/bin/sysstat_to_prometheus.py |
curl --data-binary @- http://pushgateway:9091/metrics/job/sysstat/instance/$(hostname)
Önemli Parametreler Özeti
mpstat komutunun sık kullanılan parametrelerini bir kez daha özetleyelim:
- -P ALL: Tüm CPU çekirdeklerini ayrı ayrı göster
- -P 0,1,2: Sadece belirtilen çekirdekleri göster
- -u: CPU kullanım istatistiklerini göster (varsayılan davranış)
- -I ALL: Tüm kesme (interrupt) istatistiklerini göster
- -I CPU: Her çekirdek için kesme sayısını göster
- -I SUM: Kesme özetini göster
- -o JSON: Çıktıyı JSON formatında ver (sysstat 12.0+)
- -V: Versiyon bilgisini göster
- interval: Kaç saniyede bir ölçüm yapılacağı
- count: Kaç ölçüm yapılacağı
Yaygın Hatalar ve Çözümleri
Komut bulunamıyor hatası:
# sysstat kurulmamış olabilir
sudo apt install sysstat -y
Veri toplanamıyor hatası:
# sysstat servisi devre dışı olabilir
sudo systemctl start sysstat
# Ubuntu/Debian'da data collection aktifleştirme
sudo sed -i 's/ENABLED="false"/ENABLED="true"/' /etc/default/sysstat
sudo systemctl restart sysstat
JSON çıktı çalışmıyor:
# sysstat versiyonunu kontrol et, 12.0+ gerekli
mpstat --version
# Eski versiyon varsa kaynaktan derlemek gerekebilir
Performans Karşılaştırması: Hangi Aracı Ne Zaman Kullanmalı
mpstat tek başına bir çözüm değil, toolbox’taki bir araçtır. Hangi durumda ne kullanmalı:
- Genel sistem durumu için:
topveyahtopile başlayın - Çekirdek bazlı detaylı analiz için:
mpstat -P ALLkullanın - Process bazlı CPU analizi için:
pidstatveyaperf topkullanın - Geçmişe dönük analiz için:
sar -P ALLkullanın - I/O kaynaklı sorunlar için:
mpstat‘ın%iowaitsütunuylaiostat‘ı birlikte kullanın - Uygulama profiling için:
perf,straceveya language-specific araçlara geçin
Sonuç
mpstat, sysadmin araç kutusunun vazgeçilmez parçalarından biridir. Özellikle çok çekirdekli sistemlerde yük dengesizliklerini, steal time sorunlarını ve IRQ affinity problemlerini tespit etmede gerçekten rakipsizdir. top‘un size gösterdiği ortalama değerlerin arkasında neler döndüğünü görmek istiyorsanız, mpstat -P ALL 1 komutunu çalıştırmanız yeterlidir.
Üretim sistemlerinizde en azından sysstat servisini aktif tutmanızı şiddetle tavsiye ederim. Maliyet sıfır, kazancı ise bir sorun anında aylar öncesine gidip “o gün ne olmuştu” sorusunu yanıtlayabilmek. Hem kendiniz için hem de ekibinizin gece uyandığında “neden böyle oldu” diye saatlerce uğraşmaması için bu küçük adımı atın.
Bir sonraki adım olarak pidstat komutuna bakmanızı öneririm. Process bazlı CPU ve I/O analizinde mpstat‘ı mükemmel şekilde tamamlar ve ikisini birlikte kullandığınızda sistem performans sorunlarının büyük çoğunluğunu dakikalar içinde teşhis edebilirsiniz.