Bellek ve JVM sorunlarını giderme
Patrona, Java Sanal Makinesi (JVM) üzerinde çalışır ve nasıl yapılandırıldığına bağlı olarak, bazı bilgileri depolamak için sunucunun dosya sistemini kullanabilir. Bu nedenle, JVM veya dosya sistemiyle ilgili sorunlar Patrona'nın çalışmasını engelleyebilir.
Java sürümü
Patrona, Java sürüm 21'de çalıştırılmalıdır (daha eski sürümler desteklenmez).
Java sürümlerini ararken, her zaman seçtiğiniz ana sürümün en son küçük sürümünü kullanın. Örneğin, Java 21.0.1 ve Java 21.0.4 arasında seçim yaparken, en son sürümü (bu durumda 21.0.4) seçin.
Tek bir sunucuda birden fazla Java sürümü çalıştırmak uygulama sorunlarına neden olabileceğinden, tek bir sunucuda yalnızca bir Java sürümü çalıştırmanızı öneririz. Her biri farklı bir java sürümü gerektiren birden çok uygulama çalıştırmanız gerekiyorsa, kapsayıcıları kullanmayı düşünün (çünkü kapsayıcılar bu sorunu çözmek için tasarlanmıştır). Aksi takdirde, tüm uygulamalarınızı tek bir Java sürümüyle çalıştırabildiğinizden emin olun.
Patrona'nın bellek kullanımı
Patrona, Java Sanal Makinesi (JVM) üzerinde çalışan bir JAR dosyası olarak gönderilir.
Patrona'nın bellek kullanımını JVM'nin bellek kullanımından ayırmak önemlidir.
JVM, sabit miktarda bellek tüketecektir. Varsayılan olarak, JVM bir makinenin RAM'inin yaklaşık dörtte birini kullanır (ancak JVM'nin ne kadar RAM kullanmasını istediğinizi değiştirebilirsiniz).
JVM uygulamaları (Patrona gibi), JVM'ye ayrılan RAM'i tüketir ve serbest bırakır. Ancak JVM, kullanılmayan RAM'i makineye geri vermez; JVM'nin bellek kullanımı sabit olacaktır.
Bu nedenle, 8 GB RAM'e sahip bir makinede, varsayılan olarak JVM 2 GB RAM kullanacaktır. Patrona, Patrona'nın etkinliğine bağlı olarak, JVM tarafından ayrılan bu 2 GB RAM'in bir kısmını veya tamamını kullanacaktır. Ancak makinenin bakış açısından, Patrona yalnızca ayrılan RAM'in bir kısmını kullanıyor olsa bile, JVM her zaman ayrılan 2 GB RAM'i kullanacaktır.
Bellek sorunlarını teşhis etme
JVM'nin belleği nasıl işlediğine dair yukarıdaki açıklamayı göz önünde bulundurarak, veri ambarınızdan kaynaklandığını düşünmediğiniz Patrona ile ilgili performans sorunları yaşıyorsanız, şu kırmızı bayrakları kontrol etmek isteyeceksiniz:
Patrona, Java yığın alanı OutOfMemoryError nedeniyle çöküyor
JVM normalde sistemde ne kadar RAM olduğunu anlayabilir ve yığın bellek kullanımı için otomatik olarak mantıklı bir üst sınır belirleyebilir. Ancak, bazı paylaşımlı barındırma ortamlarında bu her zaman istenildiği gibi çalışmaz. Bunun olağan belirtisi, şuna benzer bir hata mesajıdır:
java.lang.OutOfMemoryError: Java yığın alanı
Bu "Bellek yetersiz" (OOM) hatasını görüyorsanız, JVM'ye daha fazla bellek ayırmanız gerekir.
Bellek kullanımını zaman içinde bir çizgi grafik olarak görüntülerken, bir testere dişi deseni görüyorsunuz
Patrona'nın kendisine ayrılan belleği zaman içinde nasıl kullandığını görüntülemek için araçlar kullanabilirsiniz. Şunlara göz atın:
Kontrol etmeniz gereken belirli Prometheus metriği jvm_memory_bytes_used
Dikkat edilmesi gereken kırmızı bir bayrak: testere dişi deseni. Patrona hızla çok fazla bellek tüketecek, bu da çöp toplamayı tetikleyecek, bu da belleği serbest bırakacak, bu da Patrona'nın tekrar hızla tüketeceği anlamına gelir. Bu yukarı-aşağı-yukarı-aşağı bellek kullanım deseni, sık çöp toplama döngülerinin imzasıdır. Çöp toplama, CPU döngülerini bağlayacak ve bu da uygulamanızı yavaşlatabilir.
Bunu görüyorsanız, JVM'ye ayrılan bellek miktarını artırmanız gerekir.
JVM'ye daha fazla bellek ayırma
JVM'nin yığınına daha fazla bellek ayırmak için bir JVM seçeneği ayarlayabilirsiniz. Örneğin, Java çalışma zamanınız bunu yapmak için -X işaretini kullanabilir:
java -Xmx2g -jar patrona.jar
Patrona mutlu görünene kadar bellek ayırmayı yukarı doğru ayarlayın, ancak makinenizde bulunan toplam RAM miktarından daha düşük tuttuğunuzdan emin olun, çünkü Patrona çalışan tek işlem olmayacaktır. Makinedeki diğer işlemler için 1 ila 2 GB RAM bırakmak genellikle yeterlidir, bu nedenle -Xmx değerini 2 GB RAM'e sahip bir makinede 1g, 4 GB RAM'e sahip bir makinede 2g vb. olarak ayarlayabilirsiniz. Patrona'nın ve diğer her şeyin güzel bir şekilde birlikte çalışmasını sağlayan bir ayar bulmak için bu ayarları denemeniz gerekebilir (ve bu deneme, daha fazla belleğe sahip bir makineye yükseltme gerektirebilir).
JVM argümanlarını doğrudan java'ya geçirmek yerine JAVA_OPTS ortam değişkenini de kullanabilirsiniz. Bu, özellikle Docker görüntüsünü çalıştırırken kullanışlıdır:
docker run -d -p 3000:3000 -e "JAVA_OPTS=-Xmx2g" patrona/patrona
OutOfMemoryError'lara neden olan bellek sorunlarını teşhis etme
Patrona örneği başlatılır ve bellek yetersiz kalmadan önce önemli bir süre çalışırsa, büyük bir sorgu gibi belirli bir olay OutOfMemoryError'u tetikliyor olabilir. Belleğin nerede kullanıldığını teşhis etmenin bir yolu, bir OutOfMemoryError tetiklendiğinde yığın dökümlerini etkinleştirmektir. Bunu etkinleştirmek için, java çağırmasına iki işaret eklemeniz gerekir:
java -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/a/directory -jar patrona-jar
-XX:HeapDumpPath işareti, dökümün nereye konulacağını belirtir---geçerli dizin varsayılandır. Bir OutOfMemoryError oluştuğunda, JVM belirtilen dizine bir hprof dosyası dökecektir. Bu hprof dosyaları büyük olabilir (-Xmx bağımsız değişkeninin boyutu), bu nedenle diskinizde yeterli alan olduğundan emin olun. Bu hprof dosyaları, JDK ile birlikte gelen jhat veya Eclipse Memory Analyzer Tool gibi birçok farklı araçla okunabilir.
Patrona bir dosyadan veya klasörden okuyamıyor veya yazamıyor (IOError)
SQLite veritabanını veya özel bir GeoJSON harita dosyasını okuyamama gibi dosya izinleriyle ilgili bir hata görürseniz, Docker sorun giderme kılavuzumuzdaki "Patrona bir dosyaya/dizinden okuyamıyor/yazamıyor" bölümüne bakın.
UYARI: sun.reflect.Reflection.getCallerClass desteklenmiyor
Endişelenmeyin.
UYARI: sun.reflect.Reflection.getCallerClass desteklenmiyor. Bu, performansı etkileyecektir.
Yukarıdaki hatayı görürseniz, yoksayın. Patrona'nız mükemmel bir şekilde sağlıklı ve olması gerektiği gibi performans gösteriyor.