Веб-приложение Java очень медленное

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

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

Сервер запускается без проблем, загружает 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. Оказывается, мне нужно больше ОЗУ, и больше ОЗУ решило мою проблему. (Как и ожидалось) ура.


person HeavenAgain    schedule 05.01.2012    source источник
comment
Может проблема в вашем приложении, или в сети, или ...? 150 МБ памяти для сервера приложений - довольно распространенное явление (на самом деле это мало), так что, думаю, проблема не в этом.   -  person home    schedule 05.01.2012
comment
приложение работает нормально на localhost (мой локальный компьютер), сеть тоже должна быть в порядке. Проблема не в моем приложении, потому что у меня даже есть проблема с навигацией по консоли Geronimo в веб-клиенте.   -  person HeavenAgain    schedule 05.01.2012
comment
Geronimo и WAS потребляют в 3 раза больше ресурсов по сравнению с Glassfish.   -  person Acn    schedule 05.01.2012
comment
Когда вы говорите план 256 МБ, вы имеете в виду, что ваш (виртуальный) сервер имеет 256 МБ ОЗУ? Если это так, я бы определенно попытался обновить оперативную память - я бы начал с того, что есть у вашего локального хоста.   -  person Neville Kuyt    schedule 05.01.2012


Ответы (3)


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

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

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

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

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

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


Проверка:

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

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

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

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


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

Если это Java, использующая ОЗУ .. эта ссылка может помочь.

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

Вы можете найти другой Java RTE, возможно, лучше.

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

person matiu    schedule 05.01.2012
comment
Привет спасибо! Это отличный ответ. Не могли бы вы уточнить «скорость записи 300 или более», и как мне узнать, что это за раздел подкачки? При запуске iostat вывод показывает мне, что у меня есть 2 устройства, xvdc и xvda. xvdc выполняет большую часть работы, обычно tps более 1000, kB_read / s более 3000, kB_write / s более 1000. Но в целом, я думаю, что знаю, в чем моя проблема. Я попробую обновить свой сервер сегодня вечером и сообщу, сработало ли это. - person HeavenAgain; 05.01.2012
comment
Это был PermGen, который тоже занимал память, спасибо за вашу помощь! - person HeavenAgain; 06.01.2012
comment
Я почти уверен, что xvdc будет вашим разделом подкачки. Вы можете увидеть это, запустив: sudo grep xvd / etc / fstab; 3000 записей в секунду - это слишком много ... это действительно должно убивать вашу производительность. Определенно слишком много памяти. - person matiu; 06.01.2012

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

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

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

person Mike    schedule 05.01.2012

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

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

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

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

Если вас интересует использование ЦП:

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

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

person ŁukaszBachman    schedule 05.01.2012