某天,二狗子写了一个 RPC 框架后,简单测了一下性能,发现超出 grpc 一大截。二狗子一高兴,忍不住找同事吹了一波。结果,同事亲测后对二狗子说框架性能也就这样。二狗子表示不服,跟同事一番唇枪舌剑后才发现,两个人测试方法有点不大一样。先不论测试方法不同在哪里,今天二狗子先来聊聊,对 RPC 框架做性能测试要注意什么。

1.确定要观察指标

一般情况下,必要且重要的指标有:吞吐率(tps)、平均耗时、最大耗时、中位数耗时和 p99 耗时。通常情况下,二狗子不会记录 CPU 和内存的消耗,因为这两者的数值会一直变化,测试时并不好记录。

2. 确定压测对象

衡量一个 RPC 框架的性能需要从两个视角去思考:Client 视角与 Server 视角。只要消息协议、传输协议相同,同一种语言的实现就可以有好多种。在大规模的业务架构中,上游 Client 不见得使用的也是下游的框架,而开发者调用的下游服务也同样如此。

如果 Client 和 Server 部署在同一台机器上,且未绑定核,则测试时两端会互相影响。如果要压测 Server,那么我们应该给 Client 足够多的资源,这样才能把 Server 压到极致。

3.减少外部因素的影响

这个很好理解,如果外部因素影响过大,则无法测试 RPC 性能的优劣。

一般在测试时,会把 Server 和 Client 放在同一台机器上,这样可以减少网络的影响。如果网络影响过大,则主要耗时在网络传输上,无法测试 RPC 性能好坏。这里需要注意上面提到的第二点,部署在同一台机器上的时候需要为进程绑核数。

Server 和 Client 在同一台机器上的情况,Client 请求 Server 是不需要经过网卡转发的,这与实际情况不同,有需要的同学可以分开部署再进行压测一次。但是根据其它框架的压测结果来看,性能表现差距不大。

4.必须要有上下文切换

有一些测试程序非常简单,简单到只是客户端发送了一段“hello world”字符串,服务端直接把字符串原封不动地返回给客户端。这样测试出来的结果是不可信的,因为真实场景不可能这么简单。仔细想想,这样并不是在测试框架的性能,而是在测试你的框架读/写 socket 的速度。

RPC 业务特征是 Handler 逻辑较重,耗时较长,显然是不能串行处理的。因此 RPC 场景,Handler 必须要异步处理,上下文切换、I/O 协作等都是必须考虑的代价。

5.调用链路不应该太简单

一次 RPC 调用往往需要多个微服务协作完成,而下游服务又会有其自身依赖,所以整个调用链路会是一个复杂的网状结构。测试的时候,具体这样做:

1.  我们在 Server 内用 Client 访问下游 Server,这能考察 Server 和 Client 的综合表现

2.  一个 Client 访问多个 Server,这能考察负载均衡是否足够并发,真实场景中很少一个 Client 只访问一个 Server

6.请求必须包含长尾

真实的请求中肯定会有长尾。对于在同一个线程里的请求,如果前面的请求慢了一下,那也只能跟着慢了,所以 1% 的长尾会影响远超 1% 的请求。

模拟长尾请求的方法有很多,最简单的就是在服务器端增加故意引发延迟的代码来模拟长尾请求。比如在服务端随机增加一个延迟等待的时间,在一定概率下增加延迟并使请求变为长尾请求。

7. 包体积不应太大,也不应该太小

如果有需要,可以对大包和小包分开测试。

对于 HTTP 框架来说,数据可以放在 query、path、header、body 等地方,不同位置对解析造成的影响也不一样。

8. 与其它 RPC 相比时,需要保证公平性

需要考虑以下几点:

  1. 序列化方式对齐:对于 RPC 框架来说,计算开销主要都集中在序列化与反序列化中。拿 protobuf 举例,有些框架为了追求性能,使用了 gogo/protobuf,而有些框架为了可维护性选择了官方的 protobuf 库
  2. 对齐连接模型:常规的 RPC 连接模型有短连接、长连接、连接多路复用三种。其中连接多路复用是性能最好的,但这可能并不是框架默认的配置,所以在开始测试前就需要设置好

参考:

RPC 框架性能测试,注意这 8 点就够了的更多相关文章

  1. 微博轻量级RPC框架Motan

    Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用. ...

  2. RPC框架性能基本比较测试

    RPC框架:gRPC.Thrift.Wildfly.Dubbo 原文链接:http://www.open-open.com/lib/view/open1426302068107.html gRPC是G ...

  3. 分布式RPC框架性能大比拼 dubbo、motan、rpcx、gRPC、thrift的性能比较

    Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.不过,略有遗憾的是,据说在淘宝内部,dub ...

  4. 服务化实战之 dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型

    转自: http://blog.csdn.net/liubenlong007/article/details/54692241 概述 前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺 ...

  5. 微服务RPC框架选美

    原文:http://p.primeton.com/articles/59030eeda6f2a40690f03629 1.RPC 框架谁最美? Hello,everybody!说到RPC框架,可能大家 ...

  6. 微博轻量级RPC框架Motan正式开源:支撑千亿调用

    支撑微博千亿调用的轻量级 RPC 框架 Motan 正式开源了,项目地址为https://github.com/weibocom/motan. 微博轻量级RPC框架Motan正式开源 Motan 是微 ...

  7. 基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc

    基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc 二月 8, 2016 1 简介 Navi-pbrpc框架是一个高性能的远程调用RPC框架,使用netty4技术提供非阻塞.异步.全 ...

  8. dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型

    概述 前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺点以及使用场景,最终结合本身项目的实际情况选择了使用dubbox作为rpc基础服务框架.下面就简单介绍一下RPC框架技术选型的过 ...

  9. 转: 微信开源C/C++ RPC框架PhxRPC

    转自: http://mp.weixin.qq.com/s?__biz=MzI4NDMyNTU2Mw==&mid=2247483734&idx=1&sn=da364812eca ...

  10. 【转载】分布式RPC框架性能大比拼

    dubbo.motan.rpcx.gRPC.thrift的性能比较 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 ...

随机推荐

  1. 【MySQL】MySQL中的锁

    全局锁 全局锁是对整个数据库实例加锁,整个库处于只读状态. flush tables with read lock 适用场景 全局锁适用于做全库逻辑备份,但是整个库处于只读状态,在备份期间,所有的更新 ...

  2. 27. 干货系列从零用Rust编写正反向代理,Rust中日志库的应用基础准备

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...

  3. 自定义springboot-starter 动态数据源

    自定义springboot-starter 动态数据源 如果使用的是spring或springboot框架,spring提供了一个实现动态数据源的一个抽象类AbstractRoutingDataSou ...

  4. 痞子衡嵌入式:我当了回华邦电子&恩智浦2023联合技术论坛演讲嘉宾

    「华邦电子(Winbond)」是国际领先的存储器厂商,其串行 NOR Flash 产品在全球市场占有率稳居前列. 11月23日,华邦电子联合「恩智浦(NXP)」在上海搞了场主题为"芯智无限, ...

  5. 【uniapp】【外包杯】图片跳转到页面

    <navigator class="swiper-item":url="'/subpkg/goods_detail/goods_detail'">

  6. vue-test --------ref

    <template> <div ref="contain">{{content}}</div> <button @click=" ...

  7. 开源MES/免费MES/开源mes 生产管理流程

    开源MES/免费MES/开源MES生产流程管理 一.什么是MES生产管理流程 生产管理系统(又称制造执行系统)是一种集成了计划.生产.质量控制.库存管理和材料申请等生产流程的管理系统.工厂生产管理流程 ...

  8. MyBatisPlus配置类-配置分页插件,注册为bean对象

    import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.mybatis.spring.a ...

  9. Kernel Memory 入门系列:Semantic Kernel 插件

    Kernel Memory 入门系列:Semantic Kernel 插件 Kernel Memory 本身提供了完整的RAG能力,这部分能力如果通过Semantic Kernel Memory的话, ...

  10. Python——第二章:字符串操作——大小写转换

    字符串常规操作 字符串的操作一般不会对原字符串产生影响. 一般是返回一个新的字符串 字符串大小写转换 .capitalize() 是字符串方法之一,在 Python 中用于将所有字符串的第一个母转换为 ...