Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Во всех остальных случаях ивентлуп на одном ядре должен быть быстрее N потоков на одном ядре.
$ ab -n 20000 -c 100 http://10.0.3.16:8888/
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 10.0.3.16 (be patient)
Completed 2000 requests
Completed 4000 requests
Completed 6000 requests
Completed 8000 requests
Completed 10000 requests
Completed 12000 requests
Completed 14000 requests
Completed 16000 requests
Completed 18000 requests
Completed 20000 requests
Finished 20000 requests
Server Software:
Server Hostname: 10.0.3.16
Server Port: 8888
Document Path: /
Document Length: 11 bytes
Concurrency Level: 100
Time taken for tests: 3.363 seconds
Complete requests: 20000
Failed requests: 0
Total transferred: 1100000 bytes
HTML transferred: 220000 bytes
Requests per second: 5946.81 [#/sec] (mean)
Time per request: 16.816 [ms] (mean)
Time per request: 0.168 [ms] (mean, across all concurrent requests)
Transfer rate: 319.41 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.2 0 3
Processing: 8 17 0.8 17 19
Waiting: 7 16 0.8 16 19
Total: 8 17 0.6 17 19
Percentage of the requests served within a certain time (ms)
50% 17
66% 17
75% 17
80% 17
90% 17
95% 18
98% 18
99% 19
100% 19 (longest request)
$ ab -n 20000 -c 100 http://10.0.3.16:8888/
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 10.0.3.16 (be patient)
Completed 2000 requests
Completed 4000 requests
Completed 6000 requests
Completed 8000 requests
Completed 10000 requests
Completed 12000 requests
Completed 14000 requests
Completed 16000 requests
Completed 18000 requests
Completed 20000 requests
Finished 20000 requests
Server Software: TornadoServer/3.2.2
Server Hostname: 10.0.3.16
Server Port: 8888
Document Path: /
Document Length: 12 bytes
Concurrency Level: 100
Time taken for tests: 7.976 seconds
Complete requests: 20000
Failed requests: 0
Total transferred: 4140000 bytes
HTML transferred: 240000 bytes
Requests per second: 2507.39 [#/sec] (mean)
Time per request: 39.882 [ms] (mean)
Time per request: 0.399 [ms] (mean, across all concurrent requests)
Transfer rate: 506.86 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.4 0 8
Processing: 3 40 2.6 39 52
Waiting: 3 40 2.6 39 52
Total: 8 40 2.5 39 52
Percentage of the requests served within a certain time (ms)
50% 39
66% 39
75% 40
80% 40
90% 42
95% 46
98% 48
99% 50
100% 52 (longest request)
Ну так а вы не думали что в случае с tornado как весь этот лишний код (диспетчер, парсер) как раз и съедает весь проц?Я про этот «оверхед» выше и написал в отличие от многопоточных фреймворков:
… у них нет оверхеда на «евент-луп» и обработку асинхронного кода,
Оверхед на использование ивент-лупа перестаёт быть значительным уже при двух активных сокетах. Оверхед проявляет сильно только при одном сокете. Во всех остальных случаях ивентлуп на одном ядре должен быть быстрее N потоков на одном ядре.
Чтобы сранивать производительность blocking / non-blockingРечь не про blocking/non-blocking сокеты, а про асинхронный и многопоточный код (хоть эти понятия и «ходят рядом»). Не блокирующие сокеты могут и в многопоточном использоваться, например в том же uwsgi вполне возможно используются не блокирующие сокеты до передачи данных в поток, или библиотеки которые работают с пачкой сокетов (например zmq poller).
Я про этот «оверхед» выше и написал в отличие от многопоточных фреймворков:
Я в своём предложении написал про диспетчер и парсер, они есть как в синхронном/блокирующем коде, так и в асинхронном.Ок, вот пример с bottlepy — 4356 rps против 2500 rps у торнадо, вариант с WebOb выдает 5000 rps.
Вы же, сравниваете два разных фреймворкаВсе правильно, сравнить надо вещи которые отличаются.
судите о производительности синхронности/асинхронности по производительности разных фреймворков и это не правильно.Нет, я просто показал что приложение на асинхронном фреймворке не всегда быстрее, «все зависит от задачи».
Сравнивать blocking/non-blocking и sync/async надо в рамках одной абстракции, одного фреймворка и одного api.Приведите свои примеры/тесты.


Немного тестов производительности сетевых фреймворков