• 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:UsersEDZ>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:UsersEDZ>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:UsersEDZ>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:UsersEDZ>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:UsersEDZ>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:UsersEDZ>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:UsersEDZ>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:UsersEDZ>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:UsersEDZ>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/

    原文地址:https://segmentfault.com/a/1190000016383096

  • 相关阅读:
    总结一些css加载动画
    写日历的一些总结(三)
    写日历的一些总结(二)
    写日历的一些总结
    兼容性问题总结(转)
    关于npm(转)
    关于NaN
    面向对象与原型
    git命令
    python django 数据库树形菜单的设计
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9971401.html
Copyright © 2020-2023  润新知