Wednesday, July 25, 2007

JConsole ile Performans Gözlem - Part 1

Performans Gözlemlemek sistemler için vazgeçilmez bir kavramdır. Bir sistemde oluşan sorunlar kadar, oluşabilecek sorunları önceden tahmin edebilmek de hayati bir aksiyondur. Sorun oluştuğu esnada sistemin parametrelerini gözlemleyebilmek ve sorunun sebebini bulmak hayat bile kurtarabilir.

İşte JConsole, eğer java tabanlı uygulamalar geliştiriyorsanız, işinize yarayacak güzel bir araç. En büyük özelliği JDK (5.0 ve sonrası) ile birlikte bedava geliyor olmasına rağmen boyundan büyük işler yapıyor olması. Geliştirdiğimiz projede yaklaşık 1 yıldır JConsole'dan faydalanıyoruz. Kullanımı çok basit, ama söylediğim gibi yaptıkları çok büyük.

Avantajları ve Dezavantajları

  • En büyük avantajı, izlenilmek istenilen sistemler üzerine yük getirmiyor olması. Performans gözlem araçları, genellikle, izlenilmek istenen uygulamanın yanına bir agent kurarlar. Bu agent aracılığı ile merkezi bir server'a bilgi gönderirler. Ve izlenilen uygulamaya yük getirir.
  • Bir diğer avantajı, kurulumunun ve hayata geçirilmesinin çok kolay olmasıdır.
  • Bunun dışında belli bir süre gözlemledikten sonra (yaklaşık 7-8 saat) merkezi izlemenin yapıldığı sistemde (Genellikle PC olur bu) performans sıkıntısı yaratabilir.
  • Verdiği bilgiler, çok detaylı bilgiler değildir. Yani memory ve cpu (JDK 6 ile birlikte) gözlemlenebilir, ama response time ve throughput değerleri gözlemlenemez (en azından eklentiler olmadan).
  • JDK 6.0'dan sonra JConsole'a eklenti yazılabilme esnekliği getirilmiştir.

Bu avantaj ve dezavantajlar daha detaylandırılabilir.

JBoss üzerine nasıl JConsole'un yerleştirilebileceğini ve gözlemlediğimiz bilgilerin ne anlama geleceğini aşağıda anlatmaya çalışacağım.

Kurulumu ve Çalıştırılması

1. JVM argument'larının java satırına eklenmesi

Öncelikle, java ile çalıştırılan komuta bazı eklentiler yapmamız gerekiyor. Bunun için run.sh içerisinde JAVA_OPTS değişkenini bulup bunun sonuna

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

attribute'larını eklememiz gerekiyor. Bu attribute'lardan bizi ilgilendiren ve ileride kullanacağımız jmxremote.port, yani 9000.. Bu, merkezi açtığımız jconsole'un remote olarak bağlanacağı makinenin hangi porttan bilgileri vereceğini gösteriyor. Sonra tabi ki sunucuyu restart etmemiz gerekiyor. Açılırken herhangi birşey yüklemiyor. Bu konuda kafanız rahat olsun, sadece verdiğimiz porttan JConsole isteklerini dinleyip, bunlara response verecek.

2. Local'den JConsole'un çalıştırılıp remote sunucuya bağlanması

${JDK5_HOME}/bin altında jconsole.exe var. Bunu çalıştırıyoruz ve bitti, evet bu kadar. Ne kurulum yaptık, ne de konfigürasyon ayarladık. Dediğim kadar basitmiş değil mi? Karşımıza aşağıdaki Figure 1'deki ekran geliyor. Host or IP kısmına incelemek istediğimiz IP'yi, port kısmına jmxremote.port attribute'unda verdiğimiz port numarasını yazıyoruz...

Figure 1

Login işlemi sona erdiğinde önünüze gelen Figure 2'deki ekranda JVM ile ilgili genel bilgileri görebilirsiniz. Bu ekranda en çok kullandıklarımı ve zaman zaman sorun çıktığında başvurduğum bilgileri aşağıda kısaca açıklamaya çalışacağım.

Uptime = Server'ın ne kadar süredir çalıştığını gösterir. Bunu availability ile ilgili birilerine birşeyler kanıtlamam gerektiğinde kullanırım. Mesela bu ekranda server'ın yaklaşık 6 gündür ayakta olduğu görünüyor.
LiveThreads = JVM içerisindeki aktif thread sayısını görürsünüz. Bu sayı sistemin çalışması esnasında belli bir sayı aralığında dolaşır. mesela 60-90 arasında. Ama bunun üzerine çıkmaya başlarsa sistemde bir sorun başgösteriyor olabilir.
Memory ve classes için ayrı bir tab mevcut dolayısıyla bundan sonra bahsedeceğim, fakat JVM instance'ının üzerinde çalıştığı makinenin fiziksel memory'si ile ilgili birkaç bilgiyi Operating System kısmında bulabilirsiniz.

Figure 2
Bir sonraki yazımda JConsole ile memory grafiklerinin takibi, JVM thread'lerinin incelenmesi, Remote MBean Invocation ve JVM ile ilgili diğer bilgilere nasıl ulaşacağımızı, bunların yanında bunların nasıl kullanılırsa hayat kurtarabileceğini anlatmaya çalışacağım.

1 comments:

İbrahim Demir said...

Selamlar;

Bu tip araçları kullanırken en büyük handikap sizin de dediğiniz gibi sisteme getirdiği yüktür. İşin garibi de sistemi adam akıllı izleyebilmek ve fikir sahibi olabilmek için de sistemin yük altında olmasını isteriz. Üstüne bir de bu tip araçlar eklenince ilginç dakikalar yaşanabiliyor bazen.
Performance tuning konusunda elimizdeki araçlarla neler yapabilir diyenler için:

Java 2 Platform Standart Edition 5.0 TROUBLE SHOOTING and DIAGNOSTIC GUIDE
önerebilirim.El altında bulundurmakta fayda var diye düşünüyorum.

Ellerinize sağlık çok keyifli bir yazı olmuş.