2016-01-07 3 views
1

Наше приложение состоит из трех частей. Унаследованная часть, использующая EJB, текущее приложение, использующее hibernate/spring и стороннюю библиотеку с использованием Mybatis. Операции базы данных за один сеанс координируются JTA. Приложение оснащено рудиментарным APM.Масштабирование проблемы с Hibernate (Flush?) В контексте JTA

Мы недавно увидели очень странное поведение, но еще не смогли воспроизвести и проанализировать его: наше приложение обычно работает в режиме hibernate-wise, но в этом случае на всех участках приложения был загружен другой сеанс. Во время этого события APM сообщила о временах выполнения транзакций в EJB/Spring, умноженной в десять раз. Мы видели интенсивное использование ЦП для тех потоков, которые выполняли транзакции EJB/Spring, даже когда фактический код, выполненный в транзакции, был минимальным.

После анализа мы узнали, что те контролируемые времена включают в себя наш бизнес-код, а также время, проведенное для Hibernate-Flush. Мы также видели корреляцию между количеством элементов в entitymanager и временем, затраченным на завершение транзакции.

Наше текущее подозрение в том, что по какой-то причине флеш работает с берсерком.

Кто-нибудь видел что-то подобное или имеет какое-либо представление о том, что может быть причиной?

+0

Если у вас есть сомнения относительно времени, затрачиваемого на Hibernate Flush. Таким образом, вы можете использовать различные режимы Flush, доступные в Hibernate, и проверить реальную проблему. https://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/FlushMode.html – Rish

+0

@Rish мы знаем об этом и уже установили flushmode из auto для фиксации. В настоящее время мы рассматриваем возможность использования руководства, но, как вы можете догадаться, это не делается беззаботно, если уже существует значительный объем кода. – Jonathan

ответ

1

Ответ был полностью в другом месте. Мы наткнулись на ошибку JDK7/CodeCache, которая приводит к тому, что JIT-компилятор полностью останавливается, чтобы скомпилировать что-либо, как только CodeCache заполнил. Это приводит к тому, что много кода выполняется в режиме интерпретации и поэтому довольно медленнее, чем ожидалось. Боец (1) пытался нанести удар, но не смог дышать.

Если вы видите странные замедления вашего приложения и все еще работаете JDK7, посмотрите на область памяти CodeCache. Если он заполнил до 100%, а затем внезапно упал до ~ 50-66 & и больше не растет, вы попадаете в эту ошибку.

Подсказка: Более длинное объяснение можно найти здесь: JDK7 Application is getting slow after some Uptime

+0

Ницца. У вас есть какие-то конкретные источники, которые дали вам ключ? Мне было бы интересно их прочитать. – Gimby

+0

Привет @Gimby, я просто разместил более длинное объяснение здесь: http://stackoverflow.com/questions/38393071/jdk7-application-is-getting-slow-after-some-uptime/38393072#38393072 - В основном я был сердито как мало известно, что это вообще – Jonathan

+0

Хорошо, но теперь вы в основном создали сценарий с обманом. Ответ на этот более длинный вопрос также отвечает на этот вопрос. – Gimby

Смежные вопросы