Проблема производительности в производстве - PullRequest
2 голосов
/ 13 июля 2011

Привет, я работаю над веб-инструментом Java.У нас есть два экземпляра нашего инструмента, развернутых на 2 отдельных серверах - один в производстве (используется одновременно многими клиентами) и один в среде разработчика, редко используемой мной.Оба экземпляра, dev и production, развернуты на абсолютно одинаковых серверах с одинаковыми спецификациями оборудования, имеют точный код, размер кучи, сервер приложений, версию и т. Д.

Но я наблюдаю большую медлительность в производственном экземплярепо сравнению с экземпляром dev даже в нечетные часы ночью, когда использование клиента равно нулю (у нас есть инструменты для мониторинга использования клиента в производстве).Это удивительно, потому что все факторы идентичны.Я предполагаю, что поскольку производственный экземпляр широко используется, куча там почти заполнена и фрагментирована, а куча в dev относительно свободна и не фрагментирована.Вот почему экземпляр dev намного быстрее, хотя все идентично.Является ли это разумным предположением, поскольку фрагментированная почти полная куча будет тратить больше времени на создание объектов и, таким образом, снижать производительность?

Ответы [ 2 ]

5 голосов
/ 13 июля 2011

Большинство GC выполняет копирование и сжатие, что позволяет избежать фрагментации. Только Concurrent Mark Sweep может получить некоторую фрагментацию, однако в большинстве случаев это не должно быть проблемой.

Вместо того, чтобы гадать, в чем может быть ваша проблема, я предлагаю вам оценить, что делает система. В идеале вы хотите профилировать свою производственную систему. например ночью или при низкой нагрузке. например VisualVM (бесплатно) или YourKit (лучше, не бесплатно!). Если это не вариант, вы можете отслеживать использование памяти и сколько времени он тратит на GCing. например с jstat

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

Вы уверены, что ваши серверы не сканируются веб-сканерами? (Они не спят и могут быть активными в любое время дня и ночи)

0 голосов
/ 14 июля 2011

Почему предполагалось, что куча фрагментирована?Вы можете использовать VisualGc, плагин для визуальной виртуальной машины, для анализа статистики GC в режиме реального времени.Вы можете вывести один из производственных серверов из трафика и профилировать его.

http://java.sun.com/performance/jvmstat/visualgc.html

При анализе необходимо учитывать множество факторов.Задержка, сетевой / дисковый ввод-вывод, записи в базе данных и их размер + индексы и т. Д.

...