Merhaba arkadaşlar, bugün sizlere Linux sunucularımızda bellek (RAM) tüketimini analiz ederken çok işimize yarayan, benim de sıkça başvurduğum harika bir araçtan bahsedeceğim: smem.
`top` veya `free -m` komutları bize genel bellek durumunu gösterir ama hangi prosesin gerçekten ne kadar RAM kullandığını anlamak bazen karmaşık olabilir. Paylaşılan kütüphaneler (shared libraries) yüzünden bellek kullanımı raporları şişirilmiş (overestimated) görünebilir. İşte `smem` tam da bu noktada devreye giriyor ve PSS (Proportional Set Size) ile USS (Unique Set Size) gibi çok daha gerçekçi metrikler sunuyor.
smem Aracının Kurulumu
Öncelikle aracı sistemimize kuralım. Paket yöneticinize göre aşağıdaki komutlardan birini kullanabilirsiniz.
Debian/Ubuntu tabanlı sistemler için:
RHEL/CentOS/Fedora tabanlı sistemler için:
veya
Arch Linux için:
Kurulum basit ve hızlı. Tamamlandığına emin olduktan sonra asıl eğlenceli kısma geçebiliriz.
Temel smem Kullanımı ve Çıktıyı Anlama
En temel haliyle, tüm süreçleri listelemek için sadece `smem` komutunu çalıştırabilirsiniz. Ancak ben size daha kullanışlı birkaç parametre ile başlamanızı öneriyorum.
Bu komuttaki parametrelerin anlamı:
-t: Her sütunun ve toplamın özetini (summary) tablonun altında gösterir.
-k: Bellek değerlerini megabayt (MB) veya gigabayt (GB) gibi insanın anlayabileceği (human-readable) formatta gösterir.
Çıktıda göreceğiniz en önemli sütunlar şunlar:
USS (Unique Set Size): Bu, yalnızca o sürece özel, hiçbir şekilde paylaşılmayan bellek miktarıdır. Bir süreci sonlandırdığınızda kesin olarak boşaltılacak bellek budur. En kritik metrik.
PSS (Proportional Set Size): Paylaşılan bellek alanlarının, o alanı kullanan süreç sayısına bölünmüş halini içeren ölçüdür. Yani 10 MB'lık paylaşımlı bir kütüphaneyi 2 süreç kullanıyorsa, her bir sürecin PSS'sine bu kütüphaneden 5 MB eklenir. Gerçek bellek yükünü en iyi yansıtan ölçüttür.
RSS (Resident Set Size): `top` komutunda gördüğünüz, sürecin fiziksel RAM'de kapladığı toplam alandır. Paylaşılan kütüphanelerin tamamını içerdiği için genellikle şişirilmiş (overestimated) bir değer gösterir.
İhtiyaca Yönelik smem Sorgulamaları
Sadece belirli bir kullanıcının (örneğin `www-data`) süreçlerini görmek isterseniz:
-u parametresi kullanıcı bazlı özet çıktısı verir, -U parametresi ise filtreleme yapar.
Hangi uygulama (program ismi) ne kadar bellek tüketiyor, toplu halde görmek için:
Burada -P parametresi ile süreç isminde (comm alanı) "nginx", "mysql" veya "php" geçenleri filtreledik. Web sunucunuzdaki yaygın bileşenlerin durumunu hızlıca kontrol etmek için ideal.
Eğer çıktıyı sürekli izlemek isterseniz, klasik `watch` komutu ile birleştirebilirsiniz:
Bu komut, `www-data` kullanıcısının bellek kullanımını her 2 saniyede bir güncelleyerek ekrana getirecektir.
Dikkat Edilmesi Gerekenler ve Performans
`smem` aracı, bilgileri /proc dosya sisteminden okur. Bu işlem, özellikle çok sayıda süreç olduğunda hafif bir ek yük getirebilir. Canlı ve yük altındaki bir üretim sunucusunda saniyede bir çalıştırmak yerine, aralıklı olarak (örneğin sorun giderme sırasında) kullanmanızı öneririm.
Ayrıca, USS değerini doğru hesaplayabilmek için araç root (sudo) yetkilerine ihtiyaç duyar. Eğer "USS" sütununda sadece `0.00M` görüyorsanız, komutunuzu `sudo` ile çalıştırmalısınız.
Önemli bir dosya yolu olan /proc/[PID]/smaps dosyasını okuduğunu da bilmenizde fayda var. Eğer sisteminizde bu dosya okumasına izin verilmiyorsa (örneğin bazı güvenlik çekirdekleri - hardened kernels) `smem` beklediğiniz çıktıyı veremeyebilir.
Sonuç ve Tavsiyeler
Sunucunuzda anormal bellek tüketimi şikayetiniz varsa veya sadece kaynak planlaması yapıyorsanız, ilk bakacağınız araçlardan biri `smem` olmalı. Özellikle PSS değeri, paylaşımlı bellek sorununu ortadan kaldırdığı için hangi servise/uygulamaya odaklanmanız gerektiği konusunda size net ve temiz bir resim sunar.
Ben genellikle `smem -t -k` ile genel durumu, ardından şüphelendiğim uygulama veya kullanıcıyı `-P` ve `-U` parametreleri ile detaylı analiz ederim. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? `smem` dışında bellek analizi için favori araçlarınız var mı?
Sorularınız veya eklemek istedikleriniz için aşağıya yazmaktan çekinmeyin. Hep birlikte öğrenelim.
`top` veya `free -m` komutları bize genel bellek durumunu gösterir ama hangi prosesin gerçekten ne kadar RAM kullandığını anlamak bazen karmaşık olabilir. Paylaşılan kütüphaneler (shared libraries) yüzünden bellek kullanımı raporları şişirilmiş (overestimated) görünebilir. İşte `smem` tam da bu noktada devreye giriyor ve PSS (Proportional Set Size) ile USS (Unique Set Size) gibi çok daha gerçekçi metrikler sunuyor.
Öncelikle aracı sistemimize kuralım. Paket yöneticinize göre aşağıdaki komutlardan birini kullanabilirsiniz.
Debian/Ubuntu tabanlı sistemler için:
Bash:
sudo apt update && sudo apt install smem
RHEL/CentOS/Fedora tabanlı sistemler için:
Bash:
sudo yum install smem
Bash:
sudo dnf install smem
Arch Linux için:
Bash:
sudo pacman -S smem
Kurulum basit ve hızlı. Tamamlandığına emin olduktan sonra asıl eğlenceli kısma geçebiliriz.
En temel haliyle, tüm süreçleri listelemek için sadece `smem` komutunu çalıştırabilirsiniz. Ancak ben size daha kullanışlı birkaç parametre ile başlamanızı öneriyorum.
Bash:
smem -t -k
Bu komuttaki parametrelerin anlamı:
-t: Her sütunun ve toplamın özetini (summary) tablonun altında gösterir.
-k: Bellek değerlerini megabayt (MB) veya gigabayt (GB) gibi insanın anlayabileceği (human-readable) formatta gösterir.
Çıktıda göreceğiniz en önemli sütunlar şunlar:
USS (Unique Set Size): Bu, yalnızca o sürece özel, hiçbir şekilde paylaşılmayan bellek miktarıdır. Bir süreci sonlandırdığınızda kesin olarak boşaltılacak bellek budur. En kritik metrik.
PSS (Proportional Set Size): Paylaşılan bellek alanlarının, o alanı kullanan süreç sayısına bölünmüş halini içeren ölçüdür. Yani 10 MB'lık paylaşımlı bir kütüphaneyi 2 süreç kullanıyorsa, her bir sürecin PSS'sine bu kütüphaneden 5 MB eklenir. Gerçek bellek yükünü en iyi yansıtan ölçüttür.
RSS (Resident Set Size): `top` komutunda gördüğünüz, sürecin fiziksel RAM'de kapladığı toplam alandır. Paylaşılan kütüphanelerin tamamını içerdiği için genellikle şişirilmiş (overestimated) bir değer gösterir.
Sadece belirli bir kullanıcının (örneğin `www-data`) süreçlerini görmek isterseniz:
Bash:
sudo smem -u -k -t -U www-data
-u parametresi kullanıcı bazlı özet çıktısı verir, -U parametresi ise filtreleme yapar.
Hangi uygulama (program ismi) ne kadar bellek tüketiyor, toplu halde görmek için:
Bash:
smem -P "nginx|mysql|php" -t -k
Burada -P parametresi ile süreç isminde (comm alanı) "nginx", "mysql" veya "php" geçenleri filtreledik. Web sunucunuzdaki yaygın bileşenlerin durumunu hızlıca kontrol etmek için ideal.
Eğer çıktıyı sürekli izlemek isterseniz, klasik `watch` komutu ile birleştirebilirsiniz:
Bash:
watch -n 2 "smem -t -k -U www-data"
`smem` aracı, bilgileri /proc dosya sisteminden okur. Bu işlem, özellikle çok sayıda süreç olduğunda hafif bir ek yük getirebilir. Canlı ve yük altındaki bir üretim sunucusunda saniyede bir çalıştırmak yerine, aralıklı olarak (örneğin sorun giderme sırasında) kullanmanızı öneririm.
Ayrıca, USS değerini doğru hesaplayabilmek için araç root (sudo) yetkilerine ihtiyaç duyar. Eğer "USS" sütununda sadece `0.00M` görüyorsanız, komutunuzu `sudo` ile çalıştırmalısınız.
Önemli bir dosya yolu olan /proc/[PID]/smaps dosyasını okuduğunu da bilmenizde fayda var. Eğer sisteminizde bu dosya okumasına izin verilmiyorsa (örneğin bazı güvenlik çekirdekleri - hardened kernels) `smem` beklediğiniz çıktıyı veremeyebilir.
Sunucunuzda anormal bellek tüketimi şikayetiniz varsa veya sadece kaynak planlaması yapıyorsanız, ilk bakacağınız araçlardan biri `smem` olmalı. Özellikle PSS değeri, paylaşımlı bellek sorununu ortadan kaldırdığı için hangi servise/uygulamaya odaklanmanız gerektiği konusunda size net ve temiz bir resim sunar.
Ben genellikle `smem -t -k` ile genel durumu, ardından şüphelendiğim uygulama veya kullanıcıyı `-P` ve `-U` parametreleri ile detaylı analiz ederim. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? `smem` dışında bellek analizi için favori araçlarınız var mı?
Sorularınız veya eklemek istedikleriniz için aşağıya yazmaktan çekinmeyin. Hep birlikte öğrenelim.