• Benchmark
    • 测试逻辑
    • 测试环境
    • 测试结果
      • TPS
      • 延迟: 平均时间
      • 延迟: 中位数时间

    Benchmark

    Benchmark 的测试代码可以在这里找到:rpcx-ecosystem/rpcx-benchmark。

    测试使用相同的测试环境,相同的测试数据,相同的测试参数,分别测试了 grpc, rpcx, dubbo, motan, thrift 和 go-micro rpc框架。

    基于以前的测试结果, dubbo, motan 和 go-micro 的测试结果不乐观,所以它们最新的测试并没有列在这里,你可以运行测试代码来测试它们。

    注意: 这个测试是基于io敏感的场景进行测试的, 也就是会让服务sleep n秒钟, 对于cpu敏感的测试场景并没有实现。
    测试假定网络条件很好, 如果是跨数据中心的服务调用,尤其是中美之间这种跨洋调用,服务的主要耗时并不在服务实现上,而是耗在了网络传输上,
    这不是本测试要测试的场景,并且这个场景已经不太好区分出rpc框架的性能了。

    测试逻辑

    使用protobuf作为编解码器。proto文件位于 benchmark.proto:

    1. syntax = "proto2";
    2. package main;
    3. option optimize_for = SPEED;
    4. message BenchmarkMessage {
    5. required string field1 = 1;
    6. optional string field9 = 9;
    7. optional string field18 = 18;
    8. optional bool field80 = 80 [default=false];
    9. optional bool field81 = 81 [default=true];
    10. required int32 field2 = 2;
    11. required int32 field3 = 3;
    12. ......
    13. }

    Client 会创建一个 request ,并且对相应的字段进行赋值,最终的request序列化后的大小为 518 字节。

    Server 接收这个请求,并且将第一个字段的值设置为OK,第二个字段设置为100,然后把这个对象返回给Client。

    测试工具中下面两个参数用来控制并发数和总的请求数。

    1. var concurrency = flag.Int("c", 1, "concurrency")
    2. var total = flag.Int("n", 1, "total requests for all clients")

    测试环境

    • CPU: Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz, 32 cores
    • Memory: 32G
    • Go: 1.9.2
    • OS: CentOS 7 / 3.10.0-229.el7.x86_64

    Client 和 Server 安装在同一台机器上 (忽略网络传输的影响)

    测试结果

    TPS

    5000 并发client的情况下, rpcx 可以达到 176,894 transations/second 吞吐率, 但是 grpc-go 只能达到 105,219 transations/second 的吞吐率

    concurrency RPCX GRPC-GO
    5000 176894 105219
    2000 161660 108245
    1000 148227 111351
    100 145479 93447

    延迟: 平均时间

    concurrency RPCX GRPC-GO
    5000 27 47
    2000 12 18
    1000 6 8
    100 0 1

    延迟: 中位数时间

    concurrency RPCX GRPC-GO
    5000 3 42
    2000 7 15
    1000 5 7
    100 0 0