Перейти к содержимому

Фотография

Чем и как найти возможную утечку памяти (memory leak)


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 20

#1 testernew

testernew

    Новый участник

  • Members
  • Pip
  • 49 сообщений
  • ФИО:tester


Отправлено 21 октября 2007 - 05:37

Делаю нагрузочное тестирование Веб-приложения, написанного на Java Script.

Конфигурация компьютера (он же веб-сервер тестируемого приложения):
HARWARE:
Processor: P4 2.4GHz, Cache Size 1024Kb
Chipset: Intel 845G
Memory: Total Memory 768Mb with 8 Mb Shared Memory
DDR1 256Mb/133MHz (DDR266)
DDR2 512Mb/133MHz (DDR266)
HDD: WDC WD800JB-00JJC0 - 80.0Gb, S.M.A.R.T. Compatible but Disable
LBA, 32 Bit Mode On, Block Mode 16sec, PIO Mode4, UDMA Mode5
Disc C: NTFS 42Gb / 30Gb free
Disc D: NTFS 38Gb / 32Gb free
SOFTWARE:
OS: Windows 2000 Advanced Server Service Pack 4
Sun JRE: Sun Java Runtime Environment, Standard Edition v. 1.4.1
jboss: v 3.2.1
Browsers: Internet Explorer v. 6.0.2800.1106, 128-bit, SP1; Mozilla Firefox v. 2.0.0.7
MySQL: MySQL Administrator 1.1; MySQL Server 4.1; MySQL-Front 3.2
AntiVirus: Semantic AntiVirus 2005; Program version 10.0.0.359; Scan engine version 103.0.2.7
(Антивирус во время теста выгружается/отключается)
Load Tool: Apache JMeter v.2.3 2007

Сценарий тестирования прост - только два HTML запроса на открытие двух последовательных страниц приложения, без логина - просто имитация перехода со страницы1 на страницу2. (т.е. на странице1 есть ссылка на страницу2) без использования MySQL
В Jmeter:
запускаю Тест1: Users/Rump-up; 1000/100, Timer: 1 / 1
В тесте CPU Usage: 60%, MEM Usage: 75%
После завершения CPU Usage: 2%, MEM Usage: 70%
запускаю Тест2: Users/Rump-up: 1000/50; Timer: 500 / 500
В тесте CPU Usage: 96%, MEM Usage: 95%
После завершения CPU Usage: 2%, MEM Usage: 93%

Результат работы Tеста1 (Jmeter):
Label# Samples Average Median90% Line Min Max Error % Throughput KB/sec
page1 1000 32 31 32 15 797 0.0 9.6 55751.5
page2 1000 26 16 32 15 672 0.0 9.7 43889.46
TOTAL 2000 29 31 32 15 797 0.0 19.3 99574.1

Результат работы Tеста2 (Jmeter):
Label # Samples Average Median90% Line Min Max Error % Throughput KB/sec
page1 1000 7521 5484 21047 15 24391 0.0 11.0 63592.9
page2 1000 6419 5515 15656 15 24437 0.0 11.2 51074.2
TOTAL 2000 6970 5485 18453 15 24437 0.0 21.0 113579.2

Вывод по результатам Теста2 (Users/Rump-up: 1000/50; Timer: 500 / 500)
После завершения теста:
- процессор освобождается
- память не освобождается
- ошибок нет
- компьютер/веб-сервер виснет.

Также я пробовал тест с более мягкими условиями: Users/Rump-up: 100/5.
Это близкая к реальной жизни загрузка.
Результат тоже отрицательный.
И это при том, что тестировались простые функции.
А если юзер будет делать что-то более сложное (в т.ч. с использованием MySQL), то сервер завалится при Users/Rump-up: 100/50.
Т.е. безобидные 2 юзера в секунду повалят сервер.

Если я правильно понимаю, то отрицательный результат теста это неоптимизированный код приложения, а именно утечка памяти.
Вопрос: Как и чем подтвердить или опровергнуть мои подозрения по возможной утечке памяти?
Просьба дать совет по простым в использовании и бесплатным тулзам, чтобы определить какие конкретно модули-процессы порождают утечку памяти.

Прикрепленные файлы


  • 0

#2 Case

Case

    Основатель

  • Members
  • PipPipPipPipPipPip
  • 7 071 сообщений
  • ФИО:Панкратов Вячеслав
  • Город:Украина, Киев.

Отправлено 22 октября 2007 - 07:14

Я наверное вывалился из контекста клиент-серверных систем. Java Script - это на клиенте в брауезере - верное понимаю? На чём сервер написан?
  • 0
Слава Панкратов
Редактор портала www.it4business.ru

#3 atermath

atermath

    Новый участник

  • Members
  • Pip
  • 30 сообщений
  • ФИО:Сикорский Андрей Анатольевич
  • Город:Москва

Отправлено 22 октября 2007 - 07:52

у вас указан сервер JBoss. Если мне не изменяет память, то сердцем у него Tomcat. Томкат после работы _не освобождает_ память - и это нормальное поведение. Надо узнать, сколько памяти для него прописано в конфигах (с каким значением он стартует. По умолчанию он почти сразу всю указанную величину резервирует)
Описанные вами симптомы очень похожи на то, что
а) у томката закончились рабочие threads
б) используется неправильный Garbage Collector
в) в приложении действительно утечка памяти

Рекомендую провести нагрузочное тестирование при условии, что сервер находится под профайлером (надо: параметры кучи, динамика сбора мусора, количество зарегистрированных в системе классов и т.п.)
А вообще, мне кажется, что это задачка для специалиста в тонкой настройке JBoss (Tomcat)
  • 0
Андрей Сикорский
Тестировщик, математик

#4 atermath

atermath

    Новый участник

  • Members
  • Pip
  • 30 сообщений
  • ФИО:Сикорский Андрей Анатольевич
  • Город:Москва

Отправлено 22 октября 2007 - 07:54

Я наверное вывалился из контекста клиент-серверных систем. Java Script - это на клиенте в брауезере - верное понимаю? На чём сервер написан?

Там указано - JBoss (там томкат ядром), значит Java.
  • 0
Андрей Сикорский
Тестировщик, математик

#5 testernew

testernew

    Новый участник

  • Members
  • Pip
  • 49 сообщений
  • ФИО:tester


Отправлено 22 октября 2007 - 11:46

у вас указан сервер JBoss. Если мне не изменяет память, то сердцем у него Tomcat. Томкат после работы _не освобождает_ память - и это нормальное поведение. Надо узнать, сколько памяти для него прописано в конфигах (с каким значением он стартует. По умолчанию он почти сразу всю указанную величину резервирует)
Описанные вами симптомы очень похожи на то, что
а) у томката закончились рабочие threads
б) используется неправильный Garbage Collector
в) в приложении действительно утечка памяти

Рекомендую провести нагрузочное тестирование при условии, что сервер находится под профайлером (надо: параметры кучи, динамика сбора мусора, количество зарегистрированных в системе классов и т.п.)
А вообще, мне кажется, что это задачка для специалиста в тонкой настройке JBoss (Tomcat)


Спасибо за наводку!
К сожалению, я не специалист по JBoss (Tomcat) :aggressive:
И поэтому, сразу уточняющие вопросы:
1. Где смотреть конфиги про память, с которой стартует Tomcat?
2. Можно поподробнее насчёт нагрузочного тестирования под профайлером? Т.е. что это такое и как оно делается?
3. Где брать параметры кучи, динамику сбора мусора, количество зарегистрированных классов,...?
4. Достаточно ли для решения такой проблемы JMeter?
  • 0

#6 testernew

testernew

    Новый участник

  • Members
  • Pip
  • 49 сообщений
  • ФИО:tester


Отправлено 22 октября 2007 - 13:10

И остался без ответа вопрос по бесплатным-простым тулам по просмотру Memory Leak.
  • 0

#7 Case

Case

    Основатель

  • Members
  • PipPipPipPipPipPip
  • 7 071 сообщений
  • ФИО:Панкратов Вячеслав
  • Город:Украина, Киев.

Отправлено 22 октября 2007 - 13:37

Я наверное вывалился из контекста клиент-серверных систем. Java Script - это на клиенте в брауезере - верное понимаю? На чём сервер написан?

Там указано - JBoss (там томкат ядром), значит Java.

Можно и не томкат а апача поднять при старте, ну да не суть. Я в курсе что такое jBoss - мне всегда хочется чтобы народ чутоку больше сам думал. А то клиент-сервер на Java script это звучит :)
  • 0
Слава Панкратов
Редактор портала www.it4business.ru

#8 atermath

atermath

    Новый участник

  • Members
  • Pip
  • 30 сообщений
  • ФИО:Сикорский Андрей Анатольевич
  • Город:Москва

Отправлено 22 октября 2007 - 14:48

Спасибо за наводку!
К сожалению, я не специалист по JBoss (Tomcat) :aggressive:
И поэтому, сразу уточняющие вопросы:
1. Где смотреть конфиги про память, с которой стартует Tomcat?
2. Можно поподробнее насчёт нагрузочного тестирования под профайлером? Т.е. что это такое и как оно делается?
3. Где брать параметры кучи, динамику сбора мусора, количество зарегистрированных классов,...?
4. Достаточно ли для решения такой проблемы JMeter?

К сожалению я тоже не специалист - просто в свое время тюнил наш Томкат.
0. Уточните, что ваше приложение действительно на Java - это было мое предположение, может и преждевременное.
1.Про конфиги: я не работал с JBoss как таковым, но мне что-то подсказывает, что там должна быть диреткория conf в его директории установки (к сожалению, не имею необходимого времени на установку и конфигурацию). В нем можно поискать параметры старта -Xmx и -Xms (верхнее и нижнее значение памяти сответственно)
2. Профалйер: инструмент, который подсоединяется к (в нашем случае) джава-процессу сервера и следит за всеми операциями с памятью, созданием/удаленеим новых классов и т.п. Наша компания использует JProfiler (try-buy версии хватает за глаза), но я слышал, что в Tomcat 6 вроде как есть нативные средства мониторинга. Вкратце суть такова: вы запускаете профайлер, из-под него запускается в специальном режиме Томкат. Вы нагружаете ваше приложение, и смотрите за метриками в профайлере: рост загруженных классов, корректность работы GC и т.п.
3. См. пункт 2: это все выдает профайлер
4. Для решения JMeter недостаточно

К вопросу о самой сути теста: каким образом вы получили указываемые параметры теста? Не взяты ли они "с потолка"? Users/rump up это непонятное соотношение. Поясняю: 100 юзверей и рамп ап 20 означает, что каждый пользователь изначально стартует через 100/20 = 5 секунд после предыдущего. Единовременная нагрузка приложения после старта всех пользователей, соответственно, равна все тем же 100 пользователям. В секунду. Так что поподробнее, пожалйуста, какую нагрузку вы хотите сэмулировать и что с ее помощью хотите показать.
  • 0
Андрей Сикорский
Тестировщик, математик

#9 a66at

a66at

    Постоянный участник

  • Members
  • PipPipPip
  • 184 сообщений
  • ФИО:Victor Ichalov

Отправлено 22 октября 2007 - 15:17

А то клиент-сервер на Java script это звучит :)

В качестве очередного бесплатного восстановления справедливости: была такая технология, Microsoft Active Server Pages, в ней можно было использовать JavaScript для программирования на стороне сервера. По остальным буквам претензий не имею.

Если по делу.

1. Где смотреть конфиги про память, с которой стартует Tomcat?

В его стартап скрипте (том .bat файле, который надо нажать, чтобы он запустился) или настроечных xml, на которые он ссылается. Там, я полагаю, должны быть ключи -Xms , -Xmx, -server и т.п. Просто поищите файловым поиском в его директории эти буквосочетания.

2. Можно поподробнее насчёт нагрузочного тестирования под профайлером? Т.е. что это такое и как оно делается?

В данном случае, профайлер это софтина, которая будет показывать, сколько памяти в куче JVM занято, а сколько свободно. В принципе этого достаточно, чтобы понять, правда ли есть утечка памяти, или её просто не хватает, чтобы всех обслужить.

И остался без ответа вопрос по бесплатным-простым тулам по просмотру Memory Leak.

Вот я не специалист по JBoss, но по аналогии с другими продуктами думаю, у него в административной консоли можно смотреть занятость памяти и количество активных потоков, сделать принудительную сборку мусора. В первом приближении этого достаточно для Ваших целей.
В JDK начиная с 1.5 есть ещё бесплатный монитор JConsole, который делает всё то же самое на уровне JVM, вне зависимости от того, какой сервер приложений и приложения на ней выполняются. Для более ранних версий ничего такого же практичного в голову не приходит.
  • 0

#10 testernew

testernew

    Новый участник

  • Members
  • Pip
  • 49 сообщений
  • ФИО:tester


Отправлено 23 октября 2007 - 02:03

Спасибо, aftermath и аббат, за подробности. Сообщаю, что нашёл.

"0." Приложение написано на Javascript..

"1. Про конфиги:" Порылся в JBoss и вот что нашёл в четырёх файлах jboss-3.2.1\bin

installService.bat (всё содержимое):
JavaService.exe -install dform %JAVA_HOME%\jre\bin\server\jvm.dll -Duser.home=%DFORM_PREFS_HOME% -Djava.class.path=%JBOSS_HOME%\bin\run.jar;%JAVA_HOME%\lib\tools.jar; -XX:MaxPermSize=128m -Xmx512m -start org.jboss.Main -params start -stop org.jboss.Main -params stop -method systemExit -err %JBOSS_HOME%\bin\stderr.txt

Run.bat

set JAVA_OPTS=%JAVA_OPTS% -Xms64m -Xmx1024m -Xss2m -Djava.io.tmpdir=%DIRNAME%\server\default\tmpjetty


Run.conf
#
# Specify options to pass to the Java VM.
#
#JAVA_OPTS="-server -Xms128m -Xmx512m"

Run.ch
#Memory Usage
JAVA_OPTS="$JAVA_OPTS -Xms96m -Xmx128m -Djava.io.tmpdir=$JBOSS_HOME/server/default/jettytemp"

Мои комментарии: не знаю сколько нужно выделять памяти для приложения, но разброс Xms,Xmx-параметров напоминает кашу.

"4. Для решения JMeter недостаточно " Т.е., если я буду терзать приложение с помощью Jmeter и анализировать профайлер, то этого недостаточно?
А если недостаточно, то с каким минимальным набором тулов будет достаточно?

"5. К вопросу о самой сути теста:"
- Я тестирую это приложение на своей локальной машине-сервере для того, чтобы, отработав локальный сценарий затем перейти к тестированию этого же приложения уже в вэбе.
- Параметры теста взяты не с потолка, а известно, что реальное приложение нагружается до 100 concurrent users.
Только с соотношением значений параметров User/Rump-up я напутал (новичок с Jmeter :aggressive: ) – стоит задача протестировать приложение сотней одновременно работающих изеров.
Для этого стартовать они будут по рендому. Количество их будет 100 (для порядка попробую и больше, так сказать "на вырост"), а rump up, если я правильно понимаю, будет зависеть еще и от сложности-длинности сценария поведения юзеров. Сценарий мне ещё не дали и я его выдумываю сам, да и простой он у меня пока.
Не совсем еще понимаю суть параметров Uniform Random Timer – Thread Delay Properties:
Random Delay Maximum (ms) – это что максимальное время для random-сгенерированных задержек??? Тогда как этот параметр "дружит" с парой параметров Users/Rump-up.
Constant Delay Offset (ms) - ???
задаю эти два параметра почти наугад

Спросил у программиста о Tomcat. Говорит, что установлен только сервер JBoss, а Tomcat не установлен. Странно - я нашел какие-то следы Tomcat в папке jboss-3.2.1. Т.к. с Ваших слов "… сердцем у JBoss является Tomcat", я не уверен за правильность/грамотность программиста.

Вопрос по JConsole: насколько просто и понятно с ней работать (ещё не знаю что это, но интересно)?

Всё вышеспрошенное выдаёт меня с головой – я только 2 недели как начал впервые тестировать Java приложение с помощью нового для меня Jmeter. До этого немного тестировал win-applications с помощью продуктов Mercury: WinRunner, QTP, LoadRunner. Тулы замечательные, но сейчас требование однозначное – пользоваться тулами либо бесплатными, либо недорогими, как TestComplete6 (пробовал триал версию - вроде неплохая, надо решить стоит он того, чтобы купить или нет - там неплохое функциональное тестирование).

С нагрузочным тестированием в Java environment столкнулся впервые.
Очень хочется разобраться как работает JBoss, Jmeter, JConsole и хочется попутно "зацепить" Javascript – писать тест-скрипты, разбираться в коде Javascript (делать WhiteBox testing).

Спасибо этому форуму, лично aftermath, аббату и другим местным корифеям!
С нетерпением жду очередные разьяснения на мои вопросы
  • 0

#11 atermath

atermath

    Новый участник

  • Members
  • Pip
  • 30 сообщений
  • ФИО:Сикорский Андрей Анатольевич
  • Город:Москва

Отправлено 23 октября 2007 - 06:00

"0." Приложение написано на Javascript..

Честно - немного не догоняю. Может быть, все-таки клиенсткая часть на JS, а серверная - на JAVA? (jsp какой-нибудь)? Как осуществляется выдача сервером страниц по вашему запросу?

installService.bat (всё содержимое):
JavaService.exe -install dform %JAVA_HOME%\jre\bin\server\jvm.dll -Duser.home=%DFORM_PREFS_HOME% -Djava.class.path=%JBOSS_HOME%\bin\run.jar;%JAVA_HOME%\lib\tools.jar; -XX:MaxPermSize=128m -Xmx512m -start org.jboss.Main -params start -stop org.jboss.Main -params stop -method systemExit -err %JBOSS_HOME%\bin\stderr.txt

Кажется, это установка JBoss как сервиса (тогда его можно будет запускать из консоли управления в разделе "Службы и сервисы виндовз". Если вы запускаете его как службу винды, то имеет смысл передать ему параметры -Xmx и -Xms через свойства его службы

Run.bat

set JAVA_OPTS=%JAVA_OPTS% -Xms64m -Xmx1024m -Xss2m -Djava.io.tmpdir=%DIRNAME%\server\default\tmpjetty


Run.conf
#
# Specify options to pass to the Java VM.
#
#JAVA_OPTS="-server -Xms128m -Xmx512m"

Run.ch
#Memory Usage
JAVA_OPTS="$JAVA_OPTS -Xms96m -Xmx128m -Djava.io.tmpdir=$JBOSS_HOME/server/default/jettytemp"

Это уже ближе, как мне кажется, к истине. Так, если вы стартуете сервер именно запуская этот скрипт, то имеет смысл копаться в нем. Не очень себе представляю, в каком порядке обрабатываются файлы на старте, поэтому я бы установил в них всех параметры -Xms=-Xmx=512m (то есть минимальный стартовый равен максимальному и 512 -для вашей машинки это потолок, у вас всего чуть больше 700 Мб)

Мои комментарии: не знаю сколько нужно выделять памяти для приложения, но разброс Xms,Xmx-параметров напоминает кашу.

Возможно, во всем этом есть смысл: сервис устанавливается с одними параметрами, запуск с помощью скрипта - с другими.

"4. Для решения JMeter недостаточно " Т.е., если я буду терзать приложение с помощью Jmeter и анализировать профайлер, то этого недостаточно?
А если недостаточно, то с каким минимальным набором тулов будет достаточно?

Минимум необходимых инструментов - это JMeter, хороший профайлер (в идеале - чтобы выдавал не только параметры кучи, но и частоту использования Garbage Collector, количество классов в системе). Кстати, по теме - а может и не совсем: IBM Heap analyzer. Ну и кто-то/что-то, что может анализировать данные :-) Необязательно инструмент - но как правило анализ таких вещей сводится к: "провисла" или нет кривая кучи, что творится с памятью под ClassLoader (PermGenSpace out of memory error - свидетельствует о том, что упал classLoader, ему не хватило памяти). + смотрите логи самого сервера и логи вашего приложения (для серверных логов неплохо бы перевести его в режим debug - но только для исследования утечек памяти! режим debug снижает произодительность сервера!). логи вашего приложения - спросите программистов, куда они пишут их и пишут ли вообще. Мы у себя в конторе за правило берем в логи в debug режиме логгера скидывать информацию по каждому запросу пользователя и размеру кучи.

"5. К вопросу о самой сути теста:"
- Я тестирую это приложение на своей локальной машине-сервере для того, чтобы, отработав локальный сценарий затем перейти к тестированию этого же приложения уже в вэбе.
- Параметры теста взяты не с потолка, а известно, что реальное приложение нагружается до 100 concurrent users.

Что это означает? 100 пользователей в секунду, минуту, час, день? Исходя из условий вашего теста могу предположить, что в секунду. Откуда такая информация? из требований? а там точно пользователей, а не запросов к приложению? Это достаточно большая цифра. Если не в секунду - то тогда надо пересчитать это число :-) Вдобавок, пока вы гоняете этот тест на своей машине, не ожидайте, что все 100 пользователей смогут отработать: ваша машина по мощности и загруженности отличается от тестового сервера :-) Рекомендую отладить скрипты для мЕньшего количества пользователей. Фактически то, что у вас сейчас зависло приложение на вашей машине при 100 пользователях не означает, что в приложении утечка памяти, это может означать все что угодно: ваша машина не справилась, утечка памяти, томкат скушал всю память на машине, винда начала сопротивляться, ураган Катрина косвенно повлиял на работу сервера и т.п. Измерение перформанса хорошо на машине, максимально приближенной по параметрам к production-серверу. В любом другом случае очень сложно пересчитать реальную производительность. Если вообще возможно

Только с соотношением значений параметров User/Rump-up я напутал (новичок с Jmeter :aggressive: ) – стоит задача протестировать приложение сотней одновременно работающих изеров.

Ramp-up - это время, за которое должны будут стартовать все пользователи. Поясняю. У вас есть 10 пользователей, вы указали Rump-up 20 секунд. Это означает, что стартует сначала 1ый пользователь, потом через rump-up/users = 20/10=2 секунды стартует второй. Потом через 2 секунды третий и т.п. За rump-up соответственно поднимутся все. Для чего это нужно? для плавного увеличения нагрузки на сервер. перформанс редко меряется сразу, сервер должен "войти" в состояние нагрузки - для этого и нужен rump-up

Для этого стартовать они будут по рендому. Количество их будет 100 (для порядка попробую и больше, так сказать "на вырост"), а rump up, если я правильно понимаю, будет зависеть еще и от сложности-длинности сценария поведения юзеров. Сценарий мне ещё не дали и я его выдумываю сам, да и простой он у меня пока.

Разбираемся. Стартовать пользователи в JMeter по рендому не могут. По рендому может выбиратся тот кейс/шаг, который будет выполняться тем или иным пользователем (например, у вас в тестплане два HttpRequest объединены под Random order controller - это значит, что каждый пользователь будет произвольно выбирать между ними). Rump-up (см. комментарий выше по тексту) это величина вообще сложная для расчета. Лично мы ее определяем эмпирически, косвенно вводя зависимость между длинной самого продолжительного пользовательского кейса в тестплане, количеством пользователей и интенсивностью загрузки, которую хотим получить. Общий принцип: сделать ее такой, чтобы сервер по возможности не свалился, не достигнув необходимого количества пользователей, но при этом достижение этой точки было разумно по времени. Если вы не можете добиться такого параметра - один из признаков slow performance вашего приложения (после этого задаются вопросом - а можем ли мы обеспечить такой перформанс)

Не совсем еще понимаю суть параметров Uniform Random Timer – Thread Delay Properties:
Random Delay Maximum (ms) – это что максимальное время для random-сгенерированных задержек??? Тогда как этот параметр "дружит" с парой параметров Users/Rump-up.
Constant Delay Offset (ms) - ???
задаю эти два параметра почти наугад

плохо, что наугад.
Random delay maximum (RDM): максимальная длина задержки в соответствующем контроллере, верхняя граница для генератора случайных чисел. Никаким образом не коррелирует с Rump-up, кроме как влияет на максимальную продолжительность того сценария, в котором присутствует
Constant delay offset (CDO): определяет нижнюю границу (точнее, насколько нижняя граница отстоит от RDM]. Если говорить языком математики, то время у вас будет генерироваться равномерно-случайно из отрезка [RDM-CDO; RDM].

Спросил у программиста о Tomcat. Говорит, что установлен только сервер JBoss, а Tomcat не установлен. Странно - я нашел какие-то следы Tomcat в папке jboss-3.2.1. Т.к. с Ваших слов "… сердцем у JBoss является Tomcat", я не уверен за правильность/грамотность программиста.

В коллегах сомневаться можно, но осторожно. И тем более в квалификации. может, это не тот программист? На всякий случай:
1. http://www.jboss.org/products/jbossas - смотрим таблицу, в ней написано: "JBoss AS is the #1 Java application server on the market. What makes it even better is the fact that it integrates Hibernate, Apache Tomcat, EJB 3.0, and JBoss Cache into its microkernel foundation so you don't have to."
2. Можно заглянуть в Википедию: "JBoss AS 4.0 is a J2EE 1.4 application server, with embedded Tomcat 5.5."

в этом месте закончилась возможность делать цитаты :-) Форум позволяет их сделать не больше 10.

Вопрос по JConsole: насколько просто и понятно с ней работать (ещё не знаю что это, но интересно)?

Лично я не работал с этой системой, может быть, сообщество поможет? В свою очередь благодарен тем, кто указал на этот инструмент - т.к. я попробую использовать его для наших нужд :-)

Всё вышеспрошенное выдаёт меня с головой – я только 2 недели как начал впервые тестировать Java приложение с помощью нового для меня Jmeter. До этого немного тестировал win-applications с помощью продуктов Mercury: WinRunner, QTP, LoadRunner. Тулы замечательные, но сейчас требование однозначное – пользоваться тулами либо бесплатными, либо недорогими, как TestComplete6 (пробовал триал версию - вроде неплохая, надо решить стоит он того, чтобы купить или нет - там неплохое функциональное тестирование).
С нагрузочным тестированием в Java environment столкнулся впервые.
Очень хочется разобраться как работает JBoss, Jmeter, JConsole и хочется попутно "зацепить" Javascript – писать тест-скрипты, разбираться в коде Javascript (делать WhiteBox testing).


ничего страшного, что недолго: рекомендую погуглить на тему тестинга как такового, заглянуть на sqaforums.com - там иногда полезные мысли по тестированию. В аттаче лежит файлик в 350 килобайт по перформансу томката - он несколько старый, но основные принципы и вещи, на которые стоит обратить внимание там есть. В вашем случае все осложняется тем, что надо будет еще смотреть настройки hibernate и JBoss cache (если эти возможности используются в вашем приложении).
Насчет White-box тестирования java script: промолчу :-).

Прикрепленные файлы


  • 0
Андрей Сикорский
Тестировщик, математик

#12 a66at

a66at

    Постоянный участник

  • Members
  • PipPipPip
  • 184 сообщений
  • ФИО:Victor Ichalov

Отправлено 23 октября 2007 - 06:34

"0." Приложение написано на Javascript..

Действительно, загадочно. А какое расширение имеет пакет с приложением, когда его передают разработчики? Или, если это архив, то какие файлы там внутри?

Вопрос по JConsole: насколько просто и понятно с ней работать (ещё не знаю что это, но интересно)?

Мне кажется, достаточно просто и понятно.
Вот тут есть соответствующая случаю картинка: http://java.sun.com/...MemoryDetection

Почитал интернет, у JBoss 3 нет собственной административной консоли, только JMX интерфейс. Так что в Вашей конфигурации, действительно, наверное дешевле всего осваивать какой-нибудь try&buy профайлер времён используемой JRE.

По поводу количества пользователей: для того, чтобы определить утечку, в принципе, можно запуститься и одним пользователем. Потом, если не найдёте утечки - пятью. Потом прикините расход памяти сервером приложений и на одного активного пользователя, и посчитаете, сколько пользователей можно обслужить имея 512Мб.
  • 0

#13 Case

Case

    Основатель

  • Members
  • PipPipPipPipPipPip
  • 7 071 сообщений
  • ФИО:Панкратов Вячеслав
  • Город:Украина, Киев.

Отправлено 23 октября 2007 - 10:20

А то клиент-сервер на Java script это звучит :)

В качестве очередного бесплатного восстановления справедливости: была такая технология, Microsoft Active Server Pages, в ней можно было использовать JavaScript для программирования на стороне сервера. По остальным буквам претензий не имею.

Согласен - 1:0, была такая штука :) Я не сталкивался в разработке с таким использованием ASP, вот и не вспомнилось.

Правда понятнее всё же не стало. Tomcat не используется, сервер на JavaScript - сервер приложений jBoss :) Я, конечно, верю в изобретательность отечественных разработчиков, но использовать jBoss, чтобы внутри поднять какой-то контейрер, внутри которого развернуть MS ASP по-моему всё-таки слишком.
  • 0
Слава Панкратов
Редактор портала www.it4business.ru

#14 Case

Case

    Основатель

  • Members
  • PipPipPipPipPipPip
  • 7 071 сообщений
  • ФИО:Панкратов Вячеслав
  • Город:Украина, Киев.

Отправлено 23 октября 2007 - 10:21

По поводу количества пользователей: для того, чтобы определить утечку, в принципе, можно запуститься и одним пользователем. Потом, если не найдёте утечки - пятью. Потом прикините расход памяти сервером приложений и на одного активного пользователя, и посчитаете, сколько пользователей можно обслужить имея 512Мб.

В KB!
  • 0
Слава Панкратов
Редактор портала www.it4business.ru

#15 a66at

a66at

    Постоянный участник

  • Members
  • PipPipPip
  • 184 сообщений
  • ФИО:Victor Ichalov

Отправлено 23 октября 2007 - 10:44

Правда понятнее всё же не стало.

У них может быть, например, это: https://phobos.dev.java.net/. К проблемам нагрузочного тестирования это правда мало относится.
  • 0

#16 atermath

atermath

    Новый участник

  • Members
  • Pip
  • 30 сообщений
  • ФИО:Сикорский Андрей Анатольевич
  • Город:Москва

Отправлено 23 октября 2007 - 11:20

Правда понятнее всё же не стало.

У них может быть, например, это: https://phobos.dev.java.net/. К проблемам нагрузочного тестирования это правда мало относится.

Да, не имеет: если было бы это - то не возникало вопроса с JMeter, т.к. он не поддерживает xmlRequest (пока не поддерживает), а работает только с get и post - простая генерилка трафика.
  • 0
Андрей Сикорский
Тестировщик, математик

#17 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 23 октября 2007 - 12:22

Задача поиска утечек памяти разделяется на две подзадачи. Во-первых, нужно определить имеет ли вообще утечка памяти место, или это только так кажется. Во-вторых, если утечка таки есть, нужно локализовать её источник.

Первая задача проще, для её решения можно пользоваться почти любым инструментом, который умеет показывать размер хипа в JVM. Можете попробовать, например, вот этот -- https://visualvm.dev...escription.html . Следует заметить, что в Java сборщик мусора работает по весьма хитрому алгоритму (крупные сборки он устраивает относительно нечасто), поэтому инструмент скорее всего будет показывать "пилообразную" картинку размера хипа. Если "пила" лежит горизонтально -- всё нормально. Если же она ползёт вверх -- где-то подтекает. Ещё нужно отметить, что сначала может быть рост, который постепенно стабилизируется. Если при постоянной нагрузке через некоторое время стабилизация наступает -- всё нормально. Если же рост не прекращается -- утечки таки есть.

Что касается локализации причин, тут заканчивается наука и начинается магия. Дело в том, что приходится искать не то, что есть (память аллоцирована), а то, чего нет (память НЕ освобождается). Разные инструменты используют разные эмпирики и потому они некоторые утечки обнаруживают, а другие не замечают в упор. Разные инструменты не замечают разные вещи. Поэтому тут имеет смысл попробовать несколько разных инструментов, спросить у Гугла. На крайний случай всегда остаётся ручной поиск -- в любом профилировщике сбрасывается два дампа и сравнивается. Мне, например, нравится, как профилирование памяти делают AppPerfect и YourKit. Но вообще-то тут надо подбирать молоток по руке.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#18 a66at

a66at

    Постоянный участник

  • Members
  • PipPipPip
  • 184 сообщений
  • ФИО:Victor Ichalov

Отправлено 23 октября 2007 - 12:58

Следует заметить, что в Java сборщик мусора работает по весьма хитрому алгоритму

Именно на этот случай там рядом с графиком обычно имеется кнопка, которая вызывает System.gc().
Более того, насколько я могу судить, сам этот вызов, System.gc(), был выведен в API в первую очередь в обеспечение отлова утечек на этапе модульного тестирования (что, кстати, позволяет их сразу и локализовать). Для нагрузочного найденные утечки памяти это всё-таки "попутный газ" - можно найти, а можно и не найти, об чём имеются яркие свидетельства.
  • 0

#19 testernew

testernew

    Новый участник

  • Members
  • Pip
  • 49 сообщений
  • ФИО:tester


Отправлено 24 октября 2007 - 06:08

1. Клиентская часть написана на JS, а серверная на Java.
2. JBoss запускается посредством run.bat Соответственно надо будет поиграться со строкой et JAVA_OPTS=%JAVA_OPTS% -Xms64m -Xmx1024m -Xss2m
3. Профайлер буду искать.
4. 100 пользователей должны работать ОДНОВРЕМЕННО. Буду пробовать разные варианты нагрузок – повышать нагрузку как советуете с 1-го и доводить до 100-150; запускать юзеров одновременно и со смещением (Rump-Up, а также RDM-CDO – спасибо altermath за разъяснения по параметрам загрузки).
5. Tomcat всё-таки установлен, об этом мне сказал другой программист, надо будет покопаться где и что.
6. Ещё толком не разобрался с постановкой, подходами решения этой задачи, как мне подсунули другую, настоящую – тестировать удаленный продакшн-сервер.

OS: Windows Server 2003 Standard Edition
Server: IBM eServer, Intel Pentium D 3.00GHz, RAM 2.0GB
Через Terminal Services Client закачал туда Jmeter, удалённо установил/настроил запуск и пробовал запустить на этом удалённом сервере сценарий с двумя простыми запросами. Когда довёл нагрузку до 100 Users/0 Rump-Up (все юзеры стартовали одновременно) оба процессора загрузились до 90 %. А память на сервере даже не шелохнулась?! :victory: . Загрузку процессоров и памяти наблюдал диспетчером задач удалённо запущенном там же на сервере.
На самом интересном месте углубления-расширения сценария теста всё упёрлось в возможности Jmeter или в мои незнания как с ним работать.

Две проблемы, в которые я упёрся, и, может быть, Вы подскажете, как решить:
Проблема 1. Надо прорваться через страничку регистрации. Для этого в первом же запросе я задал два параметра Username и Password со значениями. Имена параметров нашёл в Page Source логин-страницы.
Проблема в том, что если во втором после логина запросе я пытаюсь проверить значение части текста на открывающейся после логина другой странице, то эта проверка во втором запросе заканчивается ошибкой. Текст проверяю с помощью Response Assertion -> Patterns to Test.
Не уверен, что делаю эту проверку правильно, но надо же мне убедиться, что страница открылась и ожидаемое содержимое не экране.
Как составить последовательность запросов (и вложенных в них проверок), чтобы симитировать работу юзера, начиная с первой страницы логина и заканчивая самой дальней страницей сайта???
Мне подсказали, что чтобы прорваться через логин надо передать Куки из первого запроса во второй. Как это сделать не знаю. Пробовал через Config Element добавть HTTP Cookie Manager, но и с ним не получилось.
Понимаю, что мои попытки проверить нагрузку удалённого сервера такой длинной цепочкой запросов смахивает на функциональное тестирование. Но мне поставлена задача проверить нагрузку сервера именно так – одновременным топтанием толпы юзеров страниц сайта.
Тут еще непонятно, что делать с кнопками и ссылками – как их обрабатывать в JMeter?

Проблема 2: На первой же странице после логина пропадает содержимое HTML-страницы, т.е. сама HTML-страница отображается нормально, а её Page Source урезанный, без единого словечка с отображаемой HTML-страницы и с сообщением в том же Page Source что-то типа "Ваш браузер не может отобразить таблицы". А мне надо проверить содержимое страницы. В IE, FireFox, Opera - всё едино: страница отображается нормально, а проверить её нельзя - В Page Source отсутствуют данные для проверки. На мой вопрос как это может быть тот же програмер, что не признал установленный на сервере Tomcat и автор проверяемого кода, бытро "нашёл" выход из проблемы. Ты, говорит, правой клавишей мыши открой страницу в новом окне – там и появится правильная страница с содержательным Page Source, который можно проверить с помощью Response Assertion. Может я чего не понимаю, но ведь так быть не должно, да и как заставить JMeter нажимать на левую кнопку мыши - глупо как то.

Честно говоря, бодания с JMeter заставляют меня думать о том, чтобы попробовать тестировать нагрузку с помощью TestComplete. Сдерживают два обстоятельства:
- не уверен в достаточности нагрузочных способностей TestComplete. До JMeter несколько дней пробовал триальную версию TestComplete v.6. Но в триал версии есть ограничения по кол-ву запросов/строк, да и обещанный 30 дневный срок он не выдержал: через 5 дней сообщил, что триальность закончилась – похоже на баг, это я раз 30 загрузил его наверное.
- другое обстоятельство – это надежда покорить JMeter. Но, судя по обсуждениям на форуме, у него непреодолимые ограничения: нет возможностей скриптования Теста-Плана и нет возможностей записи действий юзера, как это делает тот же TestComplete или LoadRunner.
  • 0

#20 atermath

atermath

    Новый участник

  • Members
  • Pip
  • 30 сообщений
  • ФИО:Сикорский Андрей Анатольевич
  • Город:Москва

Отправлено 24 октября 2007 - 08:52

OS: Windows Server 2003 Standard Edition
Server: IBM eServer, Intel Pentium D 3.00GHz, RAM 2.0GB
Через Terminal Services Client закачал туда Jmeter, удалённо установил/настроил запуск и пробовал запустить на этом удалённом сервере сценарий с двумя простыми запросами. Когда довёл нагрузку до 100 Users/0 Rump-Up (все юзеры стартовали одновременно) оба процессора загрузились до 90 %. А память на сервере даже не шелохнулась?! :victory: . Загрузку процессоров и памяти наблюдал диспетчером задач удалённо запущенном там же на
сервере.
На самом интересном месте углубления-расширения сценария теста всё упёрлось в возможности Jmeter или в мои незнания как с ним работать.

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

Две проблемы, в которые я упёрся, и, может быть, Вы подскажете, как решить:
Проблема 1.
Проблема 2:


Дорогой мой человек. Прочтите, пожалуйста, мануалы к JMeter: он НЕ кликает по кнопкам и ссылкам, он производит атаку тарфиком, отсылая на сервер сформированные GET или POST запросы. Соответственно, для эмуляции работы вам надо правильно сформировать эти запросы в HTTPSampler. Запись сценариев для JMeter возможна с использованием Http Proxy Server или сторонней программы BadBoy. Эти сценарии надо будет допиливать. Отмечу также, что JMeter не работает с xmlHttpRequest - сердцем AJAXнутых приложений. Для авторизации - да, используется Cookie manager

Рекомендую вынести новые проблемы в отдельный тред или создать форум по JMeter, если есть таковая необходимость.
  • 0
Андрей Сикорский
Тестировщик, математик


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных