某天,二狗子写了一个 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. Electron原生菜单

    .markdown-body { color: rgba(56, 56, 56, 1); font-size: 15px; line-height: 30px; letter-spacing: 2px ...

  2. L2-038 病毒溯源

    #include <bits/stdc++.h> using namespace std; const int N = 10010; vector<int> g[N]; boo ...

  3. AtCoder Beginner Contest 237 G - Range Sort Query

    原题链接 G - Range Sort Query 思路: \(x\)是固定的,所以考虑将排序维护成0 1串,为\(p_i < x\)为\(0\),那么\(p_i \geq x\)为\(1\), ...

  4. 【Spring Boot】【外包杯】学习day01 | 项目目录结构划分以及代码分层

    起因:扒了一个开源的项目,但是啃起来很硬,所以决定开始学习相关的知识. 我们之前的SSM项目,搭建过程较为繁琐: 1)配置 web.xml,加载 spring 和 spring mvc 2)配置数据库 ...

  5. 【LOJ NOI Round#2 Day1 T1】单枪匹马(矩阵乘法)

    题目传送门 操作二要求的东西是一个循环迭代的东西,手推相邻两项找下规律,发现相邻两项的分子分母间含有线性关系,考虑用矩阵乘法求解.对于 \([1,n]\)的询问,从后往前倒推, \(x_{n-1}=a ...

  6. Nim 枚举类型 对性能的影响

    Nim 枚举类型 对性能的影响 继上一篇文章<Nim 概念 Concept 对性能的影响>后,我在想,既然 method 虚方法造成性能的影响很大,那么有没有更快的方法实现,当然是有的,那 ...

  7. 【JMeter】使用nmon进行性能资源监控

    使用nmon进行性能资源监控 目录 使用nmon进行性能资源监控 一.前言 二.nmon的下载安装 1.查看系统信息 2.查看CPU信息 2.下载 3.解压 4.一个小问题 三.在性能测试时使用命令行 ...

  8. [ABC267F] Exactly K Steps

    Problem Statement You are given a tree with $N$ vertices. The vertices are numbered $1, \dots, N$, a ...

  9. 【最佳实践】京东小程序-LBS业务场景的性能提升

    一.前言 1.1 京东LBS门详业务介绍 京东LBS门详目前已经支持了仓网.药急送.天选.小时达POP多种业务,并且具备了多端的能力,一套代码可以在京东app.健康app.微信小程序中运行,一定程度上 ...

  10. 现代 CMake 模块化项目管理指南

    现代 CMake 模块化项目管理指南 参考小彭老师的视频教程整理笔记,学习同时方便快速查阅,视频链接如下 [公开课]现代 CMake 模块化项目管理指南[C/C++] 对应课程 PPT 和源码见 ht ...