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-httpd Framework Version: 1.1.0-RC PHP Version: 7.2.9 Swoole Version: 4.1.0 Listen Addr: 127.0.0.1 Listen 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 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: nginx/1.13.9
Server Hostname: www.a.com
Server Port: 80
Document Path: /
Document Length: 101 bytes
Concurrency Level: 100
Time taken for tests: 11.924 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 2660000 bytes
HTML transferred: 1010000 bytes
Requests 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] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.2 0 4
Processing: 20 118 18.3 118 195
Waiting: 19 118 18.4 118 195
Total: 20 118 18.4 119 195
Percentage 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 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: nginx/1.13.9
Server Hostname: www.a.com
Server Port: 80
Document Path: /
Document Length: 101 bytes
Concurrency Level: 300
Time taken for tests: 14.624 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 2660000 bytes
HTML transferred: 1010000 bytes
Requests 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] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 30.0 0 3000
Processing: 62 432 493.4 354 3457
Waiting: 54 431 488.1 354 3455
Total: 62 433 494.1 354 3457
Percentage 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 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: nginx/1.13.9
Server Hostname: www.a.com
Server Port: 80
Document Path: /
Document Length: 101 bytes
Concurrency Level: 500
Time taken for tests: 14.523 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 2660000 bytes
HTML transferred: 1010000 bytes
Requests 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] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 30.0 0 3000
Processing: 102 707 618.4 596 3632
Waiting: 89 703 605.6 595 3629
Total: 102 707 618.9 596 3633
Percentage 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 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: nginx/1.13.9
Server Hostname: www.a.com
Server Port: 80
Document Path: /
Document Length: 101 bytes
Concurrency Level: 100
Time taken for tests: 12.975 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 2660000 bytes
HTML transferred: 1010000 bytes
Requests 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] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 42.4 0 3000
Processing: 10 128 499.8 56 7137
Waiting: 10 127 495.8 55 7137
Total: 11 129 503.3 56 7137
Percentage 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 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: nginx/1.13.9
Server Hostname: www.a.com
Server Port: 80
Document Path: /
Document Length: 101 bytes
Concurrency Level: 300
Time taken for tests: 32.798 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 2660000 bytes
HTML transferred: 1010000 bytes
Requests 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] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 3 90.0 0 3001
Processing: 25 976 1339.8 189 3694
Waiting: 23 954 1316.5 188 3691
Total: 25 979 1341.0 189 3694
Percentage 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 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: nginx/1.13.9
Server Hostname: www.a.com
Server Port: 80
Document Path: /
Document Length: 101 bytes
Concurrency Level: 500
Time taken for tests: 26.389 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 2660000 bytes
HTML transferred: 1010000 bytes
Requests 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] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 79.4 0 3001
Processing: 64 1306 1434.7 341 3962
Waiting: 17 1224 1391.4 321 3959
Total: 65 1308 1435.2 342 3963
Percentage 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 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: nginx/1.13.9
Server Hostname: www.a.com
Server Port: 80
Document Path: /
Document Length: 101 bytes
Concurrency Level: 100
Time taken for tests: 11.989 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 2660000 bytes
HTML transferred: 1010000 bytes
Requests 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] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 4
Processing: 84 119 9.8 122 165
Waiting: 84 119 9.8 122 164
Total: 84 119 9.8 123 165
Percentage 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 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: nginx/1.13.9
Server Hostname: www.a.com
Server Port: 80
Document Path: /
Document Length: 101 bytes
Concurrency Level: 300
Time taken for tests: 11.940 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 2660000 bytes
HTML transferred: 1010000 bytes
Requests 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] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 42.4 0 3001
Processing: 86 354 1043.0 161 7172
Waiting: 86 344 1011.9 160 7172
Total: 86 355 1044.5 161 7172
Percentage 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 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: nginx/1.13.9
Server Hostname: www.a.com
Server Port: 80
Document Path: /
Document Length: 101 bytes
Concurrency Level: 500
Time taken for tests: 12.134 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 2660000 bytes
HTML transferred: 1010000 bytes
Requests 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] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 4
Processing: 92 332 585.3 198 6931
Waiting: 91 331 585.5 196 6931
Total: 92 332 585.3 198 6931
Percentage 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)
MixPHP
GitHub: https://github.com/mixstart/m...
官網:http://www.mixphp.cn/