Многопоточный асинхронный HTTP-сервер из документации asio не работает должным образом - PullRequest
0 голосов
/ 09 июня 2019

Я пытаюсь написать свой собственный асинхронный многопоточный сервер, используя boost asio.Сначала я решил изучить официальную документацию и попробовать некоторые примеры из нее.Когда я запустил первый пример, я увидел, что он не использует мои ядра так, как я ожидал, и общее значение «запросов в секунду» было небольшим.

Я пробовал разные приложения для тестирования.

  1. Apache JMeter.Тестовые данные: 10 000 пользователей и 1-секундный период разгона.Результаты:
C:\apache-jmeter-5.1.1\bin>jmeter -n -t "Thread Group.jmx" -l testresults.jtl
Creating summariser <summary>
Created the tree successfully using Thread Group.jmx
Starting the test @ Sun Jun 09 02:43:23 EEST 2019 (1560037403700)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary +   2926 in 00:00:06 =  502.5/s Avg:  1318 Min:     1 Max:  4677 Err:    20 (0.68%) Active: 1778 Started: 2102 Finished: 324
summary +  27074 in 00:00:21 = 1284.1/s Avg:   804 Min:     0 Max:  4607 Err:  3183 (11.76%) Active: 0 Started: 10000 Finished: 10000
summary =  30000 in 00:00:27 = 1114.9/s Avg:   854 Min:     0 Max:  4677 Err:  3203 (10.68%)
Tidying up ...    @ Sun Jun 09 02:43:51 EEST 2019 (1560037431085)
... end of run
Apache Benchmark.Тестовые данные: 10 000 пользователей и 10 000 запросов (1 запрос на пользователя).Результаты:
sudo ab -n 10000 -c 10000 http://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to 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
Completed 10000 requests
Finished 10000 requests


Server Software:
Server Hostname:        localhost
Server Port:            80

Document Path:          /
Document Length:        141 bytes

Concurrency Level:      10000
Time taken for tests:   19.530 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      2050000 bytes
HTML transferred:       1410000 bytes
Requests per second:    512.02 [#/sec] (mean)
Time per request:       19530.384 [ms] (mean)
Time per request:       1.953 [ms] (mean, across all concurrent requests)
Transfer rate:          102.50 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:     1273 11835 4933.3  12964   17732
Processing:   529  965 243.3    972    1387
Waiting:      115  697 331.8    697    1272
Total:       1802 12800 5172.5  13936   19119

Percentage of the requests served within a certain time (ms)
  50%  13936
  66%  16538
  75%  17553
  80%  18045
  90%  18708
  95%  18922
  98%  19008
  99%  19048
 100%  19119 (longest request)
Intel Vtune Усилитель.Я также запустил эти тесты под VTune, чтобы проверить использование ядра.В обоих случаях это дает от 5 до 10 процентов.

Код доступен здесь: https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/example/cpp03/http/server3/

А если вы хотите загрузить весь проект с настроенным CMake - проверьте этот репозиторий: https://github.com/YevheniiM/HttpServerBoostAsio

Итак, я ожидал, что результаты будут составлять около 10-15 тыс. Запросов в секунду, исходя из предыдущего опыта моих коллег.И использование ядра также должно быть больше (у меня есть ноутбук с Core i5, 2 физических ядра, 4 с гиперпоточностью и сервер работал на 4-х потоках).Самое удивительное, что я ничего не изменил - сам код из документации почему-то работает неправильно (или, возможно, мои тесты неверны).

Я был бы очень признателен за любые идеи о том, что я делаю неправильно!

...