Düşük gecikmeli Java yazma [kapalı]


30

Java'da düşük gecikmeli kod yazmak için herhangi bir Java'ya özgü teknik (C ++ 'a uygulanamayan şeyler) var mı? Sık sık Java düşük gecikmeli rolleri görüyorum ve bazen biraz oksimoron gibi görünen düşük gecikmeli Java yazma deneyimi istiyorlar.

Düşünebildiğim tek düşünce, J / I ile deneyimlemek, G / Ç çağrılarını yerel kodlara dış kaynak olarak kullanmak. Ayrıca muhtemelen bozucu paterni kullanmak da mümkündür, ancak bu gerçek bir teknoloji değildir.

Düşük gecikmeli kod yazmak için Java ile ilgili herhangi bir ipucu var mı?

Gerçek Zamanlı Java Özelliği olduğunu biliyorum, ancak gerçek zamanlı olarak düşük gecikmeyle aynı olmadığı konusunda uyarıldım.


Bir toplama döngüsünü tetikleyebilecek çok fazla nesne yaratmayın benim tahminim olurdu
cırcır ucube

@ cırcır, Ağ veya Disk ile ilgili bir şey de JNI olacağını tahmin ediyorum?
user997112

Diğer bağlantılar ve sunumlar için, Performans Java Kullanıcı Grubu plus.google.com/u/1/communities/107178245817384004088
Peter Lawrey

Sun.misc.Unsafe kullanarak ekleyeceğim, doğrudan veya dolaylı olarak yararlıdır. Pek çok Güvensiz yöntem içsel olarak kabul edilir, yani herhangi bir JNI'yi önleyen makine koduyla değiştirilirler.
Peter Lawrey

Ana teknik, herhangi bir GC ek yükünü tamamen önlemektir. Bununla ilgili daha fazla bilgiyi Java Geliştirme Olmadan Java Geliştirme
rdalmeida

Yanıtlar:


35

Martijn'in yorumlarına ek olarak şunu eklerim:

  1. JVM'nizi ısıtın. Bytecode Hotspot için yorumlanmaya başlar ve 10K gözleminden sonra sunucuda derlenir . Katmanlı Derleme iyi bir durma boşluğu olabilir.

  2. Sınıflandırma, diske GÇ içeren sıralı bir işlemdir. Ana işlem akışlarınız için tüm sınıfların önceden yüklendiğinden ve izin oluşturma işleminden asla çıkamadıklarından emin olun.

  3. Çekişme ve Little Yasası'nın sıraya girme etkisi etkilerini önlemek için " Tek Yazar Prensibi " ni takip edin , ayrıca neyin paralel olabileceği ve neye değeceği konusunda Amdhal Yasasını inceleyin.

  4. İş alanınızı modelleyin ve tüm algoritmalarınızın O (1) veya en az O (log n) olduğundan emin olun. Bu muhtemelen deneyimimdeki performans sorunlarının en büyük nedeni. Ana vakaları kapsayan performans testlerinin yapıldığından emin olun.

  5. Java'daki düşük gecikme süresi yalnızca Java ile sınırlı değildir. Kodunuzun üzerinde çalıştığı yığının tamamını anlamanız gerekir. Bu işletim sistemi ayarlama, uygun donanım seçimi, sistem yazılımı ayarlama ve bu donanım için aygıt sürücülerini içerecektir.

  6. Gerçekçi ol. Düşük gecikme süresi gerekiyorsa, bir hipervizörde koşma. Çalıştırılabilir durumda olması gereken tüm dişler için yeterli çekirdeğiniz olduğundan emin olun.

  7. Önbellek özlüyor performans için en büyük maliyeti. Önbellek dostu algoritmalar kullanın ve ayrı ayrı iş parçacıkları için bir JVM veya JNI için görev kümesi veya numactl ile işlemci çekirdeğine afinite ayarlayın.

  8. Duraksız bir çöp toplayıcıyla Azul'dan Zing gibi alternatif bir JVM'yi düşünün.

  9. En önemlisi, deneyime karışan birini bulun. Bu uzun vadede size çok zaman kazandıracak. Utanmaz fiş :-)

Gerçek zamanlı ve düşük gecikme süresi sıklıkla ilişkili olmasına rağmen ayrı ayrı konulardır. Gerçek zamanlı, hızlıdan daha öngörülebilir olmakla ilgilidir. Tecrübelerime göre gerçek zamanlı JVM'ler, yumuşak gerçek zamanlı olanlar bile normal JVM'lerden daha yavaştır.


2
Harika bir cevap için +1. Bunun gibi tx işleme görevlerine ilgi duyan biri araştırma için harika bir başlangıç ​​noktasıdır.
mcfinnigan

23

Evet konusunda dikkat edilmesi gereken bir sürü şey var. Şu anda sınırlı net erişime sahip Girit'teyim, bu yüzden (oldukça) kısa olacak. Ayrıca, düşük gecikmeli bir uzman değilim ama meslektaşlarımdan bazıları gerçek hayatta oynuyor.

  1. Mekanik Sempati'yi ( Martin Thompson tarafından yazılan bir terim) takdir etmeniz gerekir . Başka bir deyişle, temel donanımınızın ne yaptığını anlamanız gerekir. CPU'ların önbellek satırlarını nasıl yüklediğini, okuma / yazma bant genişliğinin ne olduğunu, ana belleğin hızını ve çok daha fazlasını bilmek çok önemlidir. Niye ya? Çünkü, Java kaynak kodunuzun, çalışma zamanı JVM'si aracılığıyla OperatingSystem / Hardware'i nasıl etkilediğini düşünmeniz gerekir. Örneğin, alan değişkenlerinizin kaynak kodunuzda belirtildiği yöntem, önbellek tahliyelerine neden olur (size maliyeti ~ 150 saat döngüsü), hmmm ... :-).

  2. Genellikle kilitsiz algoritmalar ve G / Ç'ler istiyorsunuz. En iyi tasarlanmış eşzamanlı uygulama (kilit kullanan) bile engelleme riski altındadır, düşük gecikmeli kilitleme genellikle kötüdür :-).

  3. Nesne Tahsisi ve Çöp Toplama Anlayışı. Bu çok büyük bir konudur, ancak temel olarak GC duraklamalarından kaçınmak istersiniz (genellikle, çeşitli GC koleksiyonlarının Dünya'yı durdurması nedeniyle). Azul toplayıcısı gibi uzman GC koleksiyoncuları çoğu durumda bu sorunu sizin için kullanıma hazır hale getirebilir, ancak çoğu insan için Sun / Oracle GC'lerini (CMS, G1 vb.) Nasıl ayarlayacağınızı anlamaları gerekir.

  4. Hotspot JIT harika bir şey. Optimizasyonları hakkında bilgi edinin, ancak genel olarak tüm iyi OO tekniklerinin (kapsülleme, küçük metodlar, mümkün olduğu kadar değişken olmayan veriler) konuşulması, JIT'in size en iyi şekilde hazırlanmış C / C ++ kodunun size sunduğu performans düzeylerini vermesini sağlayacak şekilde optimize etmesini sağlayacaktır.

  5. Genel sistem mimarisi. Fiber vb. Alışverişi ile bağlıysanız ağın, makinelerin nasıl bir arada bulunduğunun farkında olun.

  6. Günlüğe kaydetmenin etkisinin farkında olun. İkili kayıt yapmak veya satırdan ayrıştırabileceğiniz kodlanmış çıktı kullanmak muhtemelen iyi bir fikirdir.

Genel olarak Kirk Pepperdine'in Java Performance Tuning kursuna devam etmenizi tavsiye ederim. [Feragatname: Bu kursu kendim öğretiyorum, bu yüzden önyargılıyım]. JVM'nin çeşitli yönlerini ve bunun altında yatan O / S ve donanım üzerindeki etkilerini iyi bir şekilde alırsınız.

Not: Bunu daha sonra tekrar ziyaret etmeye çalışacağım ve biraz toparlayacağım.


Mekanik Sempati ile deneyimlenenlerin, belirli bir sınırın ne zaman geçtiğini saptamak için bazı püf noktalarını paylaşmaları gerçekten güzel olurdu.

:-) için gerçek uzmanları denemek ve almak için heyecan verdim
Martijn Verburg

Harika, Martin Thompson benim tavsiyesine uymaya değer bir şey yaptı.
Martijn Verburg
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.