Причина агрессивного использования ЦП сервером приложений - PullRequest
1 голос
/ 28 мая 2011

Мы запускаем приложение JAVA в JBOSS с oracle. Мы использовали фреймворки Seam и Hibernate. Проблема, с которой мы сталкиваемся, заключается в том, что при запуске сервера приложений увеличивается число процессоров, и через час мы обнаружили, что загрузка ЦП близка до 90%. Это странно, и я не могу определить проблему.

Пожалуйста, помогите. Заранее спасибо.

Ура, Dwarak enter image description here

Ответы [ 3 ]

4 голосов
/ 28 мая 2011

В идеале вы можете использовать профилировщик, чтобы отследить проблему. Если вы не можете использовать профилировщик в среде, в которой он находится (например, в рабочей среде), попробуйте воспроизвести его где-нибудь еще и прикрепить там профилировщик. Хотя часто это может быть сложно, поэтому вот трюк, который я использовал несколько раз, чтобы найти причину использования ЦП в рабочей среде из командной строки:

watch -n1 'jstack [pid] | grep -A 1 RUNNABLE | grep -v RUNNABLE | grep -v \\-\\- | grep -v socketRead0 | grep -v socketAccept`

Если вы посмотрите это в течение короткого периода времени, вы можете увидеть некоторые общие методы, вызываемые. Затем захватите полный вывод jstack в файл:

jstack [pid] > jstack.log

Теперь найдите в файле один из методов, которые вы часто видели. Из его трассировки стека обычно можно найти код, отвечающий за перемалывание процессора. Если ничего не появляется, возможно, ваше время уходит на чрезмерную сборку мусора, и вам просто нужно увеличить память. Вы можете использовать:

`jmap -heap [pid]`

Чтобы получить лучшее представление об использовании памяти. А еще лучше, вы можете прикрепить jvisualvm или коммерческий профилировщик (например, YourKit ), чтобы увидеть его графически с течением времени. Я также иногда использовал watch -n1 'jmap -heap [pid]'.

4 голосов
/ 28 мая 2011
  • Прежде всего, убедитесь, что это процесс, который выполняется JBoss, который загружает процессор.Если вы используете Linux, используйте команду top, или в Windows используйте диспетчер задач, чтобы отслеживать загрузку ЦП процессом java, который запускает JBoss.
  • В этом случае посмотрите файлы журналов вашего сервера, чтобы увидетьчто происходит за это время.Действительно ли он выполняет какую-то значительную работу или загрузка ЦП высока, когда приложение также работает на холостом ходу?
  • Убедитесь, что в системе достаточно свободной памяти для ОС.Если процесс jboss израсходует всю свободную память, ОС не будет иметь достаточно памяти для своих собственных действий, что может привести к перегрузке (перестановке страниц в виртуальную память и из нее, что израсходует ресурсы ЦП).
  • Убедитесь, что вы предоставили достаточную память кучи для JVM.Вы можете увеличить эти значения в файле run.conf в каталоге bin JBoss.Когда размер кучи слишком мал для вашего приложения, может произойти сбой.Кроме того, если размер кучи слишком велик (например, более 2 ГБ), то время, затраченное на сборку GC, также увеличит нагрузку на ваш ЦП.
  • Проверка дискового ввода-вывода на вашем компьютере при запуске JBoss.Если вы установите очень низкие значения для вашего журнала и если JBoss завершит запись больших файлов журнала, это также может привести к высокой загрузке ЦП (для записи файлов журнала!).
  • Если вы используете JDK 1.5.0.10, посмотрите на эту ссылку. Мой сервер JBoss работает на 100% процессоре SYS в Linux;что может вызвать это?

Если ничто из вышеперечисленного не помогает, последнее средство - использовать инструмент профилирования.Я предлагаю JProfiler или Yourkit Profiler (коммерческий, но доступен 30-дневный маршрут), который очень удобен для пользователя.

0 голосов
/ 28 мая 2011

Используйте профилировщик, чтобы найти проблему. Если используется Oracle Java 6, начните с jvisualvm в JDK.

...