以下性能报告的基准版本为 SOFAMosn 0.2.1。在 0.2.1 版本中,我们进行了如下一些优化手段:
- 添加内存复用框架,涵盖 io/protocol/stream/proxy 层级,减少对象分配、内存使用和GC压力
- 针对大量链接场景,新增 Raw Epoll 模式,该模式使用了事件回调机制+IO协程池,规避了海量协程带来的堆栈内存消耗以及调度开销
需要注意的是,由于目前sofarpc和h2的压测工具还没有pxx指标的展示,我们在性能报告中选取的数据都为均值。后续需要我们自行进行相关压测环境工具的建设来完善相关指标(P99,P95...)
本次性能报告在0.1.0性能报告
的基础上,新增了若干场景的覆盖,总体包含以下几部分:
- 单核性能(sidecar场景)
- 7层代理
- Bolt(串联)
- Http/1.1(串联)
- Http/2(串联)
- 多核性能(gateway场景)
- 7层代理
- Bolt(直连)
- Http/1.1(直连)
- Http/2(直连)
- 长连接网关
- Bolt(read/write loop with goroutine / raw epoll)
机器 |
OS |
CPU |
11.166.190.224 |
3.10.0-327.ali2010.rc7.alios7.x86_64 |
Intel(R) Xeon(R) CPU E5-2640 v3 @ 2.60GHz |
11.166.136.110 |
3.10.0-327.ali2010.rc7.alios7.x86_64 |
Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz |
bolt client |
client为压力平台,有5台压力机,共计与client mosn之间会建立500条链接 |
|
http1 client(10.210.168.5) |
ApacheBench/2.3 |
-n 2000000 -c 500 -k |
http2 client(10.210.168.5) |
nghttp.h2load |
-n1000000 -c5 -m100 -t4 |
压测模式 |
部署结构 |
串联 |
client --> mosn(11.166.190.224) --> mosn(11.166.136.110) --> server(11.166.136.110) |
节点 |
PING |
client --> mosn(11.166.190.224) |
1.356ms |
mosn(11.166.190.224) --> mosn(11.166.136.110) |
0.097 ms |
场景 |
QPS |
RT(ms) |
MEM(K) |
CPU(%) |
Bolt |
16000 |
15.8 |
77184 |
98 |
Http/1.1 |
4610 |
67 |
47336 |
90 |
Http/2 |
5219 |
81 |
31244 |
74 |
机器 |
OS |
CPU |
11.166.190.224 |
3.10.0-327.ali2010.rc7.alios7.x86_64 |
Intel(R) Xeon(R) CPU E5-2640 v3 @ 2.60GHz |
11.166.136.110 |
3.10.0-327.ali2010.rc7.alios7.x86_64 |
Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz |
bolt client |
client为压力平台,有5台压力机,共计与client mosn之间会建立500条链接 |
|
http1 client(10.210.168.5) |
ApacheBench/2.3 |
-n 2000000 -c 500 -k |
http2 client(10.210.168.5) |
nghttp.h2load |
-n1000000 -c5 -m100 -t4 |
压测模式 |
部署结构 |
直连 |
client --> mosn(11.166.190.224) --> server(11.166.136.110) |
节点 |
PING |
client --> mosn(11.166.190.224) |
1.356ms |
mosn(11.166.190.224) --> mosn(11.166.136.110) |
0.097 ms |
场景 |
QPS |
RT(ms) |
MEM(K) |
CPU(%) |
Bolt |
45000 |
23.4 |
544732 |
380 |
Http/1.1 |
21584 |
23 |
42768 |
380 |
Http/2 |
8180 |
51.7 |
173180 |
300 |
机器 |
OS |
CPU |
11.166.190.224 |
3.10.0-327.ali2010.rc7.alios7.x86_64 |
Intel(R) Xeon(R) CPU E5-2640 v3 @ 2.60GHz |
11.166.136.110 |
3.10.0-327.ali2010.rc7.alios7.x86_64 |
Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz |
压测模式 |
部署结构 |
直连 |
client --> mosn(11.166.190.224) --> server(11.166.136.110) |
节点 |
PING |
client --> mosn(11.166.190.224) |
1.356ms |
mosn(11.166.190.224) --> mosn(11.166.136.110) |
0.097 ms |
链接数 |
请求内容 |
2台压力机,每台5w链接+500QPS,共计10W链接+1000QPS |
1K req/resp |
场景 |
QPS |
MEM(g) |
CPU(%) |
goroutine |
RWLoop + goroutine |
1000 |
3.3 |
60 |
200028 |
Raw epoll |
1000 |
2.5 |
18 |
28 |
MOSN0.2.1
引入了内存复用框架
,相比0.1.0
,在bolt协议转发
场景性能表现得到了大幅优化。在提升了20%的QPS的同时,还优化了30%的内存占用。
与此同时,我们对HTTP/1.1及HTTP/2的场景也进行了初步的性能测试,目前来看性能表现比较一般。这主要是由于目前HTTP协议族的IO、Stream都由三方库进行处理,与MOSN现有的处理框架整合度较差。我们会在后续迭代进行专项优化,提升MOSN处理HTTP协议族的表现。
此外,针对大量链接场景(例如长连接网关),我们引入了Raw Epoll+协程池的模式来应对协程暴增的问题,从而大幅优化了该场景下的QPS和内存表现。
页面大小 0~10k 平均5k
downstream链接 1000 upstream链接 6
单核压测
版本 |
QPS |
内存 |
0.1.0 |
10500 |
175M |
0.2.1 |
13000 |
122M |