Swoole 同步模式與協程模式的對比

在現代化 PHP 高級開發中,Swoole 爲 PHP 帶來了更多可能,如:常駐內存、協程,關於傳統的 Apache/FPM 模式與常駐內存模式(同步)的巨大差別,以前我作過測試,你們能直觀的感覺到性能的巨大提高,可是協程到來後,又帶來了多少性能的提高呢?提高的又是哪方面的性能?下面逐步測試一下。php

傳統的 Apache/FPM 模式與常駐內存模式(同步)的測試文章:
MixPHP 併發性能全面對比測試nginx

協程的優點

協程模式與常駐內存模式(同步)/傳統模式相比:git

常駐模式/傳統模式都屬於同步阻塞編程,因爲同一個進程不能並行處理請求,因此爲了提升併發,只能開啓更多的進程,一般超過 100 甚至更多,每一個進程都有基礎的內存消耗,加起來就不少了,並且受限於 Linux 總進程數限制,併發總數沒法突破,加上進程很是多以後,CPU 須要更多的線程切換,浪費了不少性能,固然相比 FPM 的傳統模式每次都需從頭開始,常駐模式仍是要好很是多的,可是協程顯然更加優秀。github

協程模式的執行方式:docker

協程模式中一個進程能夠同時執行 N 個請求,但同一時刻只執行其中的某一個請求,也就是說,當執行到 MySQL/Redis 這些客戶端時,因爲須要等待客戶端響應,常駐模式/傳統模式一般是在傻傻的等待響應,而協程這個時候會掛起當前協程,切換到其餘協程中去處理其餘請求,因此協程能同時處理 N 個請求,每增長一個請求只需增長一些內存消耗,相比增長一個進程的內存消耗,顯然是少太多的,因爲協程能並行處理,因此一般只需配置於 CPU 數量 1~2 倍左右的進程數便可,更少的進程帶來更少的 CPU 線程切換,又減小不少性能損耗。shell

開始測試

MixPHP 是一個基於 Swoole 的FPM、常駐內存、協程三模 PHP 高性能框架,因爲該框架同時具有常駐內存模式、協程模式,因此能很方便的測試結果。apache

測試環境:編程

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/

相關文章
相關標籤/搜索