Yazılım geliştirme: Java günlük kaydının performansı

Adanali

Member


  1. Yazılım geliştirme: Java günlük kaydının performansı

Java günlük kaydı konusuna ilişkin önceki yazılarımda (En İyi Uygulamalar, Günlük Kaydı Cepheleri), günlük kaydı konusuyla ilgili çok sayıda Java kütüphanesinin bulunduğunu zaten belirtmiştim. Son gönderide birden fazla kaydedicinin bir cepheyle nasıl birleştirileceğini açıkladıktan sonra, şimdi kayıt kitaplıklarının performansını incelemek istiyoruz.

Duyuru








Hendrik Ebbers (@hendrikEbbers) bir Java Şampiyonudur, JCP Uzman Grubunun üyesidir ve birçok kez JavaOne Rockstar Konuşmacısı olarak tanınmıştır. Hendrik, şirketi Open Elements ile şu anda Hedera Hashgraph'ın tasarlanmasına ve hizmetlerinin halka sunulmasına yardımcı oluyor. Hendrik, JUG Dortmund ve Cyberland'in kurucu ortağıdır ve dünya çapında Java konusunda konuşmalar ve atölye çalışmaları düzenlemektedir. “JavaFX 8 Kontrollerinde Uzmanlaşmak” adlı kitabı 2014 yılında Oracle Press tarafından yayımlandı. Hendrik, JakartaEE veya Eclipse Adoptium gibi açık kaynaklı projeler üzerinde aktif olarak çalışıyor. Hendrik, AdoptOpenJDK TSC ve Eclipse Adoptium WG üyesidir.







Java'da performans ölçümü


Bir Java uygulamasının veya kitaplığının küçük bölümlerini karşılaştırmak için Java, performans kıyaslamalarını gerçekleştirmek üzere OpenJDK tarafından sağlanan Java Microbenchmark Harness (JMH) aracına sahiptir. Birim testine benzer şekilde, uygulamanın küçük bölümlerini (mikro kıyaslama) çalıştırır ve analiz eder. Diğer şeylerin yanı sıra, JVM ve JIT'i “ısıtmak” için kodun ölçümler olmadan birkaç saniye boyunca birkaç kez yürütülüp yürütülmeyeceğini ayarlayabilirsiniz.

JMH'de bu ve diğer parametreler, JUnit'e benzer şekilde ek açıklamalar kullanılarak kolayca tanımlanabilir. Basit bir kıyaslama örneği şuna benzer:


@Benchmark
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 4, time = 4)
@Measurement(iterations = 4, time = 4)
public void runSingleSimpleLog() {
logger.log("Hello World");
}


Örnekte dört ısınma döngüsü ve ardından dört ölçüm döngüsü yürütülmektedir. Her uygulama dört saniye sürer ve ölçüm sonucu saniyede kaç işlemin gerçekleştirildiğini gösterir. Bu özellikle “Merhaba Dünya”yı ne sıklıkla kaydedebileceğiniz anlamına gelir. Yürütmeden sonra her şey komut satırında bir tabloda görüntülenir, ancak bunu örneğin bir JSON veya CSV dosyası olarak da kaydedebilirsiniz.

Java günlükçüleri için performans ölçümü


JMH'yi kullanarak, GitHub'da mevcut olan günlük kaydı çerçeveleri için açık kaynaklı bir kıyaslama oluşturdum. Şu anda performans açısından aşağıdaki günlük kitaplıklarını ve yapılandırmalarını kontrol ediyor:

  • Konsol günlüğü ile JuL (java.util.logging)
  • Bir dosyaya giriş yaparak JuL (java.util.logging)
  • JuL (Java.util.logging) konsola ve bir dosyaya giriş yaparak
  • SLF4J Dosya kaydıyla basit
  • Konsol günlüğü ile Log4J2
  • Bir dosyaya giriş yaparak Log4J2
  • Konsolda ve bir dosyada oturum açma ile Log4J2
  • Bir dosyaya eşzamansız günlük kaydıyla Log4J2
  • Bir dosyaya eşzamansız kayıt yapan Chronicle Logger
Bu takımyıldızların her biri için, günlükçü oluşturulmasından basit bir “Merhaba Dünya” mesajının kaydedilmesine ve karmaşık kayıt çağrılarına (mesajdaki yer tutucu, işaretleyici, MDC kullanımı vb.) kadar performansı ölçen çeşitli kıyaslamalar vardır.

Ölçümler, günlük kaydı çerçevelerinin genellikle çok performanslı olduğunu göstermektedir. Öte yandan herkesin hemen anlayamayacağı bazı veriler de ortaya çıktı.

Aşağıda yalnızca bir “Merhaba Dünya” mesajı kaydettiğinizde elde edilen ölçüm sonuçlarına ilişkin bir genel bakış bulacaksınız:








Konsoldaki sorun


Ölçümlerin ilk sonucu, konsoldaki kayıt işleminin her zaman dosya sistemindeki kayıttan önemli ölçüde daha yavaş olmasıdır. Bir dosyaya erişirken saniyede 200.000 ila 300.000 kaydedici çağrısı alabilseniz de, konsollara çıktı verirken saniyedeki işlem sayısı her zaman 100.000'in oldukça altında olmuştur. Tüm kayıt kütüphaneleri buraya dahil edildiğinden System.out VEYA. System.err işe yarıyor, hangi kütüphaneyi kullandığınız performans açısından neredeyse hiç fark yaratmıyor. Gelecekte hileler veya değişikliklerle daha iyi performansa ulaşıp ulaşamayacağımızı görmek heyecan verici olacak.

Dosyalara senkronize ve asenkron kayıt


Senkron veya asenkron kayıttan bir dosyaya ölçülen değerlere baktığınızda büyük bir farkı daha görebilirsiniz. Asenkron kaydın önemli ölçüde daha hızlı olduğu hemen anlaşılıyor. Aşağıdaki tablolarda eşzamansız kayıt ve eşzamanlı kayıt parametreleri gösterilmektedir:








Bariz performans artışı, asenkron kaydedicilerin yazmasının engellenmemesinden kaynaklanmaktadır. Log4J2 ve Chronicle Logger dahili olarak farklı kitaplıklar kullanır, ancak her ikisi de “bloksuz iş parçacıkları arası iletişim kitaplığına” dayanır. Log4J, halka arabelleği aracılığıyla dahili olarak eşzamansız günlüğe kaydetmeyi sağlayan bir kitaplık olarak LMAX Disruptor'ın eklenmesini gerektirirken, Chronicle Logger doğrudan Chronicle Queue kitaplığına güvenir.








Dahili olarak kullanılan kitaplıkların özel bir açıklaması ve bunların eşzamansız iletişimi veya dosya sistemine yazmayı nasıl etkinleştirdikleri belgelerde bulunabilir.

Log4J2 ve Chronicle Logger'ın performansını karşılaştırırsanız Chronicle Logger'ın çok daha hızlı olduğunu görebilirsiniz. Bununla birlikte, bu performans avantajı bilmeniz gereken bir dezavantajı da beraberinde getirir: Log4J2, asenkron modda bile dosya sisteminde insanların okuması kolay olan satır satır bir günlük oluşturmaya devam ederken, Chronicle Logger şunu yazar: tüm mesajlar ikili formattadır. Kaydedici tarafından sağlanan okuma veya analiz araçlarına ihtiyacınız var. Ayrıca Chronicle Logger test sonuçlarının varyansı önemli ölçüde daha yüksektir. Bunun nedeninin, kullanılan kronik kuyruğunun, günlüğü yazmak için ikili verileri dahili olarak işlemesi ve boyutunu her zaman dinamik olarak ayarlaması olduğundan şüpheleniyorum. Ancak bunun yine de daha fazla araştırılması gerekmektedir. Aşağıdaki tabloda varyansa genel bir bakış gösterilmektedir:








Çözüm


Gördüğünüz gibi sadece günlük kütüphanesinin seçimi değil aynı zamanda konfigürasyonu da performans açısından son derece önemlidir. Geliştirme sırasında konsolda oturum açma kesinlikle çok kullanışlı olsa da, örneğin canlı çalışma sırasında konsolda oturum açmanın gerçekten her zaman gerekli olup olmadığını değerlendirebilirsiniz. Ayrıca, sistem performansının gerçekten kritik olduğu durumlarda eşzamansız günlükçülerin kullanılmasının anlamlı olabileceğini de gösterir. Doğal olarak bu, karmaşıklığın artmasına ve ek geçişli bağımlılıklara yol açar. Sonuçta her proje hangi kaydedicinin en anlamlı olduğuna kendisi karar vermelidir. Burada bahsedilen rakamlar artık bunu belirlemek için daha fazla temel sağlıyor.


(kendim)



Haberin Sonu
 
Üst