Table of Contents
Advantages of coroutines
Start testing
Test results
常驻内存模式(同步)详细测试
协程模式详细测试
Home Backend Development PHP Tutorial Comparison between Swoole synchronization mode and coroutine mode (details)

Comparison between Swoole synchronization mode and coroutine mode (details)

Sep 13, 2018 pm 05:05 PM
php swoole

The content of this article is about the comparison between Swoole synchronization mode and coroutine mode (details). It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.

In modern advanced PHP development, Swoole brings more possibilities to PHP, such as: resident memory, coroutines, and the huge difference between the traditional Apache/FPM mode and the resident memory mode (synchronization) , I have done tests before, and everyone can intuitively feel the huge improvement in performance, but how much performance improvement has been brought after the arrival of the coroutine? What aspects of performance are improved? Let’s test it step by step.

Test articles on traditional Apache/FPM mode and resident memory mode (synchronization):
MixPHP comprehensive comparison test of concurrent performance

Advantages of coroutines

Comparison between coroutine mode and resident memory mode (synchronous)/traditional mode:

Resident mode/traditional mode are both synchronous blocking programming, because the same process Requests cannot be processed in parallel, so in order to improve concurrency, more processes can only be opened, usually more than 100 or more. Each process has a basic memory consumption, which adds up to a lot and is limited. Due to the limit on the total number of processes in Linux, the total number of concurrent processes cannot be exceeded. In addition, after there are too many processes, the CPU needs more thread switching, which wastes a lot of performance. Of course, compared with the traditional mode of FPM, which needs to start from scratch every time, the resident mode is still It's much better, but coroutines are obviously better.

Execution method of coroutine mode:

In coroutine mode, a process can execute N requests at the same time, but only one of them will be executed at the same time. That is to say, when executing to clients such as MySQL/Redis, due to the need to wait for the client's response, the resident mode/traditional mode is usually stupidly waiting for the response, and the coroutine will suspend the current coroutine at this time and switch to Other requests are processed in other coroutines, so the coroutine can handle N requests at the same time. Each additional request only needs to increase some memory consumption. Compared with increasing the memory consumption of a process, it is obviously much less, because the coroutine can Parallel processing, so usually you only need to configure the number of processes that is about 1 to 2 times the number of CPUs. Fewer processes bring less CPU thread switching and reduce a lot of performance losses.

Start testing

MixPHP is a high-performance PHP framework based on Swoole's three-mode FPM, resident memory, and coroutine modes. Since the framework has both resident memory mode and coroutine mode, it can be easily Convenient test results.

Test environment:

docker container, limited to 1 CPU.

Other parameters are as follows:

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
Copy after login

Code:

Simulate common HTTP development requirements and execute three SQL requests.

// 默认动作
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();
}
Copy after login

Test results

Resident memory mode (synchronous):

##8100838.65 8300683.788500688.5650100770.69##5050Coroutine mode:
Number of processesNumber of concurrencyRPS
300304.90
300378.95

#8100 834.128300837.50500
##RPS
##8
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)
Copy after login

然后使用 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)
Copy after login

然后使用 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)
Copy after login

现在调整为 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)
Copy after login

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)
Copy after login

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)
Copy after login

协程模式详细测试

首先 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)
Copy after login

然后使用 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)
Copy after login

然后使用 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)
Copy after login

相关推荐:

PHP设计模式之调解者模式的深入解析_PHP教程

php安装模式mod_php和Fastcgi的选择与对比

The above is the detailed content of Comparison between Swoole synchronization mode and coroutine mode (details). For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

Why does an error occur when installing an extension using PECL in a Docker environment? How to solve it? Why does an error occur when installing an extension using PECL in a Docker environment? How to solve it? Apr 01, 2025 pm 03:06 PM

Causes and solutions for errors when using PECL to install extensions in Docker environment When using Docker environment, we often encounter some headaches...

What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? Apr 03, 2025 am 12:03 AM

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

PHP and Python: Comparing Two Popular Programming Languages PHP and Python: Comparing Two Popular Programming Languages Apr 14, 2025 am 12:13 AM

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

PHP: A Key Language for Web Development PHP: A Key Language for Web Development Apr 13, 2025 am 12:08 AM

PHP is a scripting language widely used on the server side, especially suitable for web development. 1.PHP can embed HTML, process HTTP requests and responses, and supports a variety of databases. 2.PHP is used to generate dynamic web content, process form data, access databases, etc., with strong community support and open source resources. 3. PHP is an interpreted language, and the execution process includes lexical analysis, grammatical analysis, compilation and execution. 4.PHP can be combined with MySQL for advanced applications such as user registration systems. 5. When debugging PHP, you can use functions such as error_reporting() and var_dump(). 6. Optimize PHP code to use caching mechanisms, optimize database queries and use built-in functions. 7

See all articles