Sisteminizde bir şeyler yavaşlamaya başladığında, ilk refleks genellikle “acaba bellek mi doldu?” sorusunu sormak olur. Ve bu soruyu cevaplamak için Linux’ta elinizin altındaki en hızlı araç free komutudur. Tek satır çıktısıyla sizi yanıltabilir, ama doğru okumayı öğrendiğinizde inanılmaz derecede bilgi dolu bir komuttur. Gelin bu komutu her detayıyla inceleyelim.
free Komutu Nedir ve Ne İşe Yarar?
free komutu, sisteminizdeki fiziksel bellek (RAM) ve takas alanı (swap) kullanımını gösterir. /proc/meminfo dosyasını okuyarak bu bilgileri sizin için anlamlı bir şekilde sunar. Aslında /proc/meminfo dosyasına bakarak da aynı bilgilere ulaşabilirsiniz, ama free bunu çok daha okunabilir hale getirir.
Temel kullanımı son derece basit:
free
Bu komutu çalıştırdığınızda şuna benzer bir çıktı görürsünüz:
total used free shared buff/cache available
Mem: 16234496 4521872 8432156 342108 3280468 11089452
Swap: 2097148 0 2097148
İşte burada çoğu kişi “used” kolonuna bakıp panikler ya da “free” kolonuna bakıp rahatlar. Ama ikisi de tam doğru değil. Bu çıktıyı satır satır, sütun sütun anlamak gerekiyor.
Çıktıyı Anlamlandırmak
Mem Satırı
total: Sisteminizde kurulu olan toplam RAM miktarıdır. Bunun biraz altında görünmesinin sebebi çekirdek (kernel) tarafından rezerve edilen alanlardır.
used: Şu an kullanımda olan bellek miktarıdır. Ancak bu rakama körü körüne güvenmeyin. Linux, kullanılmayan RAM’i boşa bırakmak yerine disk önbelleği (cache) olarak kullanır. Bu yüzden “used” rakamı gerçekten uygulamaların kullandığından yüksek görünebilir.
free: Kesinlikle hiçbir şey tarafından kullanılmayan boş bellek. Bu rakamın düşük olması her zaman sorun değildir, hatta sağlıklı bir Linux sisteminde bu rakamın küçük olması normaldir.
shared: Birden fazla süreç tarafından paylaşılan bellek miktarı. Genellikle tmpfs tarafından kullanılan alan buraya dahil edilir.
buff/cache: Tampon (buffer) ve önbellek (cache) için ayrılan bellek. Kernel bu alanı disk I/O işlemlerini hızlandırmak için kullanır. Bir uygulama belleğe ihtiyaç duyduğunda bu alan geri verilir.
available: İşte bu sütun altın değerinde. Yeni bir uygulama başlatmak istediğinizde swap’a gitmeden kullanılabilecek tahmini bellek miktarıdır. Swap kullanılıyor mu diye bakacaksanız, asıl bu kolona bakın.
Swap Satırı
Swap alanı, RAM dolduğunda devreye giren disk tabanlı sanal bellek alanıdır. Swap kullanımının yüksek olması genellikle sisteminizin RAM açısından zorlandığının işaretidir.
Birim Seçenekleri ile Okunabilirliği Artırma
Varsayılan olarak free komutu kilobayt cinsinden çıktı verir. Bu rakamları kafanızda çevirmek yerine farklı birim seçeneklerini kullanabilirsiniz.
# Megabayt cinsinden
free -m
# Gigabayt cinsinden
free -g
# İnsan tarafından okunabilir format (otomatik birim seçimi)
free -h
-h parametresi günlük kullanımda en sık tercih edilen seçenektir. Otomatik olarak MB, GB gibi uygun birimi seçer:
free -h
total used free shared buff/cache available
Mem: 15G 4.3G 8.0G 334M 3.1G 10G
Swap: 2.0G 0B 2.0G
Böylece “16234496 KB” yerine “15G” gibi anlaşılır bir değer görürsünüz.
Sürekli İzleme: -s Parametresi
Bir sorun yaşanıyor ve bellek kullanımını anlık takip etmek istiyorsunuz. -s parametresi ile belirli aralıklarla otomatik güncelleme alabilirsiniz:
# Her 2 saniyede bir güncelle
free -h -s 2
# Her 5 saniyede bir güncelle, daha okunabilir format
free -m -s 5
Bu kullanım watch komutuna benzer bir işlev görür. Özellikle bir script çalışırken ya da yoğun bir yedekleme işlemi sırasında bellek nasıl davranıyor diye izlemek istediğinizde çok kullanışlıdır.
-c parametresiyle kaç kez güncelleme yapılacağını da belirtebilirsiniz:
# 3 saniyede bir, toplam 10 kez göster
free -h -s 3 -c 10
watch ile Kombinasyon
Daha güzel bir sürekli izleme deneyimi için watch komutuyla birleştirebilirsiniz:
# Her 2 saniyede bir güncelle, değişiklikleri vurgula
watch -n 2 -d free -h
-d parametresi değişen değerleri vurgular, bu sayede hangi kolonun değiştiğini hemen fark edersiniz. Üretim sistemlerinde bir sorun araştırırken bu komut açık kalmak ister.
/proc/meminfo ile Derinlemesine Bakış
free komutunun gösterdiğinden daha fazla detay istiyorsanız, kaynak dosyaya direkt bakabilirsiniz:
cat /proc/meminfo
Bu dosya çok daha fazla bilgi içerir. free komutunun göstermediği Dirty, Writeback, Slab gibi değerleri buradan görebilirsiniz. Bir bellek sızıntısı (memory leak) araştırırken bu dosya gerçekten işe yarar.
Gerçek Dünya Senaryosu 1: Sunucu Yavaşlamış, Ne Yapmalı?
Gece 2’de telefon geliyor. “Sunucu çok yavaş, ne oldu?” Uzaktan bağlanıyorsunuz ve ilk komutunuz şu:
free -h
total used free shared buff/cache available
Mem: 32G 31G 200M 1.2G 600M 400M
Swap: 4.0G 3.8G 200M
Bu çıktı alarm zillerini çaldırmalı. available sütunu sadece 400M, üstelik swap’ın neredeyse tamamı kullanımda. Sistem RAM’i tüketmiş ve swap’a taşmış durumda. Bu noktada bir sonraki adım hangi sürecin belleği yuttuğunu bulmak:
# Bellek kullanımına göre sıralı süreç listesi
ps aux --sort=-%mem | head -20
# Ya da daha okunabilir bir format için
ps aux --sort=-%mem | awk 'NR<=10 {print $2, $4, $11}'
Buldunuz. Bir Java uygulaması 28 GB bellek yiyor. Restart zamanı.
Gerçek Dünya Senaryosu 2: buff/cache Yanıltması
Yeni bir junior sysadmin panikleyerek geliyor. “Sunucumuzda çok az boş bellek var, RAM eklememiz mi gerekiyor?” diye soruyor. free -h çıktısına bakıyorsunuz:
total used free shared buff/cache available
Mem: 16G 14G 500M 200M 1.5G 10G
Swap: 2.0G 0B 2.0G
“free” kolonuna bakınca gerçekten sadece 500M boş gibi görünüyor. Ama available kolonuna bakın: 10G! Swap kullanımı sıfır. Sistem gayet sağlıklı. Kernel 14GB olarak görünen kullanımın büyük kısmını cache olarak tutuyor ama ihtiyaç olsa hemen uygulamalara verebilir. Ekstra RAM almaya gerek yok.
Bu senaryo, free komutunu yüzeysel okumanın nasıl yanlış kararlara yol açabileceğini gösteriyor. Junior arkadaşa available kolonunun önemini anlatmak için bu fırsatı değerlendirin.
Cache’i Manuel Olarak Temizleme
Nadiren gerekli olsa da, test ortamlarında ya da belirli benchmark senaryolarında cache’i temizlemek isteyebilirsiniz. Bunu yapmak için:
# Önce sync ile disk yazımlarını tamamla
sync
# Cache'i temizle (1: page cache, 2: dentries ve inodes, 3: her ikisi)
echo 3 > /proc/sys/vm/drop_caches
Bunu yaptıktan sonra free -h ile bakarsanız “free” kolonunun dramatik biçimde arttığını görürsünüz. Ama şunu bilin: bu işlemi üretim sisteminde yapmak performansı geçici olarak düşürür çünkü kernel önbelleği yeniden oluşturmak zorunda kalır. Test dışında çoğu senaryoda buna gerek yoktur.
Script’lerde free Komutunu Kullanmak
free komutunun asıl gücü script’lerde ortaya çıkar. Bellek kullanımını parse edip belirli bir eşiği aştığında uyarı gönderebilirsiniz.
#!/bin/bash
# Basit bellek uyarı scripti
THRESHOLD=90 # Yüzde olarak
# Toplam ve kullanılabilir belleği al
TOTAL=$(free | awk '/^Mem:/{print $2}')
AVAILABLE=$(free | awk '/^Mem:/{print $7}')
USED=$((TOTAL - AVAILABLE))
USAGE_PERCENT=$((USED * 100 / TOTAL))
echo "Toplam RAM: $((TOTAL / 1024)) MB"
echo "Kullanılan: $((USED / 1024)) MB"
echo "Kullanılabilir: $((AVAILABLE / 1024)) MB"
echo "Kullanım yüzdesi: %$USAGE_PERCENT"
if [ $USAGE_PERCENT -gt $THRESHOLD ]; then
echo "UYARI: Bellek kullanımı eşik değerini aştı! (%$USAGE_PERCENT)"
# Buraya mail gönderme, Slack bildirimi vs. ekleyebilirsiniz
fi
Bu script’i cron’a ekleyerek periyodik kontrol yapabilirsiniz:
# /etc/crontab'a ekle, her 15 dakikada bir çalıştır
*/15 * * * * root /usr/local/bin/memory_check.sh >> /var/log/memory_check.log 2>&1
Swap Kullanımını Analiz Etmek
Swap kullanımı varsa hangi süreçlerin swap kullandığını görmek için hazır bir araç olmasa da şu script işe yarar:
#!/bin/bash
# Swap kullanan süreçleri listele
echo "PID | İsim | Swap Kullanımı (KB)"
echo "--------------------------------"
for pid in /proc/[0-9]*/status; do
proc_pid=$(echo $pid | cut -d'/' -f3)
proc_name=$(cat /proc/$proc_pid/comm 2>/dev/null)
swap_kb=$(grep VmSwap $pid 2>/dev/null | awk '{print $2}')
if [ ! -z "$swap_kb" ] && [ "$swap_kb" -gt 0 ] 2>/dev/null; then
echo "$proc_pid | $proc_name | $swap_kb KB"
fi
done | sort -t'|' -k3 -rn | head -20
Bu script hangi süreçlerin ne kadar swap kullandığını gösterir. Swap kullanan bir süreç bulduğunuzda restart edip etmeyeceğinize ya da daha fazla RAM ekleyip eklemeyeceğinize karar verebilirsiniz.
Parametrelerin Tam Listesi
free komutunun desteklediği temel parametreler:
- -b: Çıktıyı bayt cinsinden gösterir
- -k: Kilobayt cinsinden gösterir (varsayılan)
- -m: Megabayt cinsinden gösterir
- -g: Gigabayt cinsinden gösterir
- -h: İnsan tarafından okunabilir format, otomatik birim seçer
- -s N: N saniye aralıklarla sürekli günceller
- -c N: Toplam N kez günceller, -s ile birlikte kullanılır
- -t: Mem ve Swap satırlarına ek olarak toplam satırı ekler
- -w: Geniş format, buff ve cache sütunlarını ayırır
- -l: Yüksek ve düşük bellek istatistiklerini gösterir (eski sistemler)
- –si: 1000 tabanlı (SI) birim kullanır, 1024 yerine
-t ve -w ile Daha Detaylı Çıktı
# Toplam satırını ekle
free -h -t
total used free shared buff/cache available
Mem: 15G 4.3G 8.0G 334M 3.1G 10G
Swap: 2.0G 0B 2.0G
Total: 17G 4.3G 10G
-w parametresi buffer ve cache’i ayrı sütunlarda gösterir, daha granüler analiz için kullanışlıdır:
free -h -w
total used free shared buffers cache available
Mem: 15G 4.3G 8.1G 334M 124M 3.0G 10G
Swap: 2.0G 0B 2.0G
vmstat ile Birlikte Kullanım
free anlık bir snapshot sunar. Ama bellek üzerindeki zaman içindeki baskıyı görmek için vmstat ile birlikte kullanmak daha iyi bir tablo oluşturur:
# Her 2 saniyede bir vmstat çıktısı, ilk 10 satır
vmstat 2 10
vmstat çıktısında si ve so kolonlarına dikkat edin. Bunlar swap in ve swap out değerleridir. Bu değerler sıfırdan büyükse sistem aktif olarak swap yapıyor demektir, yani bellek baskısı altında.
OOM Killer Nedir ve free ile Nasıl İlişkilidir?
Linux çekirdeğinde Out of Memory (OOM) Killer adında bir mekanizma vardır. Sistem belleği tamamen tükettiğinde kernel bir veya birden fazla süreci öldürerek belleği kurtarır. Bunu hiç yaşadıysanız bilirsiniz, genellikle kritik olmayan bir şeyi değil, en çok bellek kullananı öldürür.
OOM Killer’ın devreye girip girmediğini kontrol etmek için:
dmesg | grep -i "oom|out of memory|killed process"
Eğer bu mesajları görüyorsanız, sisteminiz ciddi bellek sıkıntısı yaşıyor demektir ve free -h çıktısına bakarak durumu analiz etmeye başlamalısınız.
Gerçek Dünya Senaryosu 3: Monitoring Dashboard İçin Bellek Verisi
Özel bir monitoring dashboard’u kuruyorsunuz ve bellek verilerini periyodik olarak bir log dosyasına yazmak istiyorsunuz:
#!/bin/bash
# Bellek istatistiklerini timestamp ile logla
LOG_FILE="/var/log/memory_stats.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# free çıktısından değerleri parse et
read TOTAL USED FREE SHARED BUFF_CACHE AVAILABLE < <(free -m | awk '/^Mem:/{print $2, $3, $4, $5, $6, $7}')
read SWAP_TOTAL SWAP_USED SWAP_FREE < <(free -m | awk '/^Swap:/{print $2, $3, $4}')
USAGE_PERCENT=$(echo "scale=2; $USED * 100 / $TOTAL" | bc)
echo "$TIMESTAMP | RAM: ${TOTAL}MB | Used: ${USED}MB (%${USAGE_PERCENT}) | Available: ${AVAILABLE}MB | Swap Used: ${SWAP_USED}MB" >> $LOG_FILE
Bu script cron ile her dakika çalıştırılıp log dosyasına yazılabilir. Sonrasında bu log dosyasını analiz ederek bellek kullanım trendlerini görebilirsiniz.
Bellek Sızıntısı Tespiti İçin Pratik Yaklaşım
Bir uygulamanın zamanla giderek daha fazla bellek kullandığını düşünüyorsanız, belirli aralıklarla o uygulamanın PID’ini takip edebilirsiniz:
#!/bin/bash
# Belirli bir uygulamanın bellek kullanımını izle
APP_NAME="java"
INTERVAL=60 # saniye
echo "Zaman | PID | RSS (KB) | VSZ (KB)"
echo "-----------------------------------"
while true; do
TIMESTAMP=$(date '+%H:%M:%S')
ps aux | grep "$APP_NAME" | grep -v grep | while read line; do
PID=$(echo $line | awk '{print $2}')
RSS=$(echo $line | awk '{print $6}')
VSZ=$(echo $line | awk '{print $5}')
echo "$TIMESTAMP | $PID | $RSS | $VSZ"
done
sleep $INTERVAL
done
Bu scripti çalıştırıp çıktısını bir dosyaya yönlendirin. Birkaç saat sonra RSS (Resident Set Size) değerinin sürekli artıp artmadığına bakın. Artıyorsa bellek sızıntısı var demektir.
free vs top vs htop
free komutu bellek odaklı, hızlı bir bakış için idealdir. Ama hangi durumda hangisini kullanmalı?
- free: Anlık bellek ve swap özetine bakmak için. Script’lerde parse etmek için ideal.
- top: Bellek ve CPU kullanımını süreç bazında görmek için. Etkileşimli.
- htop: top’un daha güzel arayüzlü versiyonu. Renk kodlaması ve mouse desteği var.
- vmstat: Zaman içindeki bellek trendini görmek için.
- smem: Paylaşılan belleği daha doğru hesaplamak için. Çoğu sistemde ayrıca kurulması gerekir.
Günlük operasyonda genellikle free -h ile başlar, sorun varsa top ya da htop‘a geçersiniz.
Sonuç
free komutu ilk bakışta basit görünse de doğru okunduğunda sisteminizin bellek durumu hakkında son derece değerli bilgiler verir. En kritik nokta şu: “free” sütununun düşük olması sorun değil, “available” sütununun düşük olması sorun. Swap kullanımının artması ise dikkat gerektiren bir sinyal.
Günlük kullanım için free -h yeterlidir. Sorun araştırırken -w ile buffer ve cache’i ayırın, sürekli izleme için watch -n 2 free -h kombinasyonunu kullanın. Script’lerde ise awk ile değerleri parse edip threshold bazlı uyarı sistemleri kurun.
Linux’ta bellek yönetimi, Windows’a alışkın olanlar için biraz farklı bir zihinsel model gerektirir. Kernel’in boş RAM’i cache olarak kullanması bir sorun değil, bir optimizasyondur. Bu farkı anlayan sysadmin, gereksiz yere paniklemez ve doğru kararlar alır. free komutunu iyi okuyan bir sysadmin, ekstra RAM satın almadan önce iki kez düşünür.