MOSN 0.1.0 性能报告

    以下的的性能报告为 MOSN 0.1.0 在做 Bolt 与 HTTP1.x 协议的纯 TCP 转发上与 envoy 的一些性能对比数据,主要表现在 QPS、RTT、失败率/成功率等。

    这里需要强调的是,为了提高 MOSN 的转发性能,在 0.1.0 版本中,我们做了如下的一些优化手段:

    • 在单核转发优化上,在指定 的情况下,我们通过使用 CPU 绑核的形式来提高系统调用的执行效率以及 cache 的 locality affinity
    • 在内存优化上,同样是在单核绑核的情况下,我们通过使用 SLAB-style 的回收机制来提高复用,减少内存 copy
    • 在 IO 优化上,主要是通过读写 buffer 大小以及读写时机和频率等参数的控制上进行调优

    以下为具体的性能测试数据。

    压测采用纯代理模式部署,client 进程通过 MOSN 进程作为转发代理访问server进程。其中,client 进程,MOSN 进程,server 进程分别运行在属于不同网段的机器中。client 直连访问 server 网络延时为 2.5ms 左右。

    客户端

    Bolt 协议(发送 1K 字符串)

    发送 Bolt 协议数据的客户端使用 “蚂蚁集团”内部开发的线上压力机,并部署 sofa rpc client。 通过压力机的性能页面,可反映压测过程中的QPS、成功/失败次数,以及RT等参数。

    HTTP1.1 协议(发送 1K 字符串)

    使用 ApacheBench/2.3, 测试指令:

    Service mesh 运行机器规格

    类别信息
    OS2.6.32-431.17.1.el6.FASTSOCKET
    CPUIntel(R) Xeon(R) CPU E5620 @ 2.40GHz X 16

    Bolt 协议测试结果

    结论

    可以看到,在单核 TCP 转发场景下,MOSN 0.1.0 版本和 Envoy 1.7版本,在满负载情况下的 QPS、RTT、成功数/失败数等性能数据上相差不大,后续版本我们会继续优化。

    HTTP/1.1 测试结果

    由于 HTTP/1.1 的请求响应模型为 PING-PONG,因此 QPS 与并发数会呈现正相关。下面分别进行不同并发数的测试。

    并发20

    指标MOSNEnvoy
    QPS56005600
    RT(mean)3.549ms3.545ms
    RT(P99)4ms4ms
    RT(P98)4ms4ms
    RT(P95)4ms4ms
    MEM24m23m
    CPU40%20%

    并发200

    指标MOSNEnvoy
    QPS2967038800
    RT(mean)5.715ms5.068ms
    RT(P99)16ms7ms
    RT(P98)13ms7ms
    RT(P95)11ms6ms
    MEM96m24m
    CPU100%95%

    并发220

    可以看到,在上层协议为 HTTP/1.X 时,MOSN 的性能和 Envoy 的性能存在一定差距,对于这种现象我们的初步结论为:在 PING-PONG 的发包模型下,MOSN 无法进行 read/write 系统调用合并,相比 SOFARPC 可以合并的场景,syscall 数量大幅上升,因此导致相比 SOFARPC 的场景,HTTP 性能上相比 Envoy 会存在差距。针对这个问题,在 0.2.0 版本中,我们会进行相应的优化。

    Envoy 版本信息

    • version:1.7
    • tag:1ef23d481a4701ad4a414d1ef98036bd2ed322e7

    Envoy TCP 测试配置

    1. static_resources:
    2. listeners:
    3. - address:
    4. socket_address:
    5. address: 0.0.0.0
    6. port_value: 12200
    7. filter_chains:
    8. - filters:
    9. - name: envoy.tcp_proxy
    10. config:
    11. cluster: sofa_server
    12. clusters:
    13. - name: sofa_server
    14. type: static
    15. lb_policy: round_robin
    16. hosts:
    17. - socket_address:
    18. address: 10.210.168.5
    19. port_value: 12222
    20. - socket_address:
    21. address: 10.210.168.5
    22. - socket_address:
    23. address: 10.210.168.5
    24. port_value: 12224
    25. - socket_address:
    26. address: 10.210.168.5
    27. port_value: 12225
    28. admin:
    29. access_log_path: "/dev/null"
    30. address:
    31. socket_address:
    32. port_value: 8001