2013-07-19 5 views
14

Ho un progetto in cui eseguiamo un test delle prestazioni notturne. È lo stesso test ogni sera in cui il nostro sito Web viene colpito da centinaia di "utenti" simultanei per 3 ore. I risultati delle prestazioni finiscono in uno dei due stati: buono o cattivo, e ogni stato sembra essere coerente con se stesso. Il nostro tipo di database (oracle btw) ha notato che nei giorni di cattiva esecuzione avremmo ricevuto molte, molte più chiamate rispetto ai giorni buoni, ma solo una query.Cosa causerebbe la fluttuazione delle prestazioni di Hibernate in modo non deterministico?

Dalla mia analisi fino ad ora penso che abbia a che fare con l'ibernazione scegliendo di usare/non usare i proxy, ma non riesco a capire cosa direbbe l'ibernazione per farlo in alcuni giorni e non su altri. Cosa causerebbe un tale comportamento non deterministico erratico in Hibernate? Sono su Hibernate 4.2.0 e in primavera. Non stiamo usando una cache di secondo livello. Non ci sono altre applicazioni sui nostri server.

L'oggetto che provoca l'emissione di questa chiamata si trova alla fine di una lunga catena di oggetti correlati tramite genitore/figlio. Stiamo lavorando a capo di questa catena.

Bad performance Un brutto periodo, le esecuzioni preavviso 4m della 9wu ... La ricerca

A night of good performance una buona corsa, si noti 630K esecuzioni della 9wu ... La ricerca

Edit: io non sono in grado per lo più riprodurre questo in un modulo. Sembra che quando ho -xmx impostato molto basso (28m), le chiamate extra non ci sono, ma a xmx = 128m ho la maggior parte delle esecuzioni. Qualche consiglio su dove in Hibernate posso vedere perché/come deciderebbe se dovrebbe essere proxy o no?

Modifica 2: Non riesco a riprodurre in modo coerente nel mio modulo. Funzionerà alla grande per 5 esecuzioni, poi fallirà per 3 poi funzionerà e poi fallirà. Ogni volta che eseguo lo stesso test unitario. Sembra essere un problema N + 1, carica un sacco di bambini attraverso la query "select item0 ...", ma durante una buona esecuzione decide di usare un'altra query o non scartare le voci tra il webservice chiamate. Vedrò cosa posso fare per offuscare i miei oggetti e fornire alcuni dettagli. Sfortunatamente, IT è una struttura archiviata in un database e utilizza l'ereditarietà con un discriminatore.

+0

Sono interessato a il tuo "Dalla mia analisi fino ad ora penso che abbia a che fare con l'ibernazione scegliendo di usare/non usare i proxy". A quale "Proxy" ti riferisci? Se stai parlando del proxy per le entità, non ho mai sentito che Hibernate stia creando proxy in maniera non deterministica. Potrebbe approfondire ulteriormente questo? –

+1

mi sembra che sia qualcosa come: 1. Hai lasciato la lunga catena di oggetti tutti tirati pigri. 2.In alcuni casi, stai semplicemente navigando su una piccola parte della tua catena (che è il caso buono), mentre in alcuni casi stai navigando per la maggior parte della catena, che causa un'enorme quantità di lazy fetch (che è il caso negativo). 3. o, in alcuni casi speciali, si sta eseguendo un recupero "non riutilizzabile n + 1". Vi consiglio vivamente di avere una corretta registrazione in Hibernate e di indagare in quale caso ci sono enormi quantità di SQL generato (che dovrebbe essere ovvio) –

+0

potreste pubblicare i vostri mapping relativi alla query? Ti suggerirei di abilitare il recupero fetch sulla mappatura e vedere se "tale comportamento non deterministico erratico" esiste ancora o no –

risposta

3

È difficile, naturalmente, dire perché questo potrebbe accadere. Tuttavia, ci sono alcune buone risorse là fuori per optimizing performance in Hibernate and debugging problems with it.

Nell'articolo collegato l'autore suggerisce che il modo migliore per diagnosticare problemi di prestazioni è l'utilizzo di YourKit Java Profiler. Se il carico e l'ambiente delle prestazioni sono remoti e non è possibile eseguire localmente un profiler you can attach one remotely. Ovviamente, l'esecuzione di un profiler ha un sovraccarico in modo da poter rilevare le caratteristiche di perforazione modificate perché ne è stata aggiunta una. Tuttavia, questa è probabilmente la soluzione migliore per rintracciare cosa sta succedendo.

Altri link utili:

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

+0

Grazie a quelli sono ottimi collegamenti, ho già utilizzato il tuo kit in precedenza ma il problema sembra essere in ibernazione. Otterrò le fonti di letargo. – Ravedave

Problemi correlati