OpenResty高性能壓測

目錄

1.ab工具

2.環境部署及壓測

2.1 Openresty壓測

2.2 NodeJS壓測

2.3 Java壓測

2.4 Python壓測

3.結果分析


OpenResty基於高性能的Nginx,其實現採用了“小衆”的開發語言Lua,社區相對較小,知名度較低。實際上,OpenResty的開發效率和運行效率都超過了競爭對手。下面,以測試案例對比目前較爲流行的Web開發環境:NodeJsJavaPython。本次測試各自實現一個簡單的HTTP服務,不做任何額外的優化調整,直接輸出“Hello World”字符串,壓測工具採用ab,測試機爲CentOS 12G。壓測命令爲:

ab -c 100 -n 10000 http://127.0.0.1:8001/hello

1.ab工具

ab工具的安裝以及性能指標,參考超實用壓力測試工具-ab工具

2.環境部署及壓測

2.1 Openresty壓測

安裝部署OpenResty,參考博文Linux中安裝部署OpenResty應用

壓測結果輸出:

[root@VM_0_26_centos ~]# ab -c 100 -n 10000 http://127.0.0.1:8001/test
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (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:        openresty/1.15.8.2
Server Hostname:        127.0.0.1
Server Port:            8001

Document Path:          /test
Document Length:        12 bytes

Concurrency Level:      100
Time taken for tests:   0.568 seconds  處理完全部請求所花費時間
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1600000 bytes
HTML transferred:       120000 bytes
Requests per second:    17617.85 [#/sec] (mean)  吞吐率
Time per request:       5.676 [ms] (mean)   用戶平均請求等待時間
Time per request:       0.057 [ms] (mean, across all concurrent requests) 服務器平均請求等待時間    吞吐率的倒數
Transfer rate:          2752.79 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.5      1       3
Processing:     2    4   0.9      4      11
Waiting:        0    3   0.7      3       8
Total:          2    6   0.9      5      11
WARNING: The median and mean for the total time are not within a normal deviation
        These results are probably not that reliable.

Percentage of the requests served within a certain time (ms)
  50%      5
  66%      6
  75%      6
  80%      6
  90%      6
  95%      7
  98%      9
  99%     11    99線 11ms
 100%     11 (longest request)

2.2 NodeJS壓測

環境部署參考:https://blog.csdn.net/xzx4959/article/details/103950765

壓測結果輸出:

[root@VM_0_26_centos ~]# ab -c 100 -n 10000 http://127.0.0.1:8888/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (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:        
Server Hostname:        127.0.0.1
Server Port:            8888

Document Path:          /
Document Length:        11 bytes

Concurrency Level:      100
Time taken for tests:   1.835 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1120000 bytes
HTML transferred:       110000 bytes
Requests per second:    5449.86 [#/sec] (mean)
Time per request:       18.349 [ms] (mean)
Time per request:       0.183 [ms] (mean, across all concurrent requests)
Transfer rate:          596.08 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.5      1       3
Processing:     5   17  10.1     12      53
Waiting:        4   14   7.5     11      43
Total:          5   18  10.1     14      53

Percentage of the requests served within a certain time (ms)
  50%     14
  66%     18
  75%     24
  80%     26
  90%     33
  95%     41
  98%     46
  99%     48
 100%     53 (longest request)

2.3 Java壓測

安裝部署Spring Boot壓測環境,參考文檔:Spring Boot之Hello World

壓測結果輸出:

[root@VM_0_26_centos ~]# ab -c 100 -n 10000 http://127.0.0.1:8080/hello
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (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:        
Server Hostname:        127.0.0.1
Server Port:            8080

Document Path:          /hello
Document Length:        11 bytes

Concurrency Level:      100
Time taken for tests:   8.184 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1440000 bytes
HTML transferred:       110000 bytes
Requests per second:    1221.84 [#/sec] (mean)
Time per request:       81.844 [ms] (mean)
Time per request:       0.818 [ms] (mean, across all concurrent requests)
Transfer rate:          171.82 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.5      1       2
Processing:     1   81  58.5     66     603
Waiting:        1   75  49.8     64     585
Total:          1   81  58.4     67     604

Percentage of the requests served within a certain time (ms)
  50%     67
  66%     83
  75%     93
  80%     99
  90%    129
  95%    200
  98%    305
  99%    327
 100%    604 (longest request)

2.4 Python壓測

安裝部署Python壓測環境,參考文檔:Linux上部署Flask Web應用

壓測結果輸出:

[root@VM_0_26_centos ~]# ab -c 100 -n 10000 http://127.0.0.1:5000/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (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:        Werkzeug/0.16.0
Server Hostname:        127.0.0.1
Server Port:            5000

Document Path:          /
Document Length:        11 bytes

Concurrency Level:      100
Time taken for tests:   9.212 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1650000 bytes
HTML transferred:       110000 bytes
Requests per second:    1085.55 [#/sec] (mean)
Time per request:       92.119 [ms] (mean)
Time per request:       0.921 [ms] (mean, across all concurrent requests)
Transfer rate:          174.92 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.2      0       2
Processing:     2   92   6.4     91     112
Waiting:        2   92   6.4     91     112
Total:          4   92   6.3     91     112

Percentage of the requests served within a certain time (ms)
  50%     91
  66%     92
  75%     93
  80%     94
  90%     97
  95%     98
  98%    104
  99%    107
 100%    112 (longest request)

3.結果分析

壓測結果統計如下:

 

OpenResty

NodeJS

Java

Python

消耗時間(s

0.568

1.835

8.184

9.212

吞吐量(#/s

1.762

0.545

0.122

0.109

99線(ms

10

48

327

107

max(ms)

11

53

604

112

用戶平均請求等待時間(ms

5.68

 

18.35

 

81.84

 

92.12

 

從統計結果中可以看出,OpenResty的執行效率明顯高於其他編程語言。

相關概念說明:

  1. 吞吐率(Requests per second)
    概念:服務器併發處理能力的量化描述,單位是reqs/s,指的是某個併發用戶數下單位時間內處理的請求數。某個併發用戶數下單位時間內能處理的最大請求數,稱之爲最大吞吐率。
    計算公式:總請求數 / 處理完成這些請求數所花費的時間,即
    Request per second = Complete requests / Time taken for tests

  2. 併發連接數(The number of concurrent connections)
    概念:某個時刻服務器所接受的請求數目,簡單的講,就是一個會話。

  3. 併發用戶數(The number of concurrent users,Concurrency Level)
    概念:要注意區分這個概念和併發連接數之間的區別,一個用戶可能同時會產生多個會話,也即連接數。

  4. 用戶平均請求等待時間(Time per request)
    計算公式:處理完成所有請求數所花費的時間/ (總請求數 / 併發用戶數),即
    Time per request = Time taken for tests /( Complete requests / Concurrency Level)

  5. 服務器平均請求等待時間(Time per request: across all concurrent requests)
    計算公式:處理完成所有請求數所花費的時間 / 總請求數,即
    Time taken for / testsComplete requests
    可以看到,它是吞吐率的倒數。
    同時,它也=用戶平均請求等待時間/併發用戶數,即
    Time per request / Concurrency Level

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章