Merhaba arkadaşlar, bugün sizlere özellikle yüksek trafikli sunucularınızda karşılaşabileceğiniz sinsi bir sorundan, CPU yük dengesizliğinden ve bunu nasıl ayrıntılı izleyip tespit edeceğinizden bahsedeceğim. Çoğu zaman toplam CPU kullanımı %30-40 gibi normal görünür ama bir bakarsınız ki tek bir çekirdek %100'e takılmış, uygulamanız yavaşlamıştır. Bu rehberle, bu gizli sorunu nasıl ortaya çıkaracağınızı adım adım göstereceğim.
Neden Çekirdek Bazlı İzleme Önemli?
Modern sunucularımız çok çekirdekli işlemcilerle geliyor. Ancak birçok uygulama, özellikle de tek thread (iş parçacığı) ile çalışan veya thread'lerini iyi yönetemeyen uygulamalar, yükü tüm çekirdeklere eşit dağıtamaz. Bu durumda, bir çekirdek tam kapasite çalışırken diğerleri boşta kalabilir. Sistem genelinde bir sıkıntı yokmuş gibi görünse de, o tek çekirdekteki kuyruğa giren işlemler genel performansı ve kullanıcı deneyimini ciddi şekilde düşürür. Benim sunucularda genelde ilk baktığım noktalardan biridir.
Temel ve İleri Seviye İzleme Araçları
Öncelikle, komut satırından hızlıca durumu analiz edebileceğimiz birkaç temel aracı hatırlayalım.
`top` komutunu çalıştırdıktan sonra "1" (bir) tuşuna basarsanız, tüm CPU çekirdeklerinin ayrı ayrı kullanım istatistiklerini görebilirsiniz. Bu ilk ve hızlı bakış için mükemmeldir.
Daha detaylı ve renkli bir görünüm için `htop` kullanmanızı şiddetle tavsiye ederim. Kurulumu basittir:
`htop`'u çalıştırdığınızda, ekranın üst kısmında her bir CPU çekirdeğinin (CPU0, CPU1...) canlı grafiklerini ve yüzde kullanımlarını net bir şekilde göreceksiniz. Benim sunucularda genelde kullandığım yöntem budur.
Ancak, gerçekten derinlemesine analiz ve geçmişe dönük veri toplamak için `mpstat` aracı en iyi dostunuz olacak. `sysstat` paketi ile gelir.
`mpstat`'ı tüm çekirdekler için, 2 saniye aralıklarla çalıştıralım:
Bu komut, her çekirdeğin `%usr`, `%sys`, `%iowait`, `%irq` gibi ayrıntılı istatistiklerini 2 saniyede bir güncelleyecek şekilde ekrana basar. Burada özellikle bir çekirdekteki `%usr` (kullanıcı modu) veya `%sys` (sistem modu) değerinin sürekli yüksek olup olmadığına bakmalısınız.
Yük Dengesizliği Tespiti ve Kök Neden Analizi
Peki, bir çekirdeğin aşırı yüklü olduğunu gördük. Sıra geldi "Hangi süreç buna neden oluyor?" sorusunu cevaplamaya. İşte burada `pidstat` ve `taskset` gibi araçlar devreye giriyor.
Hangi işlemlerin hangi CPU'larda çalıştığını ve ne kadar CPU kullandığını görmek için `pidstat` mükemmeldir. Aşağıdaki komut, tüm süreçlerin CPU kullanımını her 2 saniyede bir, çekirdek bazında gösterir:
Çıktıda `CPU` sütununa dikkat edin. Bu sütun, ilgili sürecin/task'ın o an hangi CPU çekirdeğinde çalıştığını gösterir. Sürekli aynı çekirdek numarasında görünen ve yüksek `%CPU` değeri olan bir süreç, şüpheliniz olabilir.
Daha da ileri gitmek ve bir sürecin CPU afinitelerini (yani hangi çekirdeklerde çalışabileceğini) görmek için `taskset` kullanabilirsiniz. Örneğin, PID'si 1234 olan bir sürecin bağlı olduğu CPU'ları görelim:
Çıktı `pid 1234's current affinity list: 0-7` gibi bir şey olacaktır. Bu, sürecin 0'dan 7'ye kadar tüm çekirdeklerde çalışabileceği anlamına gelir. Eğer çıktı `pid 1234's current affinity list: 2` ise, bu süreç sadece 2 numaralı çekirdeğe kilitlenmiş demektir ve bu da yük dengesizliğinin klasik bir nedenidir!
Perf ile Profil Oluşturma ve Sonuç
Eğer sorun bir uygulamanın içindeyse ve hangi fonksiyonun sürekli bir çekirdeği meşgul ettiğini bulmanız gerekiyorsa, `perf` aracı ile profil (profile) oluşturabilirsiniz. Bu, biraz daha ileri seviye bir tekniktir.
Öncelikle `perf`'i kurun ve ardından belirli bir süre (örneğin 30 saniye) boyunca sisteminizin profilini çıkarın:
`perf report` çıktısı, hangi fonksiyonların en çok CPU zamanı harcadığını gösterecektir. Bu, geliştirici ekibinize performans sorununu raporlamak için altın değerinde bir bilgidir.
Özet ve Tavsiyeler
Şu ayara çok dikkat etmelisiniz: Sadece genel CPU kullanımına bakmak yeterli değil. Düzenli olarak `htop` veya `mpstat` ile çekirdek bazlı kullanımı kontrol edin. Sürekli yüksek görünen bir çekirdek varsa, `pidstat` ve `taskset` ile suçluyu bulun. Sorun bir uygulama içindeyse, `perf` ile derinlemesine inceleme yapın.
Bu izleme adımlarını, özellikle canlı sistemlerde yük testi sırasında veya performans şikayeti geldiğinde mutlaka uygulayın. Birçok gizli performans sorununun kilidini açacaktır.
Peki ya siz? CPU yük dengesizliği sorunlarıyla karşılaştınız mı? Bu konfigürasyonu ve izleme yöntemlerini kendi sunucularınızda nasıl yapıyorsunuz? Ya da bu araçlarla ilgili farklı ipuçlarınız var mı? Deneyimlerinizi ve sorularınızı aşağıya yazmaktan çekinmeyin, birlikte tartışalım.
Modern sunucularımız çok çekirdekli işlemcilerle geliyor. Ancak birçok uygulama, özellikle de tek thread (iş parçacığı) ile çalışan veya thread'lerini iyi yönetemeyen uygulamalar, yükü tüm çekirdeklere eşit dağıtamaz. Bu durumda, bir çekirdek tam kapasite çalışırken diğerleri boşta kalabilir. Sistem genelinde bir sıkıntı yokmuş gibi görünse de, o tek çekirdekteki kuyruğa giren işlemler genel performansı ve kullanıcı deneyimini ciddi şekilde düşürür. Benim sunucularda genelde ilk baktığım noktalardan biridir.
Öncelikle, komut satırından hızlıca durumu analiz edebileceğimiz birkaç temel aracı hatırlayalım.
`top` komutunu çalıştırdıktan sonra "1" (bir) tuşuna basarsanız, tüm CPU çekirdeklerinin ayrı ayrı kullanım istatistiklerini görebilirsiniz. Bu ilk ve hızlı bakış için mükemmeldir.
Bash:
top
Daha detaylı ve renkli bir görünüm için `htop` kullanmanızı şiddetle tavsiye ederim. Kurulumu basittir:
Bash:
sudo apt-get install htop # Debian/Ubuntu
sudo yum install htop # RHEL/CentOS
`htop`'u çalıştırdığınızda, ekranın üst kısmında her bir CPU çekirdeğinin (CPU0, CPU1...) canlı grafiklerini ve yüzde kullanımlarını net bir şekilde göreceksiniz. Benim sunucularda genelde kullandığım yöntem budur.
Ancak, gerçekten derinlemesine analiz ve geçmişe dönük veri toplamak için `mpstat` aracı en iyi dostunuz olacak. `sysstat` paketi ile gelir.
Bash:
sudo apt-get install sysstat # Debian/Ubuntu
sudo yum install sysstat # RHEL/CentOS
`mpstat`'ı tüm çekirdekler için, 2 saniye aralıklarla çalıştıralım:
Bash:
mpstat -P ALL 2
Bu komut, her çekirdeğin `%usr`, `%sys`, `%iowait`, `%irq` gibi ayrıntılı istatistiklerini 2 saniyede bir güncelleyecek şekilde ekrana basar. Burada özellikle bir çekirdekteki `%usr` (kullanıcı modu) veya `%sys` (sistem modu) değerinin sürekli yüksek olup olmadığına bakmalısınız.
Peki, bir çekirdeğin aşırı yüklü olduğunu gördük. Sıra geldi "Hangi süreç buna neden oluyor?" sorusunu cevaplamaya. İşte burada `pidstat` ve `taskset` gibi araçlar devreye giriyor.
Hangi işlemlerin hangi CPU'larda çalıştığını ve ne kadar CPU kullandığını görmek için `pidstat` mükemmeldir. Aşağıdaki komut, tüm süreçlerin CPU kullanımını her 2 saniyede bir, çekirdek bazında gösterir:
Bash:
pidstat -tu 2
Çıktıda `CPU` sütununa dikkat edin. Bu sütun, ilgili sürecin/task'ın o an hangi CPU çekirdeğinde çalıştığını gösterir. Sürekli aynı çekirdek numarasında görünen ve yüksek `%CPU` değeri olan bir süreç, şüpheliniz olabilir.
Daha da ileri gitmek ve bir sürecin CPU afinitelerini (yani hangi çekirdeklerde çalışabileceğini) görmek için `taskset` kullanabilirsiniz. Örneğin, PID'si 1234 olan bir sürecin bağlı olduğu CPU'ları görelim:
Bash:
taskset -pc 1234
Çıktı `pid 1234's current affinity list: 0-7` gibi bir şey olacaktır. Bu, sürecin 0'dan 7'ye kadar tüm çekirdeklerde çalışabileceği anlamına gelir. Eğer çıktı `pid 1234's current affinity list: 2` ise, bu süreç sadece 2 numaralı çekirdeğe kilitlenmiş demektir ve bu da yük dengesizliğinin klasik bir nedenidir!
Eğer sorun bir uygulamanın içindeyse ve hangi fonksiyonun sürekli bir çekirdeği meşgul ettiğini bulmanız gerekiyorsa, `perf` aracı ile profil (profile) oluşturabilirsiniz. Bu, biraz daha ileri seviye bir tekniktir.
Öncelikle `perf`'i kurun ve ardından belirli bir süre (örneğin 30 saniye) boyunca sisteminizin profilini çıkarın:
Bash:
sudo apt-get install linux-tools-common linux-tools-$(uname -r) # Ubuntu
sudo perf record -a -g -- sleep 30
sudo perf report --stdio
`perf report` çıktısı, hangi fonksiyonların en çok CPU zamanı harcadığını gösterecektir. Bu, geliştirici ekibinize performans sorununu raporlamak için altın değerinde bir bilgidir.
Şu ayara çok dikkat etmelisiniz: Sadece genel CPU kullanımına bakmak yeterli değil. Düzenli olarak `htop` veya `mpstat` ile çekirdek bazlı kullanımı kontrol edin. Sürekli yüksek görünen bir çekirdek varsa, `pidstat` ve `taskset` ile suçluyu bulun. Sorun bir uygulama içindeyse, `perf` ile derinlemesine inceleme yapın.
Bu izleme adımlarını, özellikle canlı sistemlerde yük testi sırasında veya performans şikayeti geldiğinde mutlaka uygulayın. Birçok gizli performans sorununun kilidini açacaktır.
Peki ya siz? CPU yük dengesizliği sorunlarıyla karşılaştınız mı? Bu konfigürasyonu ve izleme yöntemlerini kendi sunucularınızda nasıl yapıyorsunuz? Ya da bu araçlarla ilgili farklı ipuçlarınız var mı? Deneyimlerinizi ve sorularınızı aşağıya yazmaktan çekinmeyin, birlikte tartışalım.