2016-01-07 1 views
1

Notre application consiste (base de données) en trois parties. Une partie héritée utilisant EJB, l'application actuelle utilisant hibernate/spring et une bibliothèque tierce utilisant Mybatis. Les opérations de base de données dans une session sont coordonnées par JTA. L'application est équipée d'un APM rudimentaire.Problème de mise à l'échelle avec Hibernate (Flush?) Dans le contexte JTA

Nous avons récemment observé un comportement très étrange mais pas encore capable de le reproduire et de l'analyser: Notre application fonctionne généralement bien en hibernation mais dans ce cas il y avait une charge provenant d'autres sessions sur toutes les parties de l'application. Au cours de cet événement, l'APM a multiplié par dix les temps d'exécution des transactions dans la partie EJB/Printemps. Nous avons constaté une utilisation intensive du processeur pour les threads exécutant les transactions EJB/Spring, même lorsque le code exécuté dans la transaction était minimal. Après analyse, nous avons appris que les temps surveillés comprenaient notre code d'entreprise ainsi que le temps passé pour Hibernate-Flush. Nous avons également constaté une corrélation entre la quantité d'éléments dans le gestionnaire d'entité et le temps passé pour terminer la transaction.

Notre soupçon actuel est que, pour une raison quelconque, la chasse est en train de devenir berserk.

Est-ce que quelqu'un a déjà vu quelque chose comme ça ou a une idée de ce qui pourrait être la raison?

+0

Si vous avez un doute en ce qui concerne le temps passé pour Hibernate Flush. Vous pouvez donc utiliser différents modes de vidage disponibles dans Hibernate lui-même et vérifier le vrai problème. https://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/FlushMode.html – Rish

+0

@Rish nous en sommes conscients et avons déjà défini le flushmode d'auto à commit. Nous envisageons actuellement de passer au manuel, mais, comme vous pouvez le deviner, c'est quelque chose qui n'est pas fait à la légère s'il y a déjà beaucoup de code en cours d'exécution. – Jonathan

Répondre

1

La réponse était complètement ailleurs. Nous avons trébuché sur le bogue JDK7/CodeCache, ce qui fait que le compilateur JIT s'arrête complètement pour compiler quoi que ce soit, une fois CodeCache rempli. Cela entraîne beaucoup de code exécuté en mode d'interprétation et donc un peu plus lent que prévu.

Cela rendait la rougeur lente et apparaissait comme le malfaiteur.

Si vous constatez d'étranges ralentissements de votre application et que vous utilisez toujours JDK7, consultez votre zone de mémoire CodeCache. Si elle a rempli jusqu'à 100% et est soudainement tombé à ~ 50-66 & et ne pousse plus, vous avez atteint ce bug.

Astuce: Une explication plus longue se trouve ici: JDK7 Application is getting slow after some Uptime

+0

Nice one. Avez-vous des sources spécifiques qui vous ont donné l'indice? Je serais intéressé de les lire. – Gimby

+0

Salut @ Gimby, je viens de poster une explication plus longue ici: http://stackoverflow.com/questions/38393071/jdk7-application-is-getting-slow-after-some-uptime/38393072#38393072 - Fondamentalement, j'étais sursis c'est peu connu en général – Jonathan

+0

D'accord, mais maintenant vous avez essentiellement créé un scénario de dupe-question. La réponse longue dans votre question plus récente répond également à celle-ci. – Gimby