Параллелизм при загрузке Spring

#java #spring-boot #concurrency #jetty #apachebench

#java #spring-загрузка #параллелизм #причал #apachebench

Вопрос:

У меня есть приложение spring boot со встроенным jetty, и его конфигурации таковы: jetty's minThread: 50
jetty's maxThread: 500
jetty's maxQueueSize: 25000 (Я изменил очередь по умолчанию на LinkedBlockingQueue ) Я не менял acceptors и selectors (поскольку я не верю в жесткое кодирование значения)

С приведенной выше конфигурацией я получаю результаты теста jmeter ниже:

  1. Одновременных пользователей: 60

сводка = 183571 за 00: 01:54 = 1611,9 / с Среднее значение: 36 Мин: 3 Макс: 1062 Ошибка: 0 (0,00%)

  1. Одновременных пользователей: 75

сводка = 496619 за 00:05:00 = 1654,6 / с Среднее время: 45 мин: 3 Макс: 1169 Ошибка: 0 (0,00%)

Если я увеличу количество одновременных пользователей, я не вижу никаких улучшений. Я хочу увеличить параллелизм. Как этого добиться?


=========================================================================== Обновление 29 марта 2019 года

Я тратил больше усилий на улучшение бизнес-логики. По-прежнему без особых улучшений. Затем я решил разработать один проект hello world spring-boot. т.е.,

spring-boot (1.5.9)

jetty 9.4.15

контроллер rest, у которого есть конечная точка get

приведенный ниже код:

 @GetMapping
public String index() {
    return "Greetings from Spring Boot!";
}
  

Затем я попытался выполнить бенчмарк с помощью apachebench

75 одновременных пользователей:

 ab -t 120 -n 1000000 -c 75 http://10.93.243.87:9000/home/
Server Software:
Server Hostname:        10.93.243.87
Server Port:            9000

Document Path:          /home/
Document Length:        27 bytes

Concurrency Level:      75
Time taken for tests:   37.184 seconds
Complete requests:      1000000
Failed requests:        0
Write errors:           0
Total transferred:      143000000 bytes
HTML transferred:       27000000 bytes
Requests per second:    26893.28 [#/sec] (mean)
Time per request:       2.789 [ms] (mean)
Time per request:       0.037 [ms] (mean, across all concurrent requests)
Transfer rate:          3755.61 [Kbytes/sec] received

Connection Times (ms)
              min  mean[ /-sd] median   max
Connect:        0    1  23.5      0    3006
Processing:     0    2   7.8      1     404
Waiting:        0    2   7.8      1     404
Total:          0    3  24.9      2    3007
  

100 одновременных пользователей:

 ab -t 120 -n 1000000 -c 100 http://10.93.243.87:9000/home/
Server Software:
Server Hostname:        10.93.243.87
Server Port:            9000

Document Path:          /home/
Document Length:        27 bytes

Concurrency Level:      100
Time taken for tests:   36.708 seconds
Complete requests:      1000000
Failed requests:        0
Write errors:           0
Total transferred:      143000000 bytes
HTML transferred:       27000000 bytes
Requests per second:    27241.77 [#/sec] (mean)
Time per request:       3.671 [ms] (mean)
Time per request:       0.037 [ms] (mean, across all concurrent requests)
Transfer rate:          3804.27 [Kbytes/sec] received

Connection Times (ms)
              min  mean[ /-sd] median   max
Connect:        0    2  35.7      1    3007
Processing:     0    2   9.4      1     405
Waiting:        0    2   9.4      1     405
Total:          0    4  37.0      2    3009
  

500 одновременных пользователей:

 ab -t 120 -n 1000000 -c 500 http://10.93.243.87:9000/home/
Server Software:
Server Hostname:        10.93.243.87
Server Port:            9000

Document Path:          /home/
Document Length:        27 bytes

Concurrency Level:      500
Time taken for tests:   36.222 seconds
Complete requests:      1000000
Failed requests:        0
Write errors:           0
Total transferred:      143000000 bytes
HTML transferred:       27000000 bytes
Requests per second:    27607.83 [#/sec] (mean)
Time per request:       18.111 [ms] (mean)
Time per request:       0.036 [ms] (mean, across all concurrent requests)
Transfer rate:          3855.39 [Kbytes/sec] received

Connection Times (ms)
              min  mean[ /-sd] median   max
Connect:        0   14 126.2      1    7015
Processing:     0    4  22.3      1     811
Waiting:        0    3  22.3      1     810
Total:          0   18 129.2      2    7018
  

1000 одновременных пользователей:

 ab -t 120 -n 1000000 -c 1000 http://10.93.243.87:9000/home/
Server Software:
Server Hostname:        10.93.243.87
Server Port:            9000

Document Path:          /home/
Document Length:        27 bytes

Concurrency Level:      1000
Time taken for tests:   36.534 seconds
Complete requests:      1000000
Failed requests:        0
Write errors:           0
Total transferred:      143000000 bytes
HTML transferred:       27000000 bytes
Requests per second:    27372.09 [#/sec] (mean)
Time per request:       36.534 [ms] (mean)
Time per request:       0.037 [ms] (mean, across all concurrent requests)
Transfer rate:          3822.47 [Kbytes/sec] received

Connection Times (ms)
              min  mean[ /-sd] median   max
Connect:        0   30 190.8      1    7015
Processing:     0    6  31.4      2    1613
Waiting:        0    5  31.4      1    1613
Total:          0   36 195.5      2    7018
  

Из приведенного выше тестового запуска я достиг ~ 27 КБ в секунду с 75 пользователями, но, похоже, увеличение числа пользователей также увеличивает задержку. Также мы можем четко отметить, что время подключения увеличивается.

У меня есть требование, чтобы мое приложение поддерживало 40 тысяч одновременных пользователей (предположим, что все используют собственные отдельные браузеры), и запрос должен быть завершен в течение 250 миллисекунд.

Пожалуйста, помогите мне в этом

Комментарии:

1. Что вы подразумеваете под «увеличением параллелизма»? И почему вы ожидаете повышения производительности приложения при использовании большего количества одновременных пользователей? Поскольку у вас есть 500 принимающих потоков, вы, вероятно, не увидите никаких изменений производительности, связанных с jetty, при менее чем 500 одновременных пользователях,

2. минимум 200 одновременных пользователей могут получить доступ к нашему приложению и параллельно использовать веб-службы, а ожидаемое время отклика должно быть меньше 200 мс. Я мог видеть, что одновременно обрабатывается только от ~ 80 до 100 потоков, независимо от количества одновременных пользователей, установленного в jmeter.

3. Может быть, это связано с вашей настройкой jmeter?

4. Я запустил тест с использованием apachebench. а также добавлено четкое примечание. пожалуйста, взгляните и помогите

Ответ №1:

Вы можете попробовать увеличить или уменьшить количество потоков Jetty, но производительность приложения будет зависеть от логики приложения. Если вашим текущим узким местом является запрос к базе данных, вы вряд ли увидите какие-либо улучшения при настройке HTTP layer, особенно при тестировании по локальной сети.

Найдите узкое место в вашем приложении, попытайтесь улучшить его, а затем измерьте еще раз, чтобы убедиться, что оно лучше. Повторяйте эти три шага до достижения желаемой производительности. Не настраивайте производительность вслепую, это пустая трата времени.

Комментарии:

1. Да, теперь все наши запросы указывают на базу данных. Но я чувствую, что db уже хорошо справляется со своими ограничениями. Я имею в виду, что наше приложение способно выполнять операции с 6000 дб в секунду. Итак, мы хотим масштабировать наше приложение так, чтобы оно обрабатывало не менее 3000 запросов в секунду. Но не знаю, как найти правильный путь. Я новичок в этой настройке производительности.

2. Начните с просмотра этого видео , производительность нелегко измерить.

3. Не могли бы вы, пожалуйста, взглянуть на обновленную информацию и справку