2013-07-19 2 views
14

У меня есть проект, в котором мы проводим ночной тест производительности. Это один и тот же тест каждую ночь, когда на наш сайт попадают сотни одновременных «пользователей» в течение 3 часов. Результаты работы заканчиваются в одном из двух состояний - плохом или хорошем, и каждое состояние, похоже, согласуется с самим собой. Наш парень из базы данных (oracle btw) заметил, что в дни плохой производительности у нас было бы гораздо больше звонков, чем в хорошие дни, но только из одного запроса.Что может привести к тому, что производительность Hibernate будет колебаться недетерминированным образом?

Из моего анализа до сих пор я думаю, что он имеет отношение к спячке, предпочитая использовать/не использовать прокси-серверы, но я не могу понять, что бы спустило спящий режим на несколько дней, а не на другие. Что может вызвать такое неустойчивое недетерминированное поведение в Hibernate? Я нахожусь в Hibernate 4.2.0 и весной. Мы не используем кеш второго уровня. На наших серверах нет других приложений.

Объект, вызывающий выброс этого вызова, находится в конце длинной цепочки объектов, которые связаны через родительский/дочерний объект. Мы работаем руководителем этой сети.

Bad performance Неудачный запуск, уведомление 4m казни в 9wu ... запрос

A night of good performance Хороший бег, обратите внимание 630K выполнений 9wu ... запрос

Edit: Я не в состоянии чтобы в основном воспроизвести это в модуле. Похоже, что когда у меня -xmx установлен очень низкий (28 м), дополнительных вызовов нет, но в xmx = 128m я получаю его большинство прогонов. Любые подсказки о том, где в Hibernate я могу понять, почему/как он примет решение о том, должен ли он прокси-сервер или нет?

Редактировать 2: Я не могу последовательно воспроизводить в своем модуле. Он отлично подойдет для 5 прогонов, а затем не будет работать 3, а затем сработает. Каждый раз, когда я запускаю то же самое единичное тестирование. Кажется, это проблема N + 1, она загружает кучу детей через запрос «select item0 ...», но во время хорошего запуска решает использовать другой запрос или не отбрасывает записи между webservice звонки. Я увижу, что я могу сделать, чтобы запутать объекты и предоставить некоторые подробности. К сожалению, к сожалению, это дерево, хранящееся в базе данных, и использует наследование с дискриминатором.

+0

Я заинтересован в ваш «Из моего анализа до сих пор я думаю, что он имеет отношение к спячке, предпочитая использовать/не использовать прокси». О каком «прокси» вы имеете в виду? Если вы говорите про прокси для сущностей, я никогда не слышал, чтобы Hibernate создавал прокси-серверы недетерминированным образом. Можете ли вы продолжить эту работу? –

+1

Мне кажется, что это что-то вроде: 1. Вы оставили длинную цепочку объектов, все ленивые. 2.В некоторых случаях вы просто перемещаете небольшую часть своей цепочки (что является хорошим случаем), в то время как в некоторых случаях вы перемещаете большую часть цепи, что приводит к огромному количеству ленивой выборки (что является плохим случаем). 3. или, в некоторых особых случаях, вы делаете выборку «un-reusable n + 1». Я настоятельно рекомендую вам иметь правильное ведение журнала в Hibernate и исследовать, в каком случае существует огромное количество генерируемых SQL (что должно быть очевидно) –

+0

вы могли бы разместить свои сопоставления, связанные с запросом? Я бы посоветовал вам включить нетерпеливую выборку на отображение и посмотреть, существует ли еще такое «неустойчивое недетерминированное поведение» –

ответ

3

Трудно, конечно, сказать, почему это может произойти. Тем не менее, есть несколько хороших ресурсов для optimizing performance in Hibernate and debugging problems with it.

В статье, посвященной статье, автор считает, что наилучшим способом диагностики проблем производительности является использование YourKit Java Profiler. Если ваша среда загрузки и производительности удалена, и вы не можете запустить профилировщик локально you can attach one remotely. Конечно, запуск профилировщика имеет некоторые накладные расходы, поэтому вы можете найти свои характеристики производительности, потому что у вас есть один прикрепленный. Тем не менее, это, вероятно, лучший выбор для отслеживания того, что происходит.

Другие полезные ссылки:

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

+0

Спасибо, что это отличные ссылки, я использовал вашkit ранее, но проблема, похоже, лежит в спящем режиме. Я получаю источники спящего режима. – Ravedave

0

Ваш Oracle 9 или меньше, может быть, ваша база данных будет уничтожен, вы можете экспортировать и импортировать базу данных только для случая http://www.oracle-base.com/articles/misc/detect-and-correct-corruption.php

+0

К сожалению, это не так. Наши ночные прогоны против Oracle II DB, и мои модульные тесты используют в памяти Derby DB, который воссоздан каждый прогон. – Ravedave

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