本篇文章给大家带来的内容是关于swoole同步模式与协程模式之间的对比 (详细) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
在现代化 php 高级开发中,swoole 为 php 带来了更多可能,如:常驻内存、协程,关于传统的 apache/fpm 模式与常驻内存模式(同步)的巨大差异,之前我做过测试,大家能直观的感受到性能的巨大提升,但是协程到来后,又带来了多少性能的提升呢?提升的又是哪方面的性能?下面逐步测试一下。
传统的 apache/fpm 模式与常驻内存模式(同步)的测试文章:
mixphp 并发性能全面对比测试
协程的优势协程模式与常驻内存模式(同步)/传统模式相比:
常驻模式/传统模式都属于同步阻塞编程,由于同一个进程不能并行处理请求,所以为了提高并发,只能开启更多的进程,通常超过 100 甚至更多,每个进程都有基础的内存消耗,加起来就很多了,而且受限于 linux 总进程数限制,并发总数无法突破,加上进程非常多之后,cpu 需要更多的线程切换,浪费了很多性能,当然相比 fpm 的传统模式每次都需从头开始,常驻模式还是要好非常多的,但是协程显然更加优秀。
协程模式的执行方式:
协程模式中一个进程可以同时执行 n 个请求,但同一时刻只执行其中的某一个请求,也就是说,当执行到 mysql/redis 这些客户端时,由于需要等待客户端响应,常驻模式/传统模式通常是在傻傻的等待响应,而协程这个时候会挂起当前协程,切换到其他协程中去处理其他请求,所以协程能同时处理 n 个请求,每增加一个请求只需增加一些内存消耗,相比增加一个进程的内存消耗,显然是少太多的,由于协程能并行处理,所以通常只需配置于 cpu 数量 1~2 倍左右的进程数即可,更少的进程带来更少的 cpu 线程切换,又减少很多性能损耗。
开始测试mixphp 是一个基于 swoole 的fpm、常驻内存、协程三模 php 高性能框架,由于该框架同时具备常驻内存模式、协程模式,所以能很方便的测试结果。
测试环境:
docker 容器,限制只能使用 1 cpu。
其他参数如下:
server name: mix-httpdframework version: 1.1.0-rcphp version: 7.2.9swoole version: 4.1.0listen addr: 127.0.0.1listen port: 9501
代码:
模拟常用的 http 开发需求,执行三个 sql 请求。
// 默认动作public function actionindex(){ pdo::createcommand("select * from `test` where id = 1")->queryone(); pdo::createcommand("select * from `test` where id = 2")->queryone(); return pdo::createcommand("select * from `test` limit 5")->queryall();}
测试结果常驻内存模式(同步):
进程数并发数rps
8 100 838.65
8 300 683.78
8 500 688.56
50 100 770.69
50 300 304.90
50 300 378.95
协程模式:
进程数并发数rps
8 100 834.12
8 300 837.50
8 500 824.14
协程在本次测试中并没有像之前的传统 apache/fpm 模式与常驻内存模式(同步)的测试一样展现出巨大的性能提升,说明:
在少量能快速响应的 sql 请求中,协程的提升并不明显,应该要在响应时间更大时,才能感受到协程优势。
常驻内存模式的进程数配置过多,并发性能反而会降低,该问题同样适用于传统 apache/fpm 模式。
常驻内存模式(同步)详细测试首先 8 个 worker 进程,并发 100 测试,rps 为 838.65。
c:\users\edz>ab -n 10000 -c 100 http://www.a.com/this is apachebench, version 2.3 <$revision: 1757674 $>copyright 1996 adam twiss, zeus technology ltd, http://www.zeustech.net/licensed to the apache software foundation, http://www.apache.org/benchmarking www.a.com (be patient)completed 1000 requestscompleted 2000 requestscompleted 3000 requestscompleted 4000 requestscompleted 5000 requestscompleted 6000 requestscompleted 7000 requestscompleted 8000 requestscompleted 9000 requestscompleted 10000 requestsfinished 10000 requestsserver software: nginx/1.13.9server hostname: www.a.comserver port: 80document path: /document length: 101 bytesconcurrency level: 100time taken for tests: 11.924 secondscomplete requests: 10000failed requests: 0total transferred: 2660000 byteshtml transferred: 1010000 bytesrequests per second: 838.65 [#/sec] (mean)time per request: 119.239 [ms] (mean)time per request: 1.192 [ms] (mean, across all concurrent requests)transfer rate: 217.85 [kbytes/sec] receivedconnection times (ms) min mean[+/-sd] median maxconnect: 0 0 0.2 0 4processing: 20 118 18.3 118 195waiting: 19 118 18.4 118 195total: 20 118 18.4 119 195percentage of the requests served within a certain time (ms) 50% 119 66% 126 75% 130 80% 133 90% 141 95% 147 98% 155 99% 161 100% 195 (longest request)
然后使用 8 个 worker 进程,并发 300 测试,rps 为 683.78。
c:\users\edz>ab -n 10000 -c 300 http://www.a.com/this is apachebench, version 2.3 <$revision: 1757674 $>copyright 1996 adam twiss, zeus technology ltd, http://www.zeustech.net/licensed to the apache software foundation, http://www.apache.org/benchmarking www.a.com (be patient)completed 1000 requestscompleted 2000 requestscompleted 3000 requestscompleted 4000 requestscompleted 5000 requestscompleted 6000 requestscompleted 7000 requestscompleted 8000 requestscompleted 9000 requestscompleted 10000 requestsfinished 10000 requestsserver software: nginx/1.13.9server hostname: www.a.comserver port: 80document path: /document length: 101 bytesconcurrency level: 300time taken for tests: 14.624 secondscomplete requests: 10000failed requests: 0total transferred: 2660000 byteshtml transferred: 1010000 bytesrequests per second: 683.78 [#/sec] (mean)time per request: 438.735 [ms] (mean)time per request: 1.462 [ms] (mean, across all concurrent requests)transfer rate: 177.62 [kbytes/sec] receivedconnection times (ms) min mean[+/-sd] median maxconnect: 0 0 30.0 0 3000processing: 62 432 493.4 354 3457waiting: 54 431 488.1 354 3455total: 62 433 494.1 354 3457percentage of the requests served within a certain time (ms) 50% 354 66% 373 75% 385 80% 392 90% 411 95% 432 98% 3170 99% 3266 100% 3457 (longest request)
然后使用 8 个 worker 进程,并发 500 测试,rps 为 688.56。
c:\users\edz>ab -n 10000 -c 500 http://www.a.com/this is apachebench, version 2.3 <$revision: 1757674 $>copyright 1996 adam twiss, zeus technology ltd, http://www.zeustech.net/licensed to the apache software foundation, http://www.apache.org/benchmarking www.a.com (be patient)completed 1000 requestscompleted 2000 requestscompleted 3000 requestscompleted 4000 requestscompleted 5000 requestscompleted 6000 requestscompleted 7000 requestscompleted 8000 requestscompleted 9000 requestscompleted 10000 requestsfinished 10000 requestsserver software: nginx/1.13.9server hostname: www.a.comserver port: 80document path: /document length: 101 bytesconcurrency level: 500time taken for tests: 14.523 secondscomplete requests: 10000failed requests: 0total transferred: 2660000 byteshtml transferred: 1010000 bytesrequests per second: 688.56 [#/sec] (mean)time per request: 726.150 [ms] (mean)time per request: 1.452 [ms] (mean, across all concurrent requests)transfer rate: 178.87 [kbytes/sec] receivedconnection times (ms) min mean[+/-sd] median maxconnect: 0 0 30.0 0 3000processing: 102 707 618.4 596 3632waiting: 89 703 605.6 595 3629total: 102 707 618.9 596 3633percentage of the requests served within a certain time (ms) 50% 596 66% 620 75% 635 80% 645 90% 679 95% 3125 98% 3401 99% 3495 100% 3633 (longest request)
现在调整为 50 进程,100 并发测试,rps 为 770.69。
进程的增加并没有带来并发量的提升。
c:\users\edz>ab -n 10000 -c 100 http://www.a.com/this is apachebench, version 2.3 <$revision: 1757674 $>copyright 1996 adam twiss, zeus technology ltd, http://www.zeustech.net/licensed to the apache software foundation, http://www.apache.org/benchmarking www.a.com (be patient)completed 1000 requestscompleted 2000 requestscompleted 3000 requestscompleted 4000 requestscompleted 5000 requestscompleted 6000 requestscompleted 7000 requestscompleted 8000 requestscompleted 9000 requestscompleted 10000 requestsfinished 10000 requestsserver software: nginx/1.13.9server hostname: www.a.comserver port: 80document path: /document length: 101 bytesconcurrency level: 100time taken for tests: 12.975 secondscomplete requests: 10000failed requests: 0total transferred: 2660000 byteshtml transferred: 1010000 bytesrequests per second: 770.69 [#/sec] (mean)time per request: 129.754 [ms] (mean)time per request: 1.298 [ms] (mean, across all concurrent requests)transfer rate: 200.20 [kbytes/sec] receivedconnection times (ms) min mean[+/-sd] median maxconnect: 0 1 42.4 0 3000processing: 10 128 499.8 56 7137waiting: 10 127 495.8 55 7137total: 11 129 503.3 56 7137percentage of the requests served within a certain time (ms) 50% 56 66% 72 75% 86 80% 97 90% 133 95% 179 98% 312 99% 3052 100% 7137 (longest request)
50 进程,300 并发测试,rps 为 304.90。
对比 8 个进程时的结果,并发量降低非常明显,看来进程数过多并不能提升性能,反而会降低性能。
c:\users\edz>ab -n 10000 -c 300 http://www.a.com/this is apachebench, version 2.3 <$revision: 1757674 $>copyright 1996 adam twiss, zeus technology ltd, http://www.zeustech.net/licensed to the apache software foundation, http://www.apache.org/benchmarking www.a.com (be patient)completed 1000 requestscompleted 2000 requestscompleted 3000 requestscompleted 4000 requestscompleted 5000 requestscompleted 6000 requestscompleted 7000 requestscompleted 8000 requestscompleted 9000 requestscompleted 10000 requestsfinished 10000 requestsserver software: nginx/1.13.9server hostname: www.a.comserver port: 80document path: /document length: 101 bytesconcurrency level: 300time taken for tests: 32.798 secondscomplete requests: 10000failed requests: 0total transferred: 2660000 byteshtml transferred: 1010000 bytesrequests per second: 304.90 [#/sec] (mean)time per request: 983.942 [ms] (mean)time per request: 3.280 [ms] (mean, across all concurrent requests)transfer rate: 79.20 [kbytes/sec] receivedconnection times (ms) min mean[+/-sd] median maxconnect: 0 3 90.0 0 3001processing: 25 976 1339.8 189 3694waiting: 23 954 1316.5 188 3691total: 25 979 1341.0 189 3694percentage of the requests served within a certain time (ms) 50% 189 66% 289 75% 3094 80% 3113 90% 3184 95% 3249 98% 3315 99% 3375 100% 3694 (longest request)
50 进程,500 并发测试,rps 为 378.95。
c:\users\edz>ab -n 10000 -c 500 http://www.a.com/this is apachebench, version 2.3 <$revision: 1757674 $>copyright 1996 adam twiss, zeus technology ltd, http://www.zeustech.net/licensed to the apache software foundation, http://www.apache.org/benchmarking www.a.com (be patient)completed 1000 requestscompleted 2000 requestscompleted 3000 requestscompleted 4000 requestscompleted 5000 requestscompleted 6000 requestscompleted 7000 requestscompleted 8000 requestscompleted 9000 requestscompleted 10000 requestsfinished 10000 requestsserver software: nginx/1.13.9server hostname: www.a.comserver port: 80document path: /document length: 101 bytesconcurrency level: 500time taken for tests: 26.389 secondscomplete requests: 10000failed requests: 0total transferred: 2660000 byteshtml transferred: 1010000 bytesrequests per second: 378.95 [#/sec] (mean)time per request: 1319.431 [ms] (mean)time per request: 2.639 [ms] (mean, across all concurrent requests)transfer rate: 98.44 [kbytes/sec] receivedconnection times (ms) min mean[+/-sd] median maxconnect: 0 2 79.4 0 3001processing: 64 1306 1434.7 341 3962waiting: 17 1224 1391.4 321 3959total: 65 1308 1435.2 342 3963percentage of the requests served within a certain time (ms) 50% 342 66% 3142 75% 3168 80% 3195 90% 3292 95% 3374 98% 3467 99% 3516 100% 3963 (longest request)
协程模式详细测试首先 8 个 worker 进程,并发 100 测试,rps 为 834.12。
c:\users\edz>ab -n 10000 -c 100 http://www.a.com/this is apachebench, version 2.3 <$revision: 1757674 $>copyright 1996 adam twiss, zeus technology ltd, http://www.zeustech.net/licensed to the apache software foundation, http://www.apache.org/benchmarking www.a.com (be patient)completed 1000 requestscompleted 2000 requestscompleted 3000 requestscompleted 4000 requestscompleted 5000 requestscompleted 6000 requestscompleted 7000 requestscompleted 8000 requestscompleted 9000 requestscompleted 10000 requestsfinished 10000 requestsserver software: nginx/1.13.9server hostname: www.a.comserver port: 80document path: /document length: 101 bytesconcurrency level: 100time taken for tests: 11.989 secondscomplete requests: 10000failed requests: 0total transferred: 2660000 byteshtml transferred: 1010000 bytesrequests per second: 834.12 [#/sec] (mean)time per request: 119.886 [ms] (mean)time per request: 1.199 [ms] (mean, across all concurrent requests)transfer rate: 216.68 [kbytes/sec] receivedconnection times (ms) min mean[+/-sd] median maxconnect: 0 0 0.3 0 4processing: 84 119 9.8 122 165waiting: 84 119 9.8 122 164total: 84 119 9.8 123 165percentage of the requests served within a certain time (ms) 50% 123 66% 124 75% 125 80% 125 90% 126 95% 128 98% 131 99% 137 100% 165 (longest request)
然后使用 8 个 worker 进程,并发 300 测试,rps 为 837.50。
c:\users\edz>ab -n 10000 -c 300 http://www.a.com/this is apachebench, version 2.3 <$revision: 1757674 $>copyright 1996 adam twiss, zeus technology ltd, http://www.zeustech.net/licensed to the apache software foundation, http://www.apache.org/benchmarking www.a.com (be patient)completed 1000 requestscompleted 2000 requestscompleted 3000 requestscompleted 4000 requestscompleted 5000 requestscompleted 6000 requestscompleted 7000 requestscompleted 8000 requestscompleted 9000 requestscompleted 10000 requestsfinished 10000 requestsserver software: nginx/1.13.9server hostname: www.a.comserver port: 80document path: /document length: 101 bytesconcurrency level: 300time taken for tests: 11.940 secondscomplete requests: 10000failed requests: 0total transferred: 2660000 byteshtml transferred: 1010000 bytesrequests per second: 837.50 [#/sec] (mean)time per request: 358.207 [ms] (mean)time per request: 1.194 [ms] (mean, across all concurrent requests)transfer rate: 217.55 [kbytes/sec] receivedconnection times (ms) min mean[+/-sd] median maxconnect: 0 1 42.4 0 3001processing: 86 354 1043.0 161 7172waiting: 86 344 1011.9 160 7172total: 86 355 1044.5 161 7172percentage of the requests served within a certain time (ms) 50% 161 66% 182 75% 199 80% 212 90% 251 95% 302 98% 6103 99% 6135 100% 7172 (longest request)
然后使用 8 个 worker 进程,并发 500 测试,rps 为 824.14。
c:\users\edz>ab -n 10000 -c 500 http://www.a.com/this is apachebench, version 2.3 <$revision: 1757674 $>copyright 1996 adam twiss, zeus technology ltd, http://www.zeustech.net/licensed to the apache software foundation, http://www.apache.org/benchmarking www.a.com (be patient)completed 1000 requestscompleted 2000 requestscompleted 3000 requestscompleted 4000 requestscompleted 5000 requestscompleted 6000 requestscompleted 7000 requestscompleted 8000 requestscompleted 9000 requestscompleted 10000 requestsfinished 10000 requestsserver software: nginx/1.13.9server hostname: www.a.comserver port: 80document path: /document length: 101 bytesconcurrency level: 500time taken for tests: 12.134 secondscomplete requests: 10000failed requests: 0total transferred: 2660000 byteshtml transferred: 1010000 bytesrequests per second: 824.14 [#/sec] (mean)time per request: 606.690 [ms] (mean)time per request: 1.213 [ms] (mean, across all concurrent requests)transfer rate: 214.08 [kbytes/sec] receivedconnection times (ms) min mean[+/-sd] median maxconnect: 0 0 0.3 0 4processing: 92 332 585.3 198 6931waiting: 91 331 585.5 196 6931total: 92 332 585.3 198 6931percentage of the requests served within a certain time (ms) 50% 198 66% 242 75% 284 80% 334 90% 587 95% 932 98% 1216 99% 2390 100% 6931 (longest request)
相关推荐:
php设计模式之调解者模式的深入解析_php教程
php安装模式mod_php和fastcgi的选择与对比
以上就是swoole同步模式与协程模式之间的对比 (详细)的详细内容。