nmon ile Linux Sistem Kaynaklarını İnteraktif Olarak İzleme ve Rapor Alma
Sunucu odasında saatler geçirmiş biri olarak şunu söyleyebilirim: performans sorunlarını “hissederek” çözmek, gerçek verilerle çözmekten çok daha yorucu. Bir uygulama yavaşladığında, disk mi dolmuş, CPU mu patlamış, network mi tıkanmış diye tek tek komut çalıştırmak yerine her şeyi tek ekranda görmek istiyorsunuz. İşte tam bu noktada nmon devreye giriyor.
nmon (Nigel’s Performance Monitor), IBM tarafından AIX için geliştirilen ve sonradan Linux’a ported edilen bir sistem izleme aracı. top gibi bir şey ama çok daha zengin. CPU, memory, disk I/O, network, dosya sistemi, NFS, kernel istatistikleri… hepsini aynı anda, interaktif olarak izleyebiliyorsunuz. Üstelik veri toplama ve raporlama modunda çalıştırıp sonradan analiz da yapabiliyorsunuz. Bu yazıda hem interaktif kullanımı hem de otomasyon/raporlama tarafını ele alacağım.
Kurulum
Büyük dağıtımlarda nmon genellikle paket reposunda mevcut.
# Debian/Ubuntu
sudo apt-get install nmon
# RHEL/CentOS/Fedora
sudo yum install nmon
# veya dnf kullanıyorsanız
sudo dnf install nmon
# RHEL tabanlı sistemlerde EPEL reposu gerekebilir
sudo yum install epel-release
sudo yum install nmon
Eğer paket reposunda yoksa kaynak koddan derleyebilirsiniz, ama bu neredeyse hiç gerekmez. SourceForge üzerinden de binary indirebilirsiniz. Kurulumu doğrulamak için:
nmon --version
# veya
which nmon
İnteraktif Mod: Temel Kullanım
nmon komutunu direkt çalıştırdığınızda boş bir ekranla karşılaşırsınız. Panik yapmayın, bu normal. nmon tuş bazlı çalışıyor; hangi metrikleri görmek istediğinizi klavye kısayollarıyla seçiyorsunuz.
nmon
Ekrana girince kullanabileceğiniz temel tuşlar şunlar:
- c: CPU kullanımını göster/gizle
- m: Memory ve swap kullanımını göster/gizle
- d: Disk I/O istatistiklerini göster/gizle
- n: Network istatistiklerini göster/gizle
- k: Kernel istatistikleri (runqueue, context switch vs.)
- t: Top processes – çalışan süreçleri listele
- j: Dosya sistemi kullanımı
- h: Yardım ekranı
- q: Çıkış
Örneğin CPU + Memory + Network’ü aynı anda görmek için sırayla c, m, n tuşlarına basıyorsunuz. Her tuş bir paneli açıp kapatıyor. Ekran biraz kalabalık görünebilir başta, ama alışkınca son derece verimli bir arayüz.
Güncelleme aralığını varsayılan 2 saniyeden değiştirmek için + ve - tuşlarını kullanabilirsiniz. Çok aktif bir sistemi izliyorsanız 1 saniyeye indirmek mantıklı olabilir, ama bu CPU overhead’ini de artırır. Uzun vadeli izlemede 5-10 saniye yeterli.
CPU Metrikleri: Ne Anlıyor, Ne Yapıyor?
CPU panelini açtığınızda birkaç farklı değer görüyorsunuz:
# CPU panelini açmak için nmon çalıştırdıktan sonra 'c' tuşuna basın
# Şu değerleri göreceksiniz:
# User% - kullanıcı alanı süreçlerinin CPU kullanımı
# Sys% - kernel/sistem çağrılarının CPU kullanımı
# Wait% - I/O bekleyen süreçler (bu yüksekse disk sorunu var)
# Idle% - boş CPU
Burada en çok dikkat edilmesi gereken Wait% değeri. Eğer Wait yüksekse (örneğin %30’un üzerinde), CPU’nuz meşgul değildir aslında, disk veya ağ I/O’su için beklemektedir. Bu durumda CPU upgrade yerine storage çözümüne bakmanız gerekir. Bunu anlamamış pek çok yöneticinin gereksiz yere CPU eklediğini gördüm.
t tuşuyla açtığınız Top Processes görünümünde her sürecin ayrı ayrı CPU tüketimini izleyebilirsiniz. Bu ekranda sıralama yapmak için farklı tuşlar var; 1 ile CPU sıralaması, 2 ile memory sıralaması yapabilirsiniz.
Komut Satırından Parametrelerle Başlatma
nmon’u her seferinde elle konfigüre etmek yerine, hangi panellerin açık gelmesini istediğinizi başlatırken belirtebilirsiniz:
# CPU, memory, disk ve network panelleriyle başlat
nmon -s 5 -c 12 cmdn
# Parametreler:
# -s 5 : 5 saniyede bir güncelle
# -c 12 : 12 kez güncelle (60 saniye toplam)
# cmdn : c=cpu, m=memory, d=disk, n=network
Bu şekilde başlattığınızda belirttiğiniz paneller otomatik açılmış gelir. Özellikle birden fazla terminalde farklı konfigürasyonlarla nmon açıyorsanız bu parametre yaklaşımı zaman kazandırır.
Veri Toplama Modu: nmon’un Gerçek Gücü
nmon’un interaktif modu güzel, ama asıl güç veri toplama modunda. -f parametresiyle nmon’u arka planda çalıştırıp belirli aralıklarla sistem metriklerini bir dosyaya kaydedebilirsiniz. Bu özellikle şu senaryolarda çok işe yarar:
- Gece yüksek yük şikayeti var, sabah gelince inceleyeceksiniz
- Bir deployment öncesi ve sonrası sistem davranışını karşılaştıracaksınız
- Kapasite planlaması için haftalık/aylık veri toplayacaksınız
# Veri toplama modunu başlat
# -f: dosyaya kaydet
# -s 30: 30 saniyede bir örnek al
# -c 2880: 2880 örnek (30sn x 2880 = 24 saat)
# -m /var/log/nmon: dosyaları bu dizine kaydet
nmon -f -s 30 -c 2880 -m /var/log/nmon/
Bu komut /var/log/nmon/ dizinine hostname_tarih_saat.nmon formatında bir dosya oluşturur. Örneğin webserver01_230915_1430.nmon gibi.
Cron ile Otomatik Veri Toplama
Bunu cron’a ekleyerek her gün otomatik kayıt alabilirsiniz:
# crontab -e ile düzenleyin
# Her gün gece 00:00'da başlat, 24 saat boyunca 30sn aralıkla kaydet
0 0 * * * /usr/bin/nmon -f -s 30 -c 2880 -m /var/log/nmon/ > /dev/null 2>&1
Birkaç haftadan sonra elinizde güzel bir tarihsel veri seti olur. Disk dolmasın diye eski dosyaları temizlemek için logrotate veya basit bir cron job eklemek iyi fikir:
# 30 günden eski nmon dosyalarını sil
0 1 * * * find /var/log/nmon/ -name "*.nmon" -mtime +30 -delete
nmon Dosyalarını Analiz Etmek: nmon Analyser
Ham .nmon dosyası metin tabanlı, ama elle okumak çok zor. Bunun için nmon Analyser adında bir Excel macro aracı var (IBM tarafından sunuluyor, ücretsiz). Alternatif olarak nmonchart veya Python tabanlı araçlarla da bu verileri işleyebilirsiniz.
Ancak ben genellikle hızlı bir inceleme için grep ve temel metin araçlarını kullanırım:
# Bir nmon dosyasında CPU verilerini çek
grep "^CPU_ALL" /var/log/nmon/webserver01_230915_1430.nmon | head -20
# Memory verilerini çek
grep "^MEM," /var/log/nmon/webserver01_230915_1430.nmon | awk -F',' '{print $1,$2,$3,$4}'
# Disk I/O verilerini filtrele
grep "^DISKREAD|^DISKWRITE" /var/log/nmon/webserver01_230915_1430.nmon | tail -50
Bu yöntem hızlı tanı için yeterli. Ama detaylı analiz istiyorsanız nmon Analyser’ı kesinlikle öneririm; zaman damgalı grafikler çiziyor ve yük zirvelerini net gösteriyor.
Gerçek Dünya Senaryosu: Gece Yük Artışı Araştırması
Geçmişte e-ticaret müşterilerinde sık yaşanan bir problem: gece 02:00-03:00 arası sunucu yavaşlıyor, sabah gelen kullanıcılar şikayet ediyor ama siz bakıyorsunuz her şey normal. nmon’un veri toplama modu tam burada hayat kurtarıyor.
Adımlar:
- nmon’u veri toplama modunda başlatın (yukarıdaki cron örneği)
- Sabah ilgili gece dosyasını alın
- Şüpheli saat aralığını filtreleyin:
# Gece 02:00-03:00 arası CPU verilerini çek
# nmon dosyasında zaman damgası T ile başlar
grep "^T0[2-3]" /var/log/nmon/appserver_230916_0000.nmon
# Bu çalışmayabilir çünkü format farklı olabilir
# Alternatif: tüm CPU satırlarını timestamp ile birlikte çek
grep -A1 "^ZZZZ,T" /var/log/nmon/appserver_230916_0000.nmon | grep -v "^ZZZZ" | head -40
Pratikte bu araştırmayla bir müşterinin gece çalışan backup scriptinin hem disk I/O’yu hem CPU’yu dövdüğünü tespit ettim. Backup zamanlamasını 04:00’a aldık, problem çözüldü. nmon olmadan bu tanıyı yapmak saatler alırdı.
Network Metrikleri ile Bant Genişliği Takibi
Network panelinde (n tuşu) her interface için alınan ve gönderilen veri miktarını KB/s cinsinden görebilirsiniz. Bir web sunucusunda bant genişliği tüketimini anlık izlemek için bu çok kullanışlı.
# Sadece network metriklerini veri toplama modunda kaydet
# Bunu özellikle CDN entegrasyonu veya büyük dosya transferi testlerinde kullandım
nmon -f -s 5 -c 720 -m /tmp/nettest/
# 5sn aralıkla, 1 saat boyunca (720 x 5 = 3600sn)
Toplanan veriden network zirvelerini analiz etmek:
# NET satırlarını çekip en yüksek değerleri bul
grep "^NET," /tmp/nettest/server_*.nmon | sort -t',' -k4 -rn | head -10
Disk I/O Detayları
Disk performansı sorunlarında d tuşuyla açtığınız panel çok bilgi veriyor. Her disk için ayrı ayrı okuma/yazma hızını KB/s cinsinden gösteriyor. Ama asıl kritik olan busy% değeri: bu değer %100’e yaklaşıyorsa disk doymuş demektir, IOPS sınırına geliyorsunuzdur.
# Disk busy yüzdesini veri dosyasından çekme
grep "^DISKBUSY," /var/log/nmon/dbserver_*.nmon |
awk -F',' '{
for(i=3;i<=NF;i++) {
if($i+0 > 80) print "HIGH DISK BUSY: "$0
}
}' | head -20
Bu script, %80 üzerindeki disk busy değerlerini flagliyor. Üretim ortamında bu değerin sürekli yüksek olması SSD geçişi veya RAID konfigürasyonu gözden geçirme sinyali.
Kernel ve Runqueue Metrikleri
k tuşuyla açılan kernel paneli çoğu sysadmin tarafından görmezden geliniyor ama çok önemli bilgiler içeriyor:
- Runqueue: Çalışmayı bekleyen süreç sayısı. CPU çekirdeği sayısını aşıyorsa CPU bottleneck var.
- Context switches/sec: Çok yüksekse kernel overhead artmış demektir.
- Forks/sec: Saniyede oluşturulan süreç sayısı. Bir şeyler çok fazla fork atıyorsa burada görürsünüz.
# Runqueue ortalamalarını kontrol için nmon yerine bu da kullanılabilir
# Ama nmon ile birlikte diğer metriklerle korelasyon kurmak daha değerli
grep "^PROC," /var/log/nmon/server_*.nmon | awk -F',' '{sum+=$3; count++} END {print "Avg Runqueue:", sum/count}'
nmon ile Kapasite Planlaması
Aylık veri topladıktan sonra kapasite planlaması için trend analizi yapabilirsiniz. Basit bir bash script ile aylık ortalama CPU kullanımını hesaplayabilirsiniz:
#!/bin/bash
# monthly_avg.sh - Aylık ortalama CPU kullanımı hesapla
NMON_DIR="/var/log/nmon"
MONTH="2309" # Eylül 2023
echo "=== Aylık CPU Kullanım Özeti ==="
for file in ${NMON_DIR}/*${MONTH}*.nmon; do
date_str=$(basename $file | cut -d'_' -f2,3)
avg_cpu=$(grep "^CPU_ALL," $file |
awk -F',' '{sum+=$3+$4; count++} END {if(count>0) printf "%.1f", sum/count}')
echo "Tarih: $date_str | Ort. CPU (User+Sys): ${avg_cpu}%"
done
Bu şekilde CPU kullanımının ay içindeki seyrine bakabilir, belirli günlerde pike çıktığını görebilirsiniz.
nmon vs Alternatifler: Ne Zaman nmon Tercih Etmeli?
top, htop, atop, glances, dstat gibi araçlarla kıyaslandığında nmon’un öne çıktığı durumlar:
- Veri toplama ve kayıt: nmon’un
.nmonformatı ve bu formatı işleyen araçlar (nmon Analyser) bu konuda rakipsiz. - AIX/Linux birlikte ortam: Her ikisinde de nmon varsa tek araç öğrenmek yeterli.
- Düşük overhead: nmon kendisi çok az kaynak tüketiyor, production sistemlerde rahatlıkla bırakabilirsiniz.
- Kapsamlı metrikler tek ekranda: htop süreci iyi gösterir ama disk I/O ve network’ü aynı anda bu kadar detaylı göstermez.
Bununla birlikte, gerçek zamanlı güzel görsel istiyorsanız htop veya glances daha konforlu. nmon’un arayüzü biraz 90’lar havasında, inkâr etmeyeyim.
Çoklu Sunucu İzleme için Basit Bir Yaklaşım
Birden fazla sunucuda nmon verisi topluyorsanız, bu dosyaları merkezi bir yere çekip toplu analiz yapabilirsiniz:
#!/bin/bash
# collect_nmon.sh - Uzak sunuculardan nmon dosyalarını çek
SERVERS="web01 web02 app01 app02 db01"
DEST="/data/nmon_central"
DATE=$(date +%y%m%d)
for server in $SERVERS; do
mkdir -p ${DEST}/${server}
scp -q ${server}:/var/log/nmon/*${DATE}*.nmon ${DEST}/${server}/ 2>/dev/null
echo "Kopyalandı: $server -> ${DEST}/${server}/"
done
echo "Tüm veriler toplandı: ${DEST}"
Bu script’i sabah işe geldiğinizde veya bir inceleme gerektiğinde çalıştırırsınız, tüm sunucuların bir önceki güne ait verisi elinizde olur.
Sonuç
nmon’u ilk kullandığımda “bu sadece top’un karmaşık versiyonu” diye düşünmüştüm. Yanılmışım. Özellikle veri toplama modu, geçmişe dönük problem analizi için bence Linux’taki en pratik çözümlerden biri. Grafana/Prometheus stack’i kurmak için zamanınız yoksa, basit bir cron + nmon kombinasyonu sizi çok uzağa götürür.
Üretim ortamında mutlaka cron’a ekleyin, dosyaları merkezi bir yere toplayın ve bir sorun yaşandığında “o saatte ne oluyordu” sorusunu saniyeler içinde cevaplayabilin. Bunun değerini ilk kritik olayda anlarsınız.
Interaktif tarafını da ihmal etmeyin: bir yük testinden önce nmon’u açıp CPU + disk + network panellerini izlemek, test sırasında bottleneck’in nerede oluştuğunu gerçek zamanlı görmek paha biçilmez. Bunu bir kez yaşayınca bir daha olmaksızın yapamazsınız.
