开源RPC(gRPC/Thrift)框架性能评测

海量互联网业务系统只能依赖分布式架构来解决,而分布式开发的基石则是RPC;本文主要针对两个开源的RPC框架(gRPC、 Apache Thrift),以及配合GoLang、C++两个开发语言进行性能对比分析。C++、Thrift都是比较成熟的技术,先简单介绍一下GoLang以及gRPC;

 

GoLang

Go语言是由Google开发的一个开源项目,目的之一为了提高开发人员的编程效率。 Go语言语法灵活、简洁、清晰、高效。它对的并发特性可以方便地用于多核处理器 和网络开发,同时灵活新颖的类型系统可以方便地编写模块化的系统。Go集成了C、Python(PHP)、ErLang等语言的优点,主要特点有:

  • 面向过程的改良, 不追求极致面向对象;
  • 强类型、静态编译,几乎没有部署依赖(Java需要JVM,PHP/Python需要解析执行器,与静态编译的C/C++相当);性能优秀,与C/C++、Java同量级;
  • 为分布式而生,优雅高效的并发能力,基于消息的并发和同步;
  • 自动垃圾回收,不用再担心内存泄露;
  • 内置各种高级语言类型,各种互联网协议和类库;

 

gRPC

一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。

gRPC基于HTTP/2标准设计,带来诸如双向流控、头部压缩、单TCP连接上的多复用请求等特性。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

(tomzhou原创,转载请注明,个人博客:http://www.iamadmin.com/ )

 

本次测试对象主要有三个组合:

  • gRPC & GoLang
  • Thrift & GoLang
  • Thrift & C++

通过这三个组合,基本可以对比出gRPC/Thrift, go/c++两者在RPC下的性能;

此外,Thrift & C++还有多种服务器模式,我挑选了TSimpleServer、TNonblockingServer两种进行测试;

 

测试环境

CPU:Intel E5-2640 2.50GHz (8 cores)

内存:16GB

软件: CentOS 6.5,Go 1.4、Gcc 4.4.6,开启tcp reuse, tcp recycle;

 

测试逻辑

【远程加法运算】,参考IDL:

 

MathService.proto

 

syntax = "proto3";

service MathService {

rpc Add (AddRequest) returns (AddReply) {}

}

message AddRequest {

int32 A = 1;

int32 B = 2;

}

message AddReply {

int32 X = 1;

}

 

MathService.thrift

 

service MathService {

i32 Add(1:i32 A, 2:i32 B)

}

 

测试场景

  • client, server都是单进程,长连接,在单次连接内发起1w(5w)次rpc调用,计算耗时;
  • client, server都是单进程,短连接,共发起1w(5w)次连接,每次连接单次RPC调用,计算耗时;
  • 并发4个client进程,每个进程长连接10w rpc,服务端单进程多线程(协程),计算耗时;

 

由于不同语言,耗时统计存在偏差,比如boost.timer在程序里计算出来的耗时明显偏小,所以统一使用linux命令time来计算耗时;

 

测试数据和分析

 

一、 单进程下,长短连接,两个RPC框架和两大语言对比

 


 

 

小结:

 

  • 整体上看,长连接性能优于短连接,性能差距在两倍以上;
  • 对比Go语言的两个RPC框架,Thrift性能明显优于gRPC,性能差距也在两倍以上;
  • 对比Thrift框架下的的两种语言,长连接下Go 与C++的RPC性能基本在同一个量级,在短连接下,Go性能大概是C++的二倍;
  • 对比Thrift&C++下的TSimpleServer与TNonblockingServer,在单进程客户端长连接的场景下,TNonblockingServer因为存在线程管理开销,性能较TSimpleServer差一些;但在短连接时,主要开销在连接建立上,线程池管理开销可忽略;
  • 两套RPC框架,以及两大语言运行都非常稳定,5w次请求耗时约是1w次的5倍;

 

二、 多进程(线程,协程)下,两大RPC框架和两大语言对比


 

 

小结:

  • Go语言本身的并发设计非常优秀,相关RPC框架默认支持协程和非堵塞,通过设置GOMAXPROCS可以非常容易的控制程序占用的CPU核数,编码角度无需关心并发实现;
  • C++有堵塞和非堵塞的选择,同时需要自己实现线程池(Thrift自带),高并发场景下编码需要特别设计;
  • Thrift框架性能比gRPC框架快两倍以上;
  • 堵塞模式下的Thrift&C++组合,只能同时针对单个客户端提供服务,四个客户端依次顺序执行;高并发调用场景下,基本不太可能采用;
  • 高并发场景下,使用Thrift框架,Go/C++性能相当,服务端单核处理能力可达3.2w/s。

总结:

  • Go语言性能强劲,语法上灵活、简单、清晰,易于发布和部署,可大规模应用于业务、运维、测试系统;(自动GC类语言,GC势必会影响业务逻辑执行性能,具体影响待海量业务下进一步验证)
  • gRPC做为Google开源出来的RPC框架,性能上明显低于Thrift; 但设计上更为规范,基于HTTP/2可以较好的网络适应及扩展,协议自带的流控等功能未能进一步测试;

http://blog.csdn.net/jek123456/article/details/53395206

 

 

http://developer.51cto.com/art/201506/480273.htm

 https://www.infoq.com/presentations/spring-grpc

https://www.youtube.com/watch?v=xpmFhTMqWhc

https://github.com/ExampleDriven/spring-boot-grpc-example

https://github.com/LogNet/grpc-spring-boot-starter

 

时间: 2024-09-17 22:43:51

开源RPC(gRPC/Thrift)框架性能评测的相关文章

CYQ.Data 数据框架 性能评测

最近有网友经常关注 CYQ.Data 的性能问题,虽然关注,但没发现谁主动的写过和其它框架的性能评测文章.   个人平常比较忙一些,这么长久以来,一直也没好好的为 CYQ.Data 写一个简单的性能测试.   今天,得为它写了一篇了.   杂七几句: 当很多人问我 CYQ.Data 性能怎样时,我说:比其它ORM的框架性能要好.   当然,我没有给出任何的测试数据来证明,因为我没用过其它框架,所以没法给出数据,所以只能任网友:爱信不信.   说比其它框架要好,当然不是因为卖瓜的赞瓜甜,而是基于以

移动App性能评测与优化

实战 移动App性能评测与优化 TMQ专项测试团队 编著  图书在版编目(CIP)数据 移动App性能评测与优化/ TMQ专项测试团队编著. -北京:机械工业出版社,2016.9 (实战) ISBN 978-7-111-54826-3 I. 移- II. T- III. 移动终端-应用程序–程序测试–研究 IV. TN929.53 中国版本图书馆CIP数据核字(2016)第213174号 本书通过六个专题方向介绍腾讯公司移动互联网事业群在移动应用性能评测优化方面的实战经验,涉及内存.电量.流畅度

PHP框架性能测试报告_php技巧

作为一个PHP开发者,而且是初创企业团队的技术开发者,选择开发框架是个很艰难的事情. 用ThinkPHP的话,招聘一个刚从培训机构出来的开发者就可以上手了,但是性能和后期代码解耦是个让人头疼的事情.不过很多第三方功能不需要自己写,众多大牛已经给铺好路了. 用Laravel的话,传说写起来很爽扩展性也够,但是学习成本有点高,总不能给初级开发者半个月的时间去学习框架吧.而且据说江湖人士透漏,Laravel性能不怎么样,文档也并不是特别丰富. 用Yii的话,语法有点啰嗦,前后端代码分离有点小麻烦,不过

MaxCompute2.0性能评测:更强大、更高效之上的更快速

MaxCompute2.0(原Odps):通过性能评测,MaxCompute2.0离线计算比同类产品Hive2.0 on Tez性能优势快约90%以上:MaxCompute2.0从新一代执行引擎到编译引擎.基于代价的优化器全流程针对性能提升做出了卓越改进.        本次评测侧重于已发布的MaxCompute2.0与离线处理同类竞品及线上稳定版本的性能对比,通过测试我们看到MaxCompute2.0在功能上更强大.使用和发布更新更高效.开放生态的同时针对线上作业占比80%以上的Sql以及其中

网易正式发布 Pomelo 开源游戏服务端框架

10月20日的开源中国 杭州源创会 上,来自网易的 @谢骋超为大家介绍了网易即将开源的基于 Node.js 的游戏服务器框架 Pomelo (柚子),并称该框架将于11月正式开源. 今天这个框架终于正式跟我们大家见面了,采用 MIT 授权协议,非常完善的中英文架构说明和开发手册,文档一直是国内开源项目的软肋,而 Pomelo 一经推出便提供如此全面的文档,这是国内开源项目非常难得的,可见网易在这方面做了非常充分的准备工作. Pomelo 是由网易开发的基于node.js 开发的高性能.分布式游戏

国内主流云服务器性能评测报告

本文讲的是国内主流云服务器性能评测报告[IT168 评论]作为朋友眼中的资深技术人士,这几年来,我用过不少的云服务.云产品.近段时间以来,总有朋友问我,云服务器这样的产品,虽说方便.安全,可是却不知道怎么选择适合自己的,网上相关的评测文章又很少,希望我能帮帮他们.那今天我就来写一写云服务器这个产品的评测. 以我自己的经验和感受,如果要买云服务器的话,还是应该在阿里云.腾讯云.金山云这些主流云服务商的产品中挑选.那么作为云服务器的深度使用者,我接下来就将对阿里云.腾讯云和金山云最新发布的同类产品进

Android App性能评测分析-内存篇

1.内存了解 在Android App的性能优化的各个部分里,内存方面的知识较多且不易理解,内存的问题绝对是最令人头疼的一部分,需要对内存基础知识.内存分配.内存管理机制等非常熟悉,才能排查问题. 1.1 了解进程的地址空间 在32位操作系统中,进程的地址空间为0到4GB,这里主要说明一下Stack和Heap:Stack空间(进栈和出栈): 由操作系统控制,其中主要存储函数地址.函数参数.局部变量等等,所以Stack空间不需要很大,一般为几MB大小. Heap空间: 它的使用由程序员控制,程序员

固态硬盘不同分区格式性能评测

  固态硬盘不同分区格式性能评测 FAT32: 1997年的Windows 95 OSR2第二版系统中首次引入,至今依然很流行,特别是低容量设备上,因为支持实在太过广泛,技术所有的主流操作系统都可以创建.读取.写入FAT32分区. 因为是32位文件系统,FAT32分区的最大容量只有2TB,8KB簇下也不过32TB,单个文件体积更是不能超过4GB,文件名长度也不可以超过255个字符. 另外,FAT32不支持日志.版权管理等高级技术,安全性也很差. NTFS: 全称New Technology Fi

58同城开源轻量级Java Web框架 Argo

58同城开源轻量级Java Web框架 Argo 发表于17小时前| 次阅读| 来源CSDN| 0 条评论| 作者张红月 开源58同城JavaWeb框架 摘要:58同城开源其轻量级Java Web框架--Argo,Argo起源与58同城的内部Web框架wf(Web Framework).目前wf支撑着58同城几乎所 有的Web站点.开发者们对此次开源的反响非常强烈,几乎一天时间就被收藏了90次,fork34个.那么是否会掀起国内的开源热潮呢? 如今,开源已成为业界互联网公司的一种发展趋势,许多公