Sunucuda bir şeyler ters gittiğinde, ilk içgüdün ne olur? Benim hep aynı olmuştur: terminali aç, top yaz, Enter’a bas. Yıllar geçtikçe daha gelişmiş araçlar öğrendim, htop kullandım, glances denedim, Prometheus/Grafana kurulumları yaptım. Ama sabahın 3’ünde bir sunucu alarm verdiğinde, SSH bağlantısı açılır açılmaz parmaklar otomatik olarak top komutunu yazıyor. Bu kadar köklü, bu kadar temel bir araç.
top komutu, Linux sistemlerde süreçleri ve sistem kaynaklarını gerçek zamanlı olarak izlemenin en klasik yolu. 1984’ten bu yana Linux/Unix dünyasında var ve hala her dağıtımda default olarak kurulu geliyor. Basit görünüşünün arkasında ciddi bir güç saklı. Bu yazıda top‘u gerçekten tanıyacağız, sadece komutu çalıştırıp bakmayı değil, aktif olarak kullanmayı öğreneceğiz.
top Nedir ve Ne Zaman Kullanılır
top (Table Of Processes), sistemdeki çalışan süreçleri CPU ve bellek kullanımına göre sıralayan, dinamik olarak güncellenen bir izleme aracıdır. Varsayılan olarak her 3 saniyede bir ekranı yeniler ve en çok kaynak tüketen süreçleri üste getirir.
Şu senaryolarda top ilk başvurman gereken araçtır:
- Sunucu yavaşlamış, sebebini bilmiyorsun
- Bir uygulama beklenmedik şekilde çökmüş ve load average patlamış
- CPU veya RAM’in kim tarafından tüketildiğini bulmak istiyorsun
- Cron job’ların sistem üzerindeki anlık etkisini gözlemlemek istiyorsun
- Yeni deploy ettiğin uygulamanın kaynak tüketimini izlemek istiyorsun
# Basit başlatma
top
# Belirli bir kullanıcının süreçlerini göster
top -u www-data
# Belirli bir süreç ID'sini izle
top -p 1234
# Birden fazla PID izle
top -p 1234,5678,9012
# Güncelleme aralığını ayarla (saniye cinsinden)
top -d 1
Ekranı Okumak: Üst Bölüm
top çalıştırdığında ekran iki ana bölüme ayrılır: özet bilgilerin gösterildiği üst kısım ve süreç listesinin bulunduğu alt kısım. Çoğu kişi süreç listesine odaklanır ama asıl bilgi üst kısımda gizlidir.
Uptime ve Load Average
Ekranın en üst satırında şöyle bir şey görürsün:
top - 14:23:45 up 47 days, 3:12, 2 users, load average: 0.45, 0.38, 0.52
Buradan şunları okuyabilirsin:
- Saat: Şu anki sistem saati
- Uptime: Sunucu kaç gündür açık
- Users: Kaç aktif oturum var
- Load Average: 1 dakika, 5 dakika ve 15 dakikalık ortalama yük değerleri
Load average konusunda bir nokta netleştirmem lazım. Bu değer tek başına bir şey ifade etmez, CPU çekirdeği sayısıyla birlikte değerlendirilmeli. 4 çekirdekli bir sunucuda load average 4.0 demek “tam kapasite” demektir. Ama tek çekirdekli bir makinede 4.0 load average felaket anlamına gelir.
# CPU çekirdeği sayısını öğren
nproc
# Ya da daha detaylı
lscpu | grep "CPU(s):"
Eğer 1 dakikalık load average ani bir spike gösteriyorsa ama 15 dakikalık değer normalse, geçici bir yük artışı yaşandı demektir. Ama tam tersi durumda, yani 15 dakikalık değer yüksek ama 1 dakikalık düşüyorsa, sorun geçiyor olabilir.
Tasks ve CPU Bilgisi
Tasks: 187 total, 1 running, 186 sleeping, 0 stopped, 0 zombie
%Cpu(s): 12.3 us, 3.4 sy, 0.0 ni, 82.1 id, 1.8 wa, 0.0 hi, 0.4 si, 0.0 st
CPU alanındaki değerlerin anlamları:
- us (user): Kullanıcı alanı uygulamaların CPU kullanımı
- sy (system): Kernel’in CPU kullanımı
- ni (nice): Önceliği değiştirilmiş süreçlerin kullanımı
- id (idle): Boşta bekleyen CPU yüzdesi
- wa (iowait): I/O işlemlerini bekleyen CPU yüzdesi
- hi (hardware interrupts): Donanım kesmelerinde harcanan süre
- si (software interrupts): Yazılım kesmelerinde harcanan süre
- st (steal): Sanal makinelerde hypervisor’ın çaldığı CPU süresi
wa değeri yüksekse disk veya ağ I/O’su darboğaz yaratıyor demektir. Bu durumda CPU’ya bakmak yerine iostat veya iotop‘a geçmen gerekir. st değeri sanal sunucularda önemlidir, yüksekse fiziksel host overcommit edilmiş demektir.
Bellek Bilgisi
MiB Mem : 15877.8 total, 2341.2 free, 8923.4 used, 4613.2 buff/cache
MiB Swap: 2048.0 total, 1876.4 free, 171.6 used. 6234.1 avail Mem
Burada free değerine aldanma. Linux belleği verimli kullanmak için cache’leme yapar, “boş” bellek her zaman o kadar değildir. avail Mem değeri daha gerçekçidir, sisteme yeni bir uygulama başlatsan ne kadar bellek kullanabilirsin bunu gösterir.
Swap kullanımına dikkat et. Biraz swap kullanımı normal olabilir ama aktif swap trafiği (swap in/out) sistem performansını çok ciddi etkiler.
Etkileşimli Komutlar: top’u Gerçekten Kullanmak
Burası çoğu sysadmin’in atlayıp geçtiği kısım. top sadece izlemek için değil, müdahale etmek için de kullanılabilir.
Sıralama ve Filtreleme
# top çalışırken klavye kısayolları:
P -> CPU kullanımına göre sırala (varsayılan)
M -> Bellek kullanımına göre sırala
T -> Çalışma süresine göre sırala
N -> PID'e göre sırala
R -> Sıralamayı ters çevir
Bir web sunucusunda PHP-FPM worker’larının belleği doldurduğunu düşündüğümde M tuşuna basarak bellek sıralamasına geçerim. Hemen hangisinin en fazla RAM yediği görünür.
Süreç Filtreleme ve Arama
# top içindeyken 'u' tuşuna basarak kullanıcıya göre filtrele
# Kullanıcı adını yaz ve Enter'a bas
# 'o' tuşuna basarak filtre ekle (büyük O)
# Örnek filtre: COMMAND=nginx
# Örnek filtre: %CPU>10.0
Gerçek dünya senaryosu: Üretim sunucusunda MySQL’in CPU’yu yorduğunu düşünüyorsun. top açıkken u tuşuna bas, mysql yaz, sadece MySQL süreçlerini görürsün. Eğer birden fazla MySQL thread’i varsa hangisinin problem yarattığını anlayabilirsin.
Süreçlere Müdahale
# top içindeyken 'k' tuşuna basarak kill sinyali gönder
# PID'i gir, Enter
# Sinyal numarasını gir (15 = SIGTERM, 9 = SIGKILL)
# 'r' tuşuyla sürecin nice değerini değiştir (renice)
# PID'i gir, Enter
# Nice değerini gir (-20 ile 19 arası, yüksek = düşük öncelik)
Bir sürecin önceliğini düşürmek için r komutunu kullanmak, tam kill etmekten çok daha nazik bir müdahaledir. Backup işlemi production trafiğini yavaşlatıyorsa, backup sürecini kill etmek yerine nice değerini 19’a çekebilirsin, iş yine yapar ama kenara çekilir.
Görünümü Özelleştirme
Sütunları Yönetmek
# top içindeyken 'f' tuşu ile alan yönetimine gir
# Space ile alanları seç/kaldır
# 'd' ile görüntülenecek alanları işaretle
# 'q' ile çık
Varsayılan sütunlar her zaman ihtiyacına uymayabilir. Mesela bir web sunucusunda ağ bağlantı sayısını değil, thread sayısını görmek isteyebilirsin. f menüsünden nTH (number of threads) sütununu ekleyebilirsin.
Renk Modu
# top içindeyken 'z' tuşu renkleri açar/kapatır
# 'b' tuşu running durumundaki süreçleri vurgular
# 'x' sıralama sütununu vurgular
# 'y' running task'ları vurgular
Gece vardiyasında karanlık odada z ile renk modunu açmak hayatı güzelleştirir. Running durumdaki süreçler parlak renkte gösterilir, gözden kaçırmazsın.
Çoklu CPU Görünümü
# top içindeyken '1' tuşu ile her CPU çekirdeğini ayrı göster
# Tekrar '1' basınca toplu görünüme döner
Çok çekirdekli sunucularda bu görünüm çok değerlidir. Bazen bir uygulama tek çekirdeği %100’e taşırken diğerleri boşta durur. Toplu görünümde average %25 gibi görünür ama aslında ciddi bir sorun var.
# Gerçek zamanlı izleme ile log kaydetmek için
top -b -n 10 -d 5 > /tmp/top_output.txt
# -b: batch modu (non-interactive)
# -n 10: 10 iterasyon çalış
# -d 5: 5 saniyede bir güncelle
Bu batch modu çok işe yarar. Bir performans sorunu yaşandığında “ne zaman ne oldu” sorusuna cevap vermek için belirli aralıklarla top çıktısını kayıt altına alabilirsin.
Gerçek Dünya Senaryoları
Senaryo 1: Sunucu Yavaş, Sebep Bilinmiyor
Gece alarm geldi, uygulama yavaşlamış. SSH ile bağlandın, ilk iş:
top
Üst kısıma bakıyorsun:
- Load average: 45.3, 38.2, 21.6 (normale göre çok yüksek)
- %wa (iowait): 67.4
iowait bu kadar yüksekse disk veya ağ sorunu var. CPU’ya bakmak yerine:
# Disk I/O durumunu kontrol et
iostat -x 1 5
# Hangi süreç disk yakalıyor?
iotop -ao
Senaryo 2: Memory Leak Şüphesi
Bir uygulama günler içinde giderek daha fazla RAM yiyor ve servisi yavaşlatıyor. top ile periyodik snapshot al:
# Her 60 saniyede bir, 1 saat boyunca memory snapshot al
top -b -n 60 -d 60 -u appuser | grep -E "^(top|Tasks|%Cpu|MiB|PID|java)" > /var/log/memory_trend.log
Bu çıktıyı analiz ettiğinde Java sürecinin zamanla nasıl büyüdüğünü görebilirsin.
Senaryo 3: Zombie Süreç Tespiti
Tasks: 203 total, 1 running, 198 sleeping, 0 stopped, 4 zombie
4 zombie süreci var. Bunlar kaynak tüketmez ama parent process’in temizlemediği süreçlerdir ve bu sayı büyümeye devam ederse problem işareti verir.
# Zombie süreçleri bul
ps aux | grep 'Z'
# Zombie'nin parent'ını bul (PPID sütununa bak)
ps -o pid,ppid,stat,comm | grep Z
# Parent'ı belirleyip loglarını kontrol et
Zombie’leri öldüremezsin, parent’ı öldürmek gerekir. Ama parent kritik bir süreçse (mesela init), dikkatli olmalısın.
Senaryo 4: CPU Spike Analizi
# Anlık yüksek CPU kullanan süreci tespit et
top -b -n 3 -d 1 | grep -v "^$" | head -30
# Belirli bir süreci sürekli izle
top -p $(pgrep -d',' php-fpm)
PHP-FPM birden fazla worker çalıştırıyorsa, pgrep -d',' ile tüm PID’leri virgülle ayırıp top -p‘ye verebilirsin.
top Konfigürasyonu ve Kaydetme
Ayarlarını kalıcı yapmak için top içindeyken W (büyük W) tuşuna basabilirsin. Bu ~/.config/procps/toprc dosyasına konfigürasyonu yazar.
# toprc dosyasını görüntüle
cat ~/.config/procps/toprc
# Ya da eski yerde arayabilirsin
cat ~/.toprc
Eğer birden fazla sunucuda aynı top görünümünü kullanmak istiyorsan bu dosyayı kopyalayabilirsin:
# toprc'yi sunucular arasında kopyala
scp ~/.config/procps/toprc user@server2:~/.config/procps/toprc
Faydalı top Kombo Kullanımları
# top başlatırken sıralamayı memory'e göre ayarla
top -o %MEM
# Sadece belirli sütunları göstererek batch çıktı al
top -b -n 1 | head -20
# Sistem özet bilgisini script'te kullanmak için
top -b -n 1 | grep "load average"
# Watch komutuyla birlikte (ama bu top'un kendisi gibi değil)
watch -n 2 'ps aux --sort=-%cpu | head -15'
# Yüksek CPU kullanan süreçleri otomatik logla
while true; do
date >> /var/log/high_cpu.log
top -b -n 1 | head -20 >> /var/log/high_cpu.log
sleep 30
done
Son örnek basit ama çok işe yarar. Production ortamında periyodik olarak top çıktısını loglayan bir loop başlatırsan, sonradan “o saatte ne olmuştu” sorusuna cevap verebilirsin.
top vs Alternatifler
top her yerde var ve sıfır bağımlılık gerektiriyor, bu en büyük avantajı. Ama bazı durumlarda alternatiflerine bakmak mantıklıdır:
- htop: Renkli, mouse desteği var, süreç ağacını gösterebiliyor. Kurulu değilse
apt install htopveyayum install htop. Günlük kullanım için daha konforlu. - atop: Tarihsel veri tutar, disk ve ağ I/O’yu daha iyi gösterir. Performans analizi için.
- glances: Python tabanlı, çok daha fazla metrik gösteriyor. Ama her sunucuda kurulu olmayabilir.
- nmon: IBM’den, özellikle AIX/RHEL sistemlerde popüler.
Ama tekrar söylüyorum: SSH açıldığında top her zaman orada olacak. Diğerleri bonus.
Güvenlik Açısından top
Beklenmedik süreçleri fark etmek için top kullanmak hafife alınmamalı. Bir sunucuda tanımadığın bir process görürsen:
# Süreci daha detaylı incele
ls -la /proc/PID/exe
cat /proc/PID/cmdline | tr '' ' '
# Sürecin açık dosyalarına bak
lsof -p PID
# Ağ bağlantılarına bak
ss -tunp | grep PID
Kripto madencisi veya backdoor gibi kötü amaçlı yazılımlar genellikle yüksek CPU kullanımıyla kendini ele verir. top‘ta tanımadığın, yüksek CPU/RAM kullanan bir süreç varsa araştır.
Sonuç
top komutu, 40 yıldır Linux dünyasının vazgeçilmez aracı olmayı sürdürüyor ve bunu hak ediyor. Basit görünümünün arkasında inanılmaz bir derinlik var. Sadece çalıştırıp bakmak yerine, etkileşimli komutları kullanmayı, batch modda log almayı ve sistem metriklerini doğru yorumlamayı öğrenince top gerçek anlamda güçlü bir araç haline geliyor.
Öğrendiğim en önemli şey şu: iyi bir sysadmin tool’ların her özelliğini ezbere bilmez, ama temel araçlarını derinlemesine tanır. top‘u gerçekten anlamak, daha fancy araçlara geçişi de kolaylaştırıyor çünkü temel kavramlar hep aynı kalıyor.
Bir dahaki sefer sunucu alarm verdiğinde, paniklemeden top aç, önce load average’a bak, sonra iowait’e, sonra sürece bak. Sistematik yaklaşım, gece 3’te bile seni doğru yöne götürür.