2013-07-19 16 views
14

Gecelik performans testi yaptığımız bir projem var. Web sitemizin 3 saat boyunca yüzlerce eşzamanlı "kullanıcı" tarafından vurulduğu her gece aynı test. Performans sonuçları iki durumdan birinde - kötü ya da iyi, ve her bir devletin kendi ile tutarlı gibi görünüyor. Veritabanımızdaki adam (oracle btw), kötü performans günlerinde iyi günlerden çok daha fazla arama yapacağımızı, ancak sadece bir sorgunun olduğunu fark etti.Hazırda bekletme performansının nondeterminik bir şekilde dalgalanmalarına neden olur?

Şu ana kadar yaptığım analizden, proxy'leri kullanmak/kullanmamak için hazırda bekletme modunu kullanmak zorunda olduğunu düşünüyorum, ancak bazı günlerde başkalarına yapmamak için hazırda bekletmenin ne olduğunu anlayamıyorum. Hazırda bekletme gibi düzensiz deterministik davranışlara ne sebep olur? Hibernate 4.2.0 ve ilkbahardayım. 2. seviye bir önbellek kullanmıyoruz. Sunucularımızda başka uygulama yok.

Bu çağrının yayılmasına neden olan nesne, ebeveyn/çocukla ilişkili uzun bir nesne zincirinin sonundadır. Bu zincirin başı çalışıyoruz.

Bad performance Kötü işletilen 9wu ihbarı 4m infaz ... İyi bir çalışma, 9wu ait 630k infaz fark

A night of good performance sorgu ... sorgu

Düzenleme: elimden gelmiyor bunu çoğunlukla bir modülde çoğaltmak için. -xmx çok düşük (28m) olarak ayarlandığında, ekstra aramalar yok, ama xmx = 128m'de en çok çalışıyorum. Hazırda bekletme ile ilgili herhangi bir ipucu, proxy olup olmamasına göre neden/nasıl karar vereceğini görebilir?

Düzenleme 2: Modemimde sürekli olarak çoğalamıyorum. 5 koşu için harika çalışacak, sonra 3 iş için başarısız olacak ve sonra başarısız olacaktır. Her defasında aynı birim testini çalıştırıyorum. Bir N + 1 problemi gibi görünüyor, "select item0 ..." sorgusuyla bir sürü çocuk yükler, ancak iyi bir çalışma sırasında başka bir sorgu kullanmaya karar verir veya webservice arasındaki girdileri atmaz. çağırır. Nesnelerimi gizlemek ve bazı ayrıntılar vermek için neler yapabileceğimi göreceğim. BT ne yazık ki bir veritabanında saklanan bir ağaçtır ve bir ayrımcı ile miras kullanır.

+0

ihtimale için veritabanı alabilirsiniz tahrip "Analizlerimden bugüne kadar, proxy'leri kullanmama/kullanmama için hazırda bekletme seçeneğinin olması gerektiğini düşünüyorum." Ne "Proxy" için başvuruyorsunuz? Varlıklar için vekilden bahsediyorsanız, Hibernate'in deterministik olmayan bir tarzda vekiller oluşturduğunu hiç duymadım. Daha fazla detaylandırır mısın? –

+1

bana öyle geliyor ki: 1. Nesnenin uzun zincirliğini tüm tembel getirdi. 2.Bazı durumlarda, zincirin küçük bir kısmını (ki bu iyi durumda) seyrederken, bazı durumlarda zincirin çoğunda geziniyorsunuz, bu da büyük miktarda tembel getiriye (kötü durum) neden oluyor. 3. ya da, bazı özel durumlarda bazı "yeniden kullanılamaz n + 1" getirme yapıyorsunuz. Uygun bir şekilde Hazırda bekletme olanağına sahip olmanızı öneririm ve büyük miktarda SQL'in oluşturulduğu (bu durumun açık olması gerektiğini) –

+0

sorgusuyla ilgili sorguları gönderebilir misiniz? Haritalama konusunda hevesli bir şekilde harekete geçmenizi ve "bu tür düzensiz deterministik olmayan davranışlar" ın hala var olup olmadığını görmenizi öneririm. –

cevap

3

Bunun neden olduğunu söylemek elbette zor. Ancak, orada optimizing performance in Hibernate and debugging problems with it için bazı iyi kaynaklar var. Bağlantılı makalede, yazar, performans sorunlarını tanılamanın en iyi yolunun YourKit Java Profiler kullanıyor olduğunu önermektedir. Yük ve performans ortamınız uzaksa ve yerel olarak you can attach one remotely profiler çalıştıramazsınız. Tabii ki, bir profiler çalıştıran bazı ek yükü vardır, böylece eklediğiniz bir özellik olduğundan dolayı, deliklerinizin özelliklerini değiştirmiş olabilirsiniz. Yine de, bu neler olup bittiğini izlemek için muhtemelen en iyi bahistir.

Diğer yararlı bağlantılar:

http://java.dzone.com/articles/debugging-hibernate-generated http://jroller.com/jcarreira/date/20050223#hibernate_tips

+0

Bunlar harika bağlantılar, daha önce kullandığınız kiti kullanıyorum ama sorun hazırda bekletiliyor gibi görünüyor. Hazırda bekleyen kaynakları alacağım. – Ravedave

İlgili konular