扫码订阅《 》或入驻星球,即可阅读文章!

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go学习
  • Go学院

    • Go小课
    • Go小考
    • Go实战
    • 精品课
  • Go宝典

    • 在线宝典
    • B站精选
    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
  • Go下载

    • 视频资源
    • 文档资源
Go求职
  • 求职服务

    • 内推互助
    • 求职助力
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
Go友会
  • 城市
  • 校园
推广返利 🤑
实验区
  • Go周边
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
author-avatar

GOLANG ROADMAP


首页
Go学习
  • Go学院

    • Go小课
    • Go小考
    • Go实战
    • 精品课
  • Go宝典

    • 在线宝典
    • B站精选
    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
  • Go下载

    • 视频资源
    • 文档资源
Go求职
  • 求职服务

    • 内推互助
    • 求职助力
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
Go友会
  • 城市
  • 校园
推广返利 🤑
实验区
  • Go周边
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
  • 宝典简介

    • Go RPC 开发指南
  • Part Ⅰ 开发起步

  • Part Ⅱ 注册中心

  • Part Ⅲ 特性

  • Part Ⅳ 插件

  • Part Ⅴ 其它

    • Benchmark
    • UI管理工具
    • 协议
  • Part Ⅵ 网关

扫码订阅《 》或入驻星球,即可阅读文章!

Benchmark


smallnest

# Benchmark

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

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

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

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

# 测试逻辑

使用protobuf作为编解码器。proto文件位于 benchmark.proto (opens new window):

syntax = "proto2";

package main;

option optimize_for = SPEED;


message BenchmarkMessage {
  required string field1 = 1;
  optional string field9 = 9;
  optional string field18 = 18;
  optional bool field80 = 80 [default=false];
  optional bool field81 = 81 [default=true];
  required int32 field2 = 2;
  required int32 field3 = 3;
  
  ......
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

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

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

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

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

# 测试环境

  • 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
  • 测试逻辑
  • 测试环境
  • 测试结果
  • TPS
  • 延迟: 平均时间
  • 延迟: 中位数时间