JVM belleğini uygun bir şekilde nasıl izleyebilirim?


9

Yoğun bir saatin altında bile üretim ortamında JVM bellek monitörünü düşük ek yükte nasıl yaptığımızı düşünüyorum.

Üretimde iki tomcat uygulama sunucum olduğunu, bunların arkasında yük dengesini oluşturduğumuzu varsayalım. Jvm bellek istatistiklerini görebiliyorsam, OOM sorunuyla karşılaşacak olan isteği sunucuya göndermeyi durdurmak için yük dengesini söyleyebilirim. Bu mantıklı mı? Jconsole veya VisualVM daha fazla performans yiyor kaynak seçimim değil.


Java Simon çerçeve bakmaya değer olabilir.
khmarbaise

Yanıtlar:



1

Diğerleri bellek kullanımını izleme konusunda önerilerde bulundular ...

Üretimde iki tomcat uygulama sunucum olduğunu, bunların arkasında yük dengesini oluşturduğumuzu varsayalım. Jvm bellek istatistiklerini görebiliyorsam, OOM sorunuyla karşılaşacak olan isteği sunucuya göndermeyi durdurmak için yük dengesini söyleyebilirim. Bu mantıklı mı?

Bir çeşit. Ancak sorununuzu çözmek için en iyi yol mutlaka bu değildir.

Sorunun köküne geri dönelim ... OOME'ler. Tomcat bağlamında, OOME'lerin aşağıdakilerden biri olması muhtemeldir:

  • uygulamanızda bellek sızıntıları (veya muhtemelen Tomcat'in kendisi),
  • her bir Tomcat'e paralel olarak çok fazla istek işleme koymaya çalışmak veya
  • işleme sırasında çok fazla belleğe ihtiyaç duyan bireysel istekler.

Sorununuzu çözmek için önce bunlardan hangisinin olduğunu bulmanız gerekir ... çünkü çözüm her biri için farklıdır.

1) Bunun bir bellek sızıntısı olup olmadığını görmek için, uzun süreli bellek kullanım düzenlerini incelemek için bir bellek analiz aracı kullanmanız gerekir. Bu muhtemelen testere dişi bir desen gösterecektir ... bu normaldir. Aramanız gereken, zaman içinde yukarı doğru yükselen "diş" in dip seviyesidir. Bu, bir şeyin toplanamayan çöp yarattığını gösterir; yani bellek sızıntısı.

Bellek sızıntısı varsa, en iyi çözüm kodunuzun hangi bölümünün sorumlu olduğunu bulmak ve düzeltmektir. Yük dengeleme dahil ... başka her şey bandajlı bir çözümdür ve pistte daha kötü sorunlara yol açabilir.

2) Bellek sızıntılarını ortadan kaldırdıktan sonra, sorunun aynı anda çok fazla istek işleyip işlemediğini anlamanız gerekir. Bunu yapmanın en iyi yolundan emin değilim, ancak sorun buysa (ya da olduğundan şüpheleniyorsanız), birkaç olası çözüm vardır:

  • Çalışan iş parçacığı sayısını azaltmak için Tomcat sunucu yapılandırmasını ayarlayın.

  • İstekleriniz G / Ç'ye bağlıysa, başka bir olasılık da Servlet spesifikasyonunun son sürümlerinde bulunan eşzamansız istek işleme desteğine bakmak olacaktır - bkz. Http://docs.oracle.com/javaee/7/tutorial/doc/ servlets012.htm . Ama bu daha çok iş olacak.

3) Sorun, belirli isteklerin çok fazla bellek kullanıyor olduğu ortaya çıkarsa, bu istekleri önceden nasıl algılayacağınızı ve "onlarla başa çıkmayı" nasıl çözmeniz gerektiğini anlamanız gerekir. Bu istekleri tespit etmek ve bunlarla başa çıkmak zor olabilir ... ve başvurunuzun ayrıntıları olmadan tavsiyelerde bulunmak zordur. Ancak birkaç pragmatik çözüm:

  • Anormal istekleri büyük bir yığınla başka bir sunucuya iletin ... OOME'lerin "normal" isteklere müdahale etmeyeceği yerler.

  • Yığın boyutunu büyütün. Yeterli fiziksel belleğiniz varsa, daha büyük bir yığınla çalışmak Tomcat sunucularınızı daha verimli hale getirebilir ve aynı zamanda OOME'lerden kaçınabilir.


Özetle, daha doğrusu önlemek OOMEs yük dengesi çalışırken, seni anlamaya önermek neden sen OOMEs alıyorsanız ... ve doğrudan OOMEs nedeni ile uğraşmak deneyin.


0

Belki jvmtop sizin için bir göz atmaya değer.

Bellek tüketimi, işlemci kullanımı, iş parçacığı sayısı vb. Gibi ölçüm metriklerini izleme başına "en çok benzeyen" bir şekilde gösterir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.