adsense

13.07.2014

Memory Problemlerimiz ve Jrockit ile Memory Dump Alma

Merhaba,
Bu yazımızda, yaşadığımız memory problemlerine ve Jrockit JVM ile memory dump alma işlemine değinmeye çalışacağız.

Jrockit, Oracle ın desteğini verdiği oldukça kullanışlı bir JVM'dir. Beraberinde gelen tool lar ile JVM anlık olarak monitör edilebilir, sorun anında memory dump alması sağlanabilir, vb. Konfigürasyon ve performans tuning anlamında bir çok parametresi olsa da bir çok uygulamaya entegre edilirken sadece min ve max heap size değerlerini vermek bile efektif çalışması için yeterli olabilir. Aşağıda Jrockit'in desteklediği platformları bulabilirsiniz:



Memory problemi bir kaç durumda karşımıza çıkabilir. 

  • Dizayn sonucu olarak uygulamamızın yoğun memory kullanıyor olması ancak yazılım geliştirme ve analiz ekipleriyle aramızdaki iletişim/aktarım kopuklukları nedeniyle bunu bilmiyor olmamız :) Bu tip case lerde memory problemi genellikle performans testlerinde ortaya çıkar ancak performans testlerinde ortaya çıkmayan ve uygulamanın production a alınıp gerçek yük altında çalışırken ortaya çıktığı durumlar da olabilir.
  • Uygulamada yapılan upgrade sonrası yoğun memory kullanılması.
  • JVM parametrelerinin sağlıklı set edilmemiş olması. Sorunumuz bu ise çözümü oldukça basit, Weblogic instance açılırken logları takip etmemiz ve alınan hatayı analiz etmemiz yeterlidir.
Yukarıdaki case leri yazılımcı olmayanların her zaman çözmesi mümkün olmayabilir, lakin gerekli ön çalışmayı yapıp sorunu tespit etmeleri için yazılım ekibini yönlendirebiliriz. Yapmamız gereken Jrockit'in jrcmd komutu ile dump almak ve önce analiz etmek, sorun bulamıyorsak yazılım ekibine ilgili dump dosyasını göndermek.

Yoğun memory kullanımını tespit edebilmemiz için weblogic instance larımızın (managed servers) garbace collection (memory temizleme, çöp/kullanılmış memory i yeniden kullanılabilir hale getirme) loglamasının açılmasında fayda var. (Bu konuyu daha sonra işleyeceğiz)

Uygulamamızın GC (garbace collection) loglamasının enabled edildiğini düşünürsek GC loglarına baktığımızda aşağıdaki gibi bir logla karşılaşacağız:


Yukarıdaki GC logunda "OC" ile belirtilen satırlar Full Garbage Collection işlemleri hakkında bilgi vermektedir. (Full GC: JVM in yaptığı bütün işleri durdurup yeni işlerde kullanmak üzere memory kazanmaya  çalışması) Her bir satırın ortasındaki parantez içinde bulunan değer JVM'e verilen heap size değeri olan 8 GB ı göstermektedir. 
9.976 sn süren satırı incelersek; 8 GB max heap size verilen ilgili JVM in 7.97 GB sınırına kadar geldiğini görürüz. Bu noktadan sonra kullanılacak free memory yaklaşık 30 MB civarıdır ki yoğun memory kullanan bu uygulamamız için yeterli değildir. Bu noktada ilgili JVM aktif olan tüm işlemleri durdurmuş ve Full GC işlemine başlamış görünüyor. Bu işlem 9.976 sn sürmüş ve aktif memory kullanımı 7.97 GB'tan 6.32 GB'a düşmüş. Full GC sonrası 7.97 GB'dan 6.32 GB'a düşmek bizi iki konuda düşündürebilir:

  • Uygulama 9.976 saniyede sadece 1.65 GB memory kazandı, hala 6.32 GB memory i tutuyor. Dolayısıyla uygulama gerçekten yoğun memory kullanıyor. Bu durumda heap size ı 8 GB'tan daha yüksek seviyelere arttırmak gerekebilir. (Heap size ne kadar yükseltilirse Full Gc işlem sıklığı o kadar azalacak ancak taranacak memory miktarı arttığı için Full GC süresi uzayacaktır. Full GC süresinin uzaması demek o an için JVM in çalışmaması demektir.)
  • Uygulamanın bu kadar memory kullanması normal değil ve heap dump alıp aktif olarak memory de tutulan objeleri tespit etmek gerekir.
Yukarıdaki sonuçlardan ikincisi için yazılımcı ile mutabık kalınırsa Jrockit ile Heap Dump alma işlemine geçilebilir.

Öncelikle Jrockit'in kurulu olduğu dizinin (JAVA_HOME da diyebiliriz) hemen altında bulunan bin dizinine gidilir:

cd $JAVA_HOME/bin

ps -ef|grep java ile memory dump ı alınacak JVM in (managed server) process id si tespit edilir ve heap dump almak için aşağıdaki komut çalıştırılır:

./jrcmd 28383 hprofdump filename=/u01/weblogic/MyHeapDump.hprof

28383: Dump ı alınan weblogic instance (jvm) process id si.
filename: Oluşan heap dump dosyası ve path i.
MyHeapDump.hprof: Dump dosyamız (hprof uzantılı olmalı)

Bu işlem heap size ne kadar yüksekse o kadar uzun sürecektir. JVM aktif durumda çalışırken bu komut çalıştırıldığında bazı durumlarda hata alabilir. Bu durumda komutu başarılı olana kadar tekrar tekrar çalıştırabilirsiniz.

Dump alındıktan sonra tavsiyem Eclipse Memory Analyzer ile dump ı açmak ve programın da yardımıyla memory leakleri tespit etmek. Eğer biz analiz edemiyorsak dump dosyasını yazılımcı ile paylaşabiliriz. Zira içindeki bilgiler daha çok yazılımcının anlayacağı türden olacaktır.


Hiç yorum yok:

Yorum Gönder