一瞥之见

0%

Python(django & aiohttp) vs Go(Echo) web server压测性能对比

对于一个真实工程稍做简化后分别使用Python(django & aiohttp) & Go(Echo)实现了一版进行压测

背景说明

  • web后端server场景:全局initial时访问了一次数据库user表、形成本地内存的name-map-passwd的dict/map。对于进来的每个请求,检测了必须的参数是否齐全、而后从name-map-passwd检测是否有权限。最后json序列化后lpush到redis(均没有限制redis pool的max size)。
  • python3.7, aiohttp v3.5.4,nginx, 5worker uvloop gunicorn based on .sock file
  • python3.7, django v3.0.2,nginx,uwsgi,5worker based on .sock file
  • go1.13.6,Echo v4.0.0,nginx,5worker based on http port
  • 压测机器为8核16G内存,被压测机器4核16G内存
  • 压测工具使用同事开发的ysab
    • 重要参数说明; -n:Number of multiple requests to make at a time; -r:round;

结果展示

Echo(Go)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ ysab -n 900 -r 100 -u 'http://host:port/sendMsgAll/?userkey=xxx&type=xxx&content=dfhajklshfjkld&tolist=156526xxxxx&username=pd'

Summary:
Complete requests: 90000
Failed requests: 0
Time taken (s): 10.66654527
Total data size (Byte): 10530000
Data size/request (Byte): 117
Max use time (ms): 1276
Min use time (ms): 6
Average use time (ms): 103.338
Requests/sec: 8437.596027753041
SuccessRequests/sec: 8437.596027753041

Percentage of waiting time (ms):
10.00%: 34
25.00%: 54
50.00%: 86
75.00%: 131
90.00%: 180
95.00%: 221
99.00%: 335
99.90%: 1098
99.99%: 1274


Time detail (ms)
item min mean max
dns 0 0 0
conn 0 0.154 40
wait 6 103.029 1276
resp 0 0.035 22

Response Time histogram (code: requests):
200: 90000

Aiohttp(Python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$ ysab -n 900 -r 100 -u 'http://host:port/sendMsgAll/?userkey=xxx&type=xxx&content=dfhajklshfjkld&tolist=156526xxxxx&username=pd'

Summary:
Complete requests: 90000
Failed requests: 1304
Time taken (s): 35.491095644
Total data size (Byte): 11401288
Data size/request (Byte): 126
Max use time (ms): 1368
Min use time (ms): 1
Average use time (ms): 353.329
Requests/sec: 2535.8473264043932
SuccessRequests/sec: 2499.105716252934

Percentage of waiting time (ms):
10.00%: 172
25.00%: 243
50.00%: 324
75.00%: 437
90.00%: 578
95.00%: 679
99.00%: 885
99.90%: 1117
99.99%: 1368


Time detail (ms)
item min mean max
dns 0 0 0
conn 0 0.182 58
wait 1 352.967 1368
resp 0 0.002 12

Response Time histogram (code: requests):
200: 88696
502: 1304
Django(Python)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$ ysab -n 900 -r 100 -u 'http://host:port/sendMsgAll/?userkey=xxx&type=xxx&content=dfhajklshfjkld&tolist=156526xxxxx&username=pd'

Summary:
Complete requests: 90000
Failed requests: 86630
Time taken (s): 3.070857802
Total data size (Byte): 15411610
Data size/request (Byte): 171
Max use time (ms): 327
Min use time (ms): 0
Average use time (ms): 17.152
Requests/sec: 29307.771900536867
SuccessRequests/sec: 1097.4132367201025

Percentage of waiting time (ms):
10.00%: 1
25.00%: 2
50.00%: 14
75.00%: 20
90.00%: 31
95.00%: 45
99.00%: 126
99.90%: 279
99.99%: 322


Time detail (ms)
item min mean max
dns 0 0 0
conn 0 0.191 88
wait 0 7.667 160
resp 0 0.295 197

Response Time histogram (code: requests):
200: 3370
502: 86630

可见,同步django根本不能够承受到-n为900的情况,经过测试,其只能达到-n参数为100的程度,数据如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Summary:
Complete requests: 10000
Failed requests: 0
Time taken (s): 6.128261992
Total data size (Byte): 1260000
Data size/request (Byte): 126
Max use time (ms): 91
Min use time (ms): 5
Average use time (ms): 60.374
Requests/sec: 1631.7840218081851
SuccessRequests/sec: 1631.7840218081851

Percentage of waiting time (ms):
10.00%: 57
25.00%: 58
50.00%: 60
75.00%: 62
90.00%: 64
95.00%: 66
99.00%: 81
99.90%: 89
99.99%: 90


Time detail (ms)
item min mean max
dns 0 0 0
conn 0 0.009 6
wait 3 60.277 91
resp 0 0.003 10

Response Time histogram (code: requests):
200: 10000

总结

  • 在稍微需要考虑并发的情况下,不要使用同步模式下的Django。
  • aiohttp,由于已出现1.4%的fail,故认为其已达极限,结合我做的别的压测,其能承受qps应该在2.2k左右。
  • Go,在qps达8.4k的情况下,未出现失败请求,且总体请求时间仅为aiohttp的28.6%,可见其真实性能应该高于此。