Dubbo性能优化_dubbo接口发送1m数据需要多久-程序员宅基地

https://my.oschina.net/u/1378920/blog/739399


Dubbo性能优化

背景

dubbo作为一款分布式服务框架,除了提供远程调用的细节封装,还提供了基本的服务治理功能,能够粗略地监控系统性能。

dubbo原理图

上图展示的是dubbo执行流程的原理图,在客户端和服务端都有一个程序去统计调用信息,其中有价值的信息有延迟时间、并发数、调用次数等,完成记录之后,客户端和服务端分别会定时发送到监控平台,监控平台汇总之后,算出平均qps(每秒调用次数)和平均rt(每次调用延时)等数据并展现在监控平台页面上

最近公司用上了dubbo作为dsp引擎和算法平台之间的一个分布式服务框架,目的是解开引擎和算法之间的强耦合。

  • 消费者--客户端--dsp引擎
  • 提供者--服务端--算法平台

现象

根据dubbo监控平台观察到的现象(红线为客户端数据,蓝线为服务端数据)

  • 线上QPS

线上qps

  • 线上RT

线上rt

问题描述

根据dubbo监控平台现象得知,qps较低时,客户端rt并不高,但是qps较大时,客户端rt非常高,并且持续稳定在10ms左右。这对于性能要求很高的广告引擎是无法容忍的。

线上环境

14台客户端,5台服务端,配置信息:24核cpu+64g内存+1000MB/s带宽

优化过程

延迟较高,就得先查看资源使用有没有出现瓶颈的地方。根据监控信息显示,服务端延迟基本为0,客户端延迟很高。所以很有可能是客户端出现了瓶颈,所以重点先放到客户端这一边,先确定一台客户端的机器(10.100.51.175)来分析问题。

  • 整体环境

    由于目前rpc调用中使用到的资源主要有cpu、内存、网络,由于不存在磁盘I/O,所以排除掉这个资源的影响。

    • CPU:

    性能有问题,首先派上用场的工具就是top。top可以粗略检测cpu使用情况。

    top图片

    由此可见总cpu使用率并不高。接着用vmstat查看cpu上等待和正在运行的任务

    vmstat图片

    看到等待的任务并不多,不过这里可以看到cs上下文切换较高,有可能是线程较多导致很多竞争。这个可能会影响到性能,先记录下来。

    上面提到的都是对cpu整体排查的方式,接着也不要漏过对每个cpu进行排查的方式。使用mpstat检查每一个cpu

    mpstat图片

    看到没有一个cpu处于繁忙状态

    • 内存:

    根据上述top工具截图,可以发现64g内存绝大部分都被分配给了应用程序,但是通过进程信息区可以查看到每个进行对内存使用率并不高。

    根据上述vmstat工具截图,可以观察到si(换入的内存)和so(换出的内存)都是0,所以系统不会因为内存换页而产生性能问题。

    • 网络:

    先使用ethtool来检测一下网卡eth0的带宽

    eth0带宽图片

    发现确实是千兆网卡。那么在千兆网卡上面,我们程序的利用率能达到多少呢?可以使用一个叫nicstat的工具来统计利用率

    线上网络利用率

    从上图可以发现,我们的网络利用率很低(%Util),也没有出现丢包(Drops)的情况,说明我们数据传输速度较慢,这个可能是问题所在,暂时先记录下来。

  • 程序环境

    从整体上只能大概有个方向,具体排查还得从程序本身着手。这时就得根据线上环境,模拟一个测试平台,在测试平台来定位问题所在,分析程序到底哪里慢。

    我在10.100.52.164上搭建了测试环境的服务端,和引擎团队在10.100.51.151上搭建的客户端端进行打通,完成对线上环境的模拟。环境搭建好了,接着我使用tcpcopy将线上机器的流量引入到了我的测试环境。流量打通之后,查看监控平台,发现随着流量的扩大,问题马上暴露了出来:目前qps在1w的情况下,客户端rt达到了17ms左右。

    测试环境与线上环境的现象基本一致:qps较大的情况下,客户端rt变得非常高,服务端rt几乎为0。所以瓶颈应该在客户端。接着,我们可以利用火焰图来分析测试环境下客户端哪个步骤比较慢

    测试环境火焰图

    根据火焰图可以定位到统计调用时间的代码处,MonitorFilter类的invoke方法。既然是从这里统计到延迟较高,那么问题肯定出现在invoke调用链里面的某个方法。根据火焰图继续往上分析调用栈,看到左边的DefaultFuture的get方法和右边OneToOneEncoder的doEncode方法各占了很大一部分比例。那么这两个方法到底是干什么的呢?

    • DefaultFuture.get:客户端同步等待服务端响应。由于dubbo协议采用的是netty异步写,然后同步等待服务端响应的一种模式。所以这里相当于客户端等着服务端完成本地调用之后将执行结果返回回来的一个过程。

    • OneToOneEncoder.doEncode:客户端编码。这个步骤主要也就是对参数、方法名、接口名等信息的序列化操作。

    使用btrace分别测出两个方法的执行时间的分布图

    • DefaultFuture.get方法执行时间

    get方法执行时间

    时间大部分集中在16ms,在客户端17ms的延迟表现中占了绝大部分

    • OneToOneEncoder.doEncode方法执行时间

    doEncode方法执行时间

    时间大部分集中在0ms

    发现doEncode虽然对cpu利用的较多,但是不怎么消耗时间。真正消耗时间的是get方法。可以通过一张图来了解get操作等待的时候,后台到底做了哪些操作。

    所以程序很有可能是卡在网络读写上面。

  • 猜测

    文章前部分有一张使用nicstat抓取的网络读写状态,发现网络利用率很低,也就是网络读写速度都很慢。但是使用ping网络发现网络速度并不慢,但是为什么在程序中,qps较大时,网络读写速度就会很慢?

    如果是网络堵塞而导致速度很慢。那么也就是客户端的发送窗口和服务端接口窗口设置的太小,或者客户端TCP发送缓存和服务端TCP接收缓存太小,当客户端发起大量数据请求时,服务端无法及时处理这些数据,那么服务端就会选择性的丢掉一部分包。但是根据上图nicstat截图发现,几乎没有产生丢包现象,而且我自己也尝试过调大这些参数,发现还是没有什么作用。所以这种可能性可以排除。

    翻阅《TCP/IP详解(协议)》之后,查得还有一种可能性会导致网络速度很慢,就是TCP的拥塞控制。为了减少丢包而引发的性能损失,它会先预估线路中的拥挤情况,然后来控制客户端发送的流量。这很可能就是导致网路速度提不起来的一个关键因素。而且,目前使用dubbo协议的默认单一长连接模式,也就是只有一个网络读写通道。当这个通道某个方向的网络传输量大了之后,就容易引起堵塞,TCP协议为了不产生堵塞而丢包,就进而控制了客户端的数据传送速度。

  • 处理

    既然是一条线路的传输量太大而导致被"限速",那么可以试试开辟多条线路。也就是将原来客户端-服务端单一长连接模式改成客户端-服务端多长连接模式

结果

在测试环境下,加大了连接个数之后,测试环境的延迟降低了。而在线上环境,改成多长连接之后,在qps不变的情况下,延迟从平均10ms降到了平均1ms。

下面是稳定之后,监控平台记录的线上环境的qps和rt数据

  • 线上QPS-优化后

线上qps-优化后

  • 线上RT-优化后

线上RT-优化后

发现增加了长连接个数之后,延迟降低了,性能提升了。不过由于目前每台服务端监听14台客户端,客户端每增加一个长连接就会导致服务端长连接增加14个,如果连接过多,就会因为带宽资源不够而出现瓶颈,所以要根据线上实际情况来调整长连接个数。

思考

调用完成了,但是思考还没有停止。通过这次经历,也算发现了dubbo的一些弊端。作为一款致力于提供服务的框架,dubbo的问题发现能力还有待完善。

  • dubbo监控平台只显示了所有服务端、客户端的整体性能指标,缺少单台机器的指标显示
  • dubbo监控平台只能统计平均rt和平均qps,平均值本身就是非常不清晰的指标,采用百分比分布统计的方式会更好
  • dubbo监控平台没有提供报警功能,没有办法及时发现问题

综上所述,dubbo还有值得完善,后续可以对dubbo这些不足做一些扩展




版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/moonpure/article/details/74946596

智能推荐

leetcode 172. 阶乘后的零-程序员宅基地

文章浏览阅读63次。题目给定一个整数 n,返回 n! 结果尾数中零的数量。解题思路每个0都是由2 * 5得来的,相当于要求n!分解成质因子后2 * 5的数目,由于n中2的数目肯定是要大于5的数目,所以我们只需要求出n!中5的数目。C++代码class Solution {public: int trailingZeroes(int n) { ...

Day15-【Java SE进阶】IO流(一):File、IO流概述、File文件对象的创建、字节输入输出流FileInputStream FileoutputStream、释放资源。_outputstream释放-程序员宅基地

文章浏览阅读992次,点赞27次,收藏15次。UTF-8是Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节。文件字节输入流:每次读取多个字节到字节数组中去,返回读取的字节数量,读取完毕会返回-1。注意1:字符编码时使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码。定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。UTF-8字符集:汉字占3个字节,英文、数字占1个字节。GBK字符集:汉字占2个字节,英文、数字占1个字节。GBK规定:汉字的第一个字节的第一位必须是1。_outputstream释放

jeecgboot重新登录_jeecg 登录自动退出-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏3次。解决jeecgboot每次登录进去都会弹出请重新登录问题,在utils文件下找到request.js文件注释这段代码即可_jeecg 登录自动退出

数据中心供配电系统负荷计算实例分析-程序员宅基地

文章浏览阅读3.4k次。我国目前普遍采用需要系数法和二项式系数法确定用电设备的负荷,其中需要系数法是国际上普遍采用的确定计算负荷的方法,最为简便;而二项式系数法在确定设备台数较少且各台设备容量差..._数据中心用电负荷统计变压器

HTML5期末大作业:网页制作代码 网站设计——人电影网站(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 dreamweaver作业静态HTML网页设计模板_网页设计成品百度网盘-程序员宅基地

文章浏览阅读7k次,点赞4次,收藏46次。HTML5期末大作业:网页制作代码 网站设计——人电影网站(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 dreamweaver作业静态HTML网页设计模板常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 明星、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 军事、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他 等网页设计题目, A+水平作业_网页设计成品百度网盘

【Jailhouse 文章】Look Mum, no VM Exits_jailhouse sr-iov-程序员宅基地

文章浏览阅读392次。jailhouse 文章翻译,Look Mum, no VM Exits!_jailhouse sr-iov

随便推点

chatgpt赋能python:Python怎么删除文件中的某一行_python 删除文件特定几行-程序员宅基地

文章浏览阅读751次。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。AI职场汇报智能办公文案写作效率提升教程 专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。_python 删除文件特定几行

Java过滤特殊字符的正则表达式_java正则表达式过滤特殊字符-程序员宅基地

文章浏览阅读2.1k次。【代码】Java过滤特殊字符的正则表达式。_java正则表达式过滤特殊字符

CSS中设置背景的7个属性及简写background注意点_background设置背景图片-程序员宅基地

文章浏览阅读5.7k次,点赞4次,收藏17次。css中背景的设置至关重要,也是一个难点,因为属性众多,对应的属性值也比较多,这里详细的列举了背景相关的7个属性及对应的属性值,并附上演示代码,后期要用的话,可以随时查看,那我们坐稳开车了······1: background-color 设置背景颜色2:background-image来设置背景图片- 语法:background-image:url(相对路径);-可以同时为一个元素指定背景颜色和背景图片,这样背景颜色将会作为背景图片的底色,一般情况下设置背景..._background设置背景图片

Win10 安装系统跳过创建用户,直接启用 Administrator_windows10msoobe进程-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏8次。Win10 安装系统跳过创建用户,直接启用 Administrator_windows10msoobe进程

PyCharm2021安装教程-程序员宅基地

文章浏览阅读10w+次,点赞653次,收藏3k次。Windows安装pycharm教程新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入下载安装PyCharm1、进入官网PyCharm的下载地址:http://www.jetbrains.com/pycharm/downl_pycharm2021

《跨境电商——速卖通搜索排名规则解析与SEO技术》一一1.1 初识速卖通的搜索引擎...-程序员宅基地

文章浏览阅读835次。本节书摘来自异步社区出版社《跨境电商——速卖通搜索排名规则解析与SEO技术》一书中的第1章,第1.1节,作者: 冯晓宁,更多章节内容可以访问云栖社区“异步社区”公众号查看。1.1 初识速卖通的搜索引擎1.1.1 初识速卖通搜索作为速卖通卖家都应该知道,速卖通经常被视为“国际版的淘宝”。那么请想一下,普通消费者在淘宝网上购买商品的时候,他的行为应该..._跨境电商 速卖通搜索排名规则解析与seo技术 pdf

推荐文章

热门文章

相关标签