怎样对 RPC 进行有效的性能测试

RPC Benchmark Round 1turbo 的成绩一骑绝尘,实力碾压众 rpc 框架。对此,很多人表示不服气,认为作者既是运动员又是裁判员有失公平。所以我认为有必要解释一下 rpc-benchmark 的公正性,以及为什么 turbo 能够如此强悍。

参考对象

rpc-benchmark 灵感源自 techempower-benchmarks,为了能够评测众多服务器框架,techempower-benchmarks 提供了6个测试用例:

  1. JSON serialization
    This test exercises the framework fundamentals including keep-alive support, request routing, request header parsing, object instantiation, JSON serialization, response header generation, and request count throughput.

  2. Single database query
    This test exercises the framework's object-relational mapper (ORM), random number generator, database driver, and database connection pool.

  3. Multiple database queries
    This test is a variation of Test #2 and also uses the World table. Multiple rows are fetched to more dramatically punish the database driver and connection pool. At the highest queries-per-request tested (20), this test demonstrates all frameworks' convergence toward zero requests-per-second as database activity increases.

  4. Fortunes
    This test exercises the ORM, database connectivity, dynamic-size collections, sorting, server-side templates, XSS countermeasures, and character encoding.

  5. Database updates
    This test is a variation of Test #3 that exercises the ORM's persistence of objects and the database driver's performance at running UPDATE statements or similar. The spirit of this test is to exercise a variable number of read-then-write style database operations.

  6. Plaintext
    This test is an exercise of the request-routing fundamentals only, designed to demonstrate the capacity of high-performance platforms in particular. Requests will be sent using HTTP pipelining. The response payload is still small, meaning good performance is still necessary in order to saturate the gigabit Ethernet of the test environment.

techempower-benchmarks 规则都是公开的,代码都是开放的。任何人觉得xx框架写得不好,配置有问题,都可以来提交自己的 Pull Request 。一句话,不服气的话就来提交代码。

测试用例

不过 techempower-benchmarks 对比的都是服务器框架,并不能用来测试 rpc 的性能,作为学习模仿者,我创建了 rpc-benchmark 这个项目。 rpc-benchmark 提供了4个测试用例:

  1. boolean existUser(String email), 判断某个 email 是否存在
    输入是很短的字符串,输出是 bool 值,这个测试用例用于衡量小 Request 小
    Response 的性能。

  2. boolean createUser(User user), 添加一个 用户
    输入是一个 User 的对象,输出是 bool 值,这个测试用例用于衡量大 Request 小 Response 的性能。

  3. User getUser(long id), 根据 id 获取一个用户
    输入是一个 long 类型的值,输出是 User 对象,这个测试用例用于衡量小 Request 大 Response 的性能。

  4. Page<User> listUser(int pageNo), 获取用户列表
    输入是 int 类型的值,输出是一个包含15个 User 的列表,这个测试用例用于衡量小 Request 超大 Response 的性能。

这4个测试用例构成了一个基本的业务逻辑: 用户注册管理。非常具有代表性,并且没有脱离现实使用场景。有些测试用例可能会注重衡量字符串的传输速度,从4字节 64字节 ... 64k字节 依次测起,这样的测试用例就过于脱离现实,没有太多的实际意义。毕竟作为 rpc 框架,除了传输速度,序列化速度其实也是非常重要的。而仅仅用字符串来测试仅能测试出框架的传输速度,并不能有效衡量序列化的性能,也不能衡量整体的 rpc 性能。

测试工具

因为每个 rpc 框架都有自己的 序列化协议 传输协议,所以 rpc-benchmark 不能像 techempower-benchmarks 一样直接使用 wrk 作为测试工具,只能每个框架都编写测试用的 客户端实现。

客户端实现 使用的工具是JMH,这个工具 Java 开发团队自己也在使用。正确的性能测试在之前并不是一件简单的事情,JMH 的出现让性能测试真正的 标准化 简单化。更多关于 JMH 的介绍可以参考下面的链接。

测试方法

测试的过程是先进行10次预热,然后才开始真正的3次测试(JMH的“每次”执行实际上是执行很多次,更好的翻译其实应该是“每轮”)。刚开始使用的是5次预热,但是后来发现 http 传输协议的 undertow grpc 等框架都比较慢热,需要更多的预热次数。完整的测试要跑起来依然有点费劲,需要配置很多环境。不过如果你只是想研究下某个框架的代码实现的话,完全可以更简单一些。拉下代码来直接导入到 Eclipse/IDEA ,配置好hosts,启动 Server,然后启动相应的 Client 就好了。

为什么把 undertow springboot netty 也作为了测试对象

按照 wiki 的定义,这三个确实不能认为是 rpc ,不过简单封装之后他们都可以作为 rpc 使用。加入这几个更多的是为给 rpc 框架的实现者提供一个参考,作为基础的协议层性能是怎么样的?作为springcloud 的底层实现,springboot 其实代表了springcloud 的性能。undertow 证明了 http+json 并不比 tcp+binary 慢太多,其速度甚至比 dubbo motan 还要快不少。同时也是为了告诉喷子们,并不是说你用了高性能的 netty+protopuff 就能比 turbo 快,turbo 能碾压众框架并不只是靠简单的拼积木就能做到的。

不足之处

仅1个客户端32个线程其实是非常不严谨的,正确的做法应该是从1个线程一直到32k个线程逐步增加,从1台客户端机器到1000台客户端机器逐步增加(客户端数量 线程数量 应该是一个笛卡尔积)。不过每轮测试实在都太耗费时间了,而且阿里云的服务器也不便宜,所以只能作罢。后续如果有云服务器厂商赞助的话,可以考虑把这块给做起来。

turbo为什么如此强悍

篇幅有限写不开了,下篇再说吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 一听到卡农那优美的旋律,就觉得灵魂进入一个安静的世界,柔和而深情,舒缓而神秘,仿佛恋人的眼神。而看多了韩剧,在听到...
    taoyecumt阅读 1,502评论 0 1
  • 我爱上了缪斯 也许你是神 也许不是 确已离不开了 梦里的圣歌 枕边的书香 书架旁吉他的声响 冬日偶尔窗台上的阳光 ...
    凯歌儿阅读 245评论 0 6
  • 今天大组会,通过德平常春和志云的分享,我的收获是: 1.不要只想改变别人,想想你自己为什么不变。我总是想让老公变得...
    杨淑心阅读 249评论 1 4
  • 连梦里你都不属于我,梦里都要扎心,放不下,忘不了,就是这样的痛。
    一禅_578b阅读 75评论 0 0