30% запросов не обрабатываются службой RestFul, развернутой на wildfly8.1.0.Final

Я использую веб-сервер Undertow. Вот моя конфигурация подсистемы подводного плавания:

<subsystem xmlns="urn:jboss:domain:undertow:1.1">
            <buffer-cache name="default"/>
            <server name="default-server">
                <http-listener name="default" socket-binding="http"/>
                <host name="default-host" alias="localhost">
                    <location name="/" handler="welcome-content"/>
                    <filter-ref name="limit-connections"/>
                    <filter-ref name="server-header"/>
                    <filter-ref name="x-powered-by-header"/>
                </host>
            </server>
            <servlet-container name="default">
                <jsp-config/>
            </servlet-container>
            <handlers>
                <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
            </handlers>
            <filters>
                <connection-limit name="limit-connections" max-concurrent-requests="15000" queue-size="1000"/>
                <response-header name="server-header" header-name="Server" header-       value="WildFly/8"/>
                <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
            </filters>
        </subsystem>

Конфигурация подсистемы ввода-вывода (аппаратное обеспечение: 4-ядерный процессор и 16 ГБ ОЗУ):

  <subsystem xmlns="urn:jboss:domain:io:1.1">
            <worker name="default" task-keepalive="300" io-threads="8" task-max-threads="64"/>
            <buffer-pool name="default"/>
        </subsystem>

Мой тест:

  1. Используя Jmeter, сгенерировано 3000 одновременных запросов.
  2. Среди них 25 - 30 % запросов завершаются неудачно, сообщая об отказе в соединении.
  3. Server.log не показывает никаких ошибок.

Любая идея, как добиться 0% отказов для генерируемых запросов.


person Suresh Namala    schedule 26.08.2014    source источник
comment
Можете ли вы показать свой план тестирования JMeter и объяснить, как выполняются 3000 запросов conc?   -  person UBIK LOAD PACK    schedule 26.08.2014
comment
@PMDUBIK-INGENIERIE Я не могу добавить скриншот, так как у меня низкая репутация. Я создал группу потоков и настроил свойства потока, как показано ниже: 1. КОЛИЧЕСТВО ПОТОКОВ: 3000 2. ПЕРИОД НАГРУЗКИ: 1 сек 3. СЧЕТЧИК ЦИКЛОВ: 1   -  person Suresh Namala    schedule 26.08.2014
comment
HTTP-запросы, которые я генерирую, - это POST, а PAYLOAD - Protobuf.   -  person Suresh Namala    schedule 26.08.2014
comment
Мой вопрос о тестовом профиле, можете ли вы показать конфигурацию ThreadGroup? спасибо   -  person UBIK LOAD PACK    schedule 27.08.2014
comment
Создана группа потоков и настроены свойства потока, как показано ниже: 1. КОЛИЧЕСТВО ПОТОКОВ: 3000 2. ПЕРИОД НАГРУЗКИ: 1 с 3. СЧЕТЧИК ЦИКЛОВ: 1   -  person Suresh Namala    schedule 27.08.2014
comment
любой отзыв? если все в порядке, вы должны принять и проголосовать, если нет, дайте более подробную информацию   -  person UBIK LOAD PACK    schedule 02.09.2014


Ответы (2)


Если соединение было отклонено, это означает, что undertow отклонил их, оно не будет зарегистрировано в server.log, возможно, в access.log, но не уверен.

Вы должны попробовать медленно увеличивать JMeter, чтобы увидеть предел, при котором вы начинаете получать ошибки.

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

Исправление будет заключаться в увеличении некоторых значений в подсистеме ввода-вывода:

  • io-потоки = "8"

  • задача-макс-потоки = "64"

person UBIK LOAD PACK    schedule 27.08.2014
comment
Если вы видите мою конфигурацию подсистемы ввода-вывода, упомянутую в вопросе. Я уже использую такой же. Основываясь на тесте undertow, он будет поддерживать 1 миллион одновременных запросов. Но я не вижу, чтобы это происходило, и даже при 3000 одновременных запросов 30% отказываются от соединения. - person Suresh Namala; 02.09.2014
comment
с 1000 запросов он работает нормально и сбой 0%, если я добавлю больше, то я вижу сбои - person Suresh Namala; 02.09.2014
comment
Итак, вы столкнулись с проблемой загрузки, чего можно ожидать от теста. Но вы действительно должны убедиться, что ваш тестовый профиль верен, по моему опыту, это выглядит очень странно. Если ответ в порядке, вы должны принять и проголосовать, спасибо - person UBIK LOAD PACK; 03.09.2014
comment
Я чувствую, что это не проблема с Jmeter, поскольку он может генерировать 3000 потоков. Я понял о конфигурации, которую вы упомянули в ответе, но она мне не помогает, и мне нужно кое-что еще настроить wildfly. Если я не нашел решения для этого, мне нужно избавиться от использования веб-сервера undertow и использовать другой. Спасибо за ваш интерес к пониманию этого вопроса. - person Suresh Namala; 03.09.2014

У меня такая же проблема с Undertow. Около 30% соединений отклоняются, когда я обращаюсь к серверу с помощью java-клиента.

Когда я использую ab.exe (ApacheBench), у меня 0% отказов, даже если я использую 1000 одновременных подключений (кажется, это касается предела в Windows 7).

Странно то, что мне отказывают в соединении только тогда, когда я использую java-клиент, который открывает соединения. Я открываю 800 одновременных соединений с java, и многие из них отклонены. Я пробовал тест даже с тайм-аутом сокета 1000 мс. Вот фрагмент моего java-клиента, который открывает соединения:

    URL url = new URL("http://localhost/testWeb/test2");
    URLConnection testConnection = url.openConnection();
    testConnection.setConnectTimeout(1000);
    testConnection.setReadTimeout(1000);
    InputStream is = testConnection.getInputStream();

Странная вещь, как я уже упоминал, заключается в том, что тесты ab.exe работают нормально:

 c:\work\dotera\servers\apache\bin>ab -n 10000 -c 1000 http://localhost:8080/testWeb/test
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Finished 10000 requests


Server Software:        WildFly/8
Server Hostname:        localhost
Server Port:            8080

Document Path:          /testWeb/test
Document Length:        108 bytes

Concurrency Level:      1000
Time taken for tests:   5.302303 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3620000 bytes
HTML transferred:       1080000 bytes
Requests per second:    1885.97 [#/sec] (mean)
Time per request:       530.230 [ms] (mean)
Time per request:       0.530 [ms] (mean, across all concurrent requests)
Transfer rate:          666.69 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0  12.2      0     998
Processing:    56  478 316.6    320    1319
Waiting:        9  320 327.2    198    1291
Total:         56  479 316.7    320    1319

Percentage of the requests served within a certain time (ms)
  50%    320
  66%    326
  75%    841
  80%    847
  90%    893
  95%   1302
  98%   1310
  99%   1314
 100%   1319 (longest request)

c:\work\dotera\servers\apache\bin>

Я думаю, что это может помочь понять природу проблемы.

Еще одна вещь, которую следует упомянуть, это то, что запуск тех же тестов на клиенте node.js с клиентом java и ab.exe дает 0% сбоев.

==========================================================================

Я сделал еще один тест. Что я изменил, так это поместил nginx перед wildfly, чтобы лучше понимать запросы. Тест java снова выдал «java.net.ConnectException: Отказано в соединении: соединение», и здесь интересно то, что nginx вообще не регистрирует неудачные запросы.

Вот сценарий:

  1. журналы доступа nginx пусты.
  2. Я делаю 1100 запросов из java-потоков, запущенных вместе.
  3. У меня есть 177 запросов от клиента, который выдает "java.net.ConnectException"
  4. В журналах доступа nginx у меня зарегистрировано 923 запроса с HTTP CODE 200 - OK, и у меня нет других зарегистрированных запросов.

Это наводит меня на мысль, что есть проблема с открытием клиентских сокетов с той же машины в java. Может, с Undertow и нет проблем, просто клиент глючит.

Для меня загадкой было то, почему тот же тест, запущенный для nodejs, не потерпел неудачу, но после нескольких запусков он потерпел неудачу на чистом nodejs HelloWorld с «java.net.ConnectException: Отказ в соединении: подключение».

Вывод для меня такой, что есть проблема с клиентом, который работает под java. Нет проблем с Undertow (Wildfly/8.1)

person Borislav Markov    schedule 14.09.2014
comment
Эта информация полезна .. Я постараюсь вернуться к вам .. Спасибо - person Suresh Namala; 22.04.2015