Java веб-приложение очень медленно - PullRequest
0 голосов
/ 05 января 2012

Я использую Rackspace в качестве хостинг-провайдера, используя свой хостинг на облачном сервере, с планом 256 МБ.

Я использую Geronimo 2.2 для запуска моего Java-приложения.

Сервер не запускается noпроблема, загружает Geronimo довольно быстро, однако, когда я начал развертывать свое веб-приложение, оно занимает вечность, а после развертывания навигация по страницам занимает вечность.

Я наблюдал за серверомактивность, процессор не так занят, однако, 60% памяти используется.Может ли это быть проблемой?

Если да, то какие у меня варианты?Стоит ли подумать об обновлении этого облачного сервера до чего-либо с большей оперативной памятью или о смене хост-провайдера, чтобы он лучше соответствовал моим потребностям?


Редактировать: следует отметить, что даже если я нене развертывать мое приложение, просто загрузив Geronimo, иногда я получаю время соединения, когда пытаюсь завершить работу Geronimo.

Также база данных находится на том же сервере, что и приложение.(впрочем, я бы не сказал, что это интенсивный запрос)


Обновление :После того, что предложил @matiu, я попытался запустить free -m, и вот что я получаю:

             total       used       free     shared    buffers     cached
Mem:           239        232          6          0          0          2
-/+ buffers/cache:        229          9
Swap:          509        403        106

Это был совершенно другой результат, чем запуск ps ux , вот какЯ получил свои предыдущие 60%.

И я сделал проверку iostat, и около 25% времени iowait, и устройство постоянно пишет и читает.


обновление:
Модернизирован мой хостинг до 512 МБ, теперь он работает!Что-то, что я должен отметить, я забыл о памяти постоянного поколения Java, которая также используется Geronimo.Получается, мне нужно больше оперативной памяти, и больше оперативной памяти действительно решило мою проблему.(Как и ожидалось) ууу.

Ответы [ 3 ]

1 голос
/ 05 января 2012

Я предполагаю, что вы сталкиваетесь с «подкачкой».

Как вы знаете, Linux выгружает часть памяти на диск.Это отлично подходит для памяти, к которой мало обращаются.

Когда Java начинает есть кучу и кучу, запускается linux:

  1. Замена блока памяти A на диск, чтобы освободить место для чтения вблок B
  2. Блок чтения / записи B
  3. Перестановка блока B на диск, чтобы освободить место для какого-то другого блока.

Поскольку диск в 1000 раз медленнее, чем RAM, поскольку использование памяти увеличивается, ваша машина все более и более приближается к остановке.

С 256 МБ облачных серверов вы получаете 512 МБ пространства подкачки.


Проверка:

Вы можете проверить, имеет ли это место с free -m .. , на этой странице показано, как прочитать вывод:

Далее я проверю с помощью'iostat 5', чтобы увидеть, какова скорость дискового ввода-вывода в разделе подкачки.Я бы сказал, что скорость записи 300 или более означает, что вы почти мертвы в воде.Я бы сказал, что вы хотите сохранить скорость записи раздела подкачки ниже 50 блоков в секунду, а скорость чтения ниже 500 блоков в секунду ... если это возможно, большую часть времени они должны быть равны нулю.Помните, что диск в 1000 раз медленнее, чем ОЗУ.

Вы можете проверить, ест ли Java память, запустив top и нажав shift+m, чтобы упорядочить процессы по потреблению памяти.

Есливы хотите .. вы можете отключить раздел подкачки с помощью swapoff -a .., затем открыть веб-консоль и немного зайти на сайт ... вы скоро увидите сообщения об ошибках в консоли, такие как 'OOM Killed process xxx' (OOMЯ думаю, из-за нехватки памяти).Если вы видите те, которые Linux пытается удовлетворить запросы памяти, убивая процессы.Как только это произойдет, лучше перезагрузить компьютер.


Исправление:

Если это Java с использованием ОЗУ .. эта ссылка можетhelp.

Я думаю, что простым решением было бы просто обновить размер облачного сервера.

Может оказаться, что другой Java RTE может быть лучше.

Если вызапустите его в 32-битном chroot он может использовать меньше оперативной памяти.

0 голосов
/ 05 января 2012

Исходя из моего опыта, память и загрузка процессора на VPS довольно связаны. Это означает, что когда сервер приложений займет всю доступную память, загрузка ЦП начинает стремительно расти, в результате чего приложение становится недоступным.

Это всего лишь побочный эффект - вам действительно нужно выяснить, где возникли ваши проблемы!

Если потребление памяти очень велико, у вас может быть несколько причин:

  1. Это нормально - возможно, вы достигли точки, когда все процессы (сервер приложений, приложения в нем, фоновые процессы, демоны, операционная система и т. Д.), Вместе взятые, нуждаются в таком огромном объеме памяти. Это наименее вероятный сценарий .
  2. Утечка памяти - может произойти из-за ошибки в фреймворке или некоторой библиотеки (маловероятно) или вашего собственного кода (возможно). Это можно отслеживать и решать .
  3. Огромное количество запросов - каждый запрос будет занимать как процессор, так и память для обработки. Вы можете взглянуть на соотношение между запросами в секунду и потреблением памяти, то есть его можно отслеживать и разрешать.

Если вы заинтересованы в использовании процессора:

  1. Опять же, отслеживайте запросы к вашему приложению. Для постоянного количества запросов - ничего экстраординарного не должно быть.
  2. Один компонент истощает большинство ресурсов (может быть, ваша база данных установлена ​​на одном сервере и использует всю мощность процессора из-за неэффективных запросов? Медленный журнал поможет.)

Как видите, это не тривиальная задача, но у вас есть поддержка инструментов, которая может вам помочь. Я лично использую java мелодию и датчик .

0 голосов
/ 05 января 2012

Вам следует подумать о запуске виртуального выделенного сервера Linux с чем-то вроде линоде.Вам нужно было бы беспокоиться о том, как запустить службу Java и такие вещи, как брандмауэры и т. Д., Но, как только вы все сделаете правильно, вы станете собственным хостинг-провайдером, позволяющим вам делать все, что может делать автономный Linux-бокс..

Что касается памяти, я бы не обновлялся, пока у вас нет доказательств того, что вам не хватает.Израсходовано 60%, израсходовано менее 100% ...

Java обычно предполагает, что может принимать все, что ему назначено.Это означает, что если вы дадите ему максимум 200 МБ, то это означает, что можно взять 200 МБ, хотя он использует намного меньше.Есть способ заставить Java использовать меньше памяти, используя инкрементный сборщик мусора -Xincgc.Это фактически приводит к возврату фрагментов памяти в систему, когда она больше не нужна.Это немного секрет, на самом деле.Вы не увидите, чтобы кто-то указывал на это ...

...