Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> tomcat + jmeter 
:(
    Опции темы
LLIbIcpEP
Дата 23.2.2011, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Доброго времени суток.
Провожу нагрузочное тестирование проекта с помощью JMeter. Сервак под томкат имеет 4 ядра и 14ГБ памяти (частоту не знаю, хостинг - амазон эластик клауд 2). Сервак под джейметр - 2 ядра и 8ГБ памяти (тоже ec2). В server.xml разрешил максимальное количество потоков 1024 и количество одновременных коннектов 15000, разрешил пулл соединений. JAVA_OPTS тоже подтюнинговал. ОС - дебиан ленни, максимальное количество открытых файлов сделал 10240. Тестовый план джейметра немного далековат от имитации реальных действий пользователей, на нормальный план времени нет. В 1500 параллельных потоков выполняется последовательная ротация всех существующих команд моей аппликации. Первая команда - на создание юзера с рандомным UserID, который и используется до конца ротации в этом потоке. В этом и минус тестового плана - создание юзера самая тяжеловесная команда, и частота ее возникновения на продакшне очень мала.
Вообщем, наблюдаю странную картину, сначала джейметр сыпет:
Код

java.net.SocketTimeoutException: Read timed out
    at sun.reflect.GeneratedConstructorAccessor12.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1496)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1490)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1144)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
    at org.apache.jmeter.protocol.http.sampler.HTTPSampler.readResponse(HTTPSampler.java:267)
    at org.apache.jmeter.protocol.http.sampler.HTTPSampler.sample(HTTPSampler.java:516)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:965)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:951)
    at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:348)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:243)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1200)
    at sun.net.www.protocol.http.HttpURLConnection.getHeaderField(HttpURLConnection.java:2301)
    at java.net.URLConnection.getHeaderFieldInt(URLConnection.java:579)
    at java.net.URLConnection.getContentLength(URLConnection.java:474)
    at org.apache.jmeter.protocol.http.sampler.HTTPSampler.readResponse(HTTPSampler.java:237)
    ... 6 more

А потом и вовсе:
Код

java.net.SocketTimeoutException: connect timed out
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:529)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:158)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:233)
    at sun.net.www.http.HttpClient.New(HttpClient.java:306)
    at sun.net.www.http.HttpClient.New(HttpClient.java:323)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:975)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:916)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:841)
    at org.apache.jmeter.protocol.http.sampler.HTTPSampler.sample(HTTPSampler.java:483)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:965)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:951)
    at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:348)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:243)
    at java.lang.Thread.run(Thread.java:662)

Ну тут все понятно, сервак перегружен, сначала джейметр не дожидается ответа на команду, а потом и вовсе не может дождаться TCP-ответа для открытия сокета.
Долгое выполнение команд с условием далекого от правды тестового плана допускается, потому поставил в тестовом плане по три минуты на ожидание соединения и выполнения семпла. И тут начинается самое интересное. Во время перегрузки сервера все как обычно, но ошибки не сыплятся - 3 минуты на ожидание ведь есть. И тут выполняемые потоки заканчивают ротацию, нагрузка на сервере падает до нуля, а вот джейметр говорит что энное количество потоков еще выполняется. iftop говорит обратное. В таком висячем состоянии проходит время, близкое к искомым трем минутам, после чего все эти ошибки дропаются с стэктрейсом №2 выше. Но почему? Если произошел рефьюз соединения, почему не выпал эксепшн сразу? Если рефьюз не произошел, почему коннект не открылся, когда для него появились свободные ресурсы? Эта ситуация портит отчет джейметра, время на ожидание коннекта считается за время выполнения семпла, в итоге средние значения скорости выполнения семплов неоправданно занижены.
Заранее спасибо за ответы.

Это сообщение отредактировал(а) LLIbIcpEP - 23.2.2011, 17:05
PM MAIL   Вверх
COVD
Дата 26.2.2011, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 6
Всего: 43



Цитата

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


А что такое "рефьюз"? 

Пофантазирую.

Когда сокет делает попытку установить соединение с адресом, который существует в сети, но никто по этому адресу не живет (удаленное приложение OFF), то в сокете сработает таймаут на соединение. Нет "рефьюза". 


Если  удаленное приложение ON, но не успевает обрабатывать соединения, то, если есть буфер входящих запросов на соединение,  запрос  с некоторой задержкой будет обработан. Если же буфер переполнен, то запрос просто игнорируется и опять в сокете сработает таймаут на соединение.  Опять нет "рефьюза". 


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

Моя версия: jmeter "выстрелил" N запросов. Часть их была проигнорирована сервером по причине переполнения буфера, и эти сокеты ждали 3 минуты, потом сообщили о неудаче. 

Это сообщение отредактировал(а) COVD - 26.2.2011, 18:09
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java tools & IDE's | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.