dubbo官方文档_不可忽视的Dubbo线程池

问题描述

  • 线上突然出现Dubbo超时调用,时间刚好为Consumer端设置的超时时间。
  • 有好几个不同的接口都报超时了
  • 第1次调用超时,第2次(或第3次)重试调用非常快(正常水平)
  • Dubbo调用超时的情况集中出现了3次,每次都是过一会自动恢复

排查

排查日志

看到调用超时,首先就拿着traceId去服务提供方查日志。 奇怪的是,在服务提供方的业务日志里面,只有正常的调用日志(耗时正常),没有超时调用的日志。 从正常的调用日志里面看,一切都是正常的,看不出所以然。 给人的感觉就是超时那次请求的调用没有达到服务提供方。

此时系统活动情况

通过系统历史监控,我们发现除了gc比平时稍微高一点外(也在正常水位),没有其他的异常;CPU、内存、网络等指标都在正常范围。

查看Dubbo线程活动情况

第2次系统集中超时报警的做的第一件事就是登录到那台服务器查看dubbo线程活动情况:看下能不能找到阻塞在哪一行代码。很遗憾,所有的dubbo线程都没有阻塞,都是正常的WAITING状态。

并没有明显表明阻塞在某段代码,这可难倒我们了:如果没有阻塞的话,为什么dubbo调用方会报超时?继续看代码

该接口是否存在阻塞的代码?

硬着头皮重新看代码每一个分支,突然发现底层的一个方法中有http调用!会不会是这个http调用导致的超时?如果是的话,那么不同的接口调用超时的情况就说的通了,因为上层大部分接口都会调用这个底层方法。

怀揣着激动的心,仔细看了http调用的逻辑:用的是JDK提供的HttpURLConnection,其中只用了HttpURLConnection#getContentLength方法,并且也在finally代码块中将这个连接关闭了。好像也不是这个引起的,起初还以为getContentLength会把文件给下载下来,但是看了接口文档以后发现只会去读头信息中的ContentLength。

/*** Returns the value of the {@code content-length} header field.* <p>* <b>Note</b>: {@link #getContentLengthLong() getContentLengthLong()}* should be preferred over this method, since it returns a {@code long}* instead and is therefore more portable.</p>** @return  the content length of the resource that this connection's URL*          references, {@code -1} if the content length is not known,*          or if the content length is greater than Integer.MAX_VALUE.*/public int getContentLength() {long l = getContentLengthLong();if (l &gt; Integer.MAX_VALUE)return -1;return (int) l;}

代码阻塞的情况可能性也不大,因为重试请求不会超时:如果代码阻塞,那么重试请求大概率也会超时。

数据访问层是否有异常情况

既然代码没有阻塞,那么有没有可能是数据访问层的异常造成的呢?毕竟不止一个接口存在超时的问题,如果是底层数据访问层的异常导致,那么也说得通。

重点排查了mysql,但结果是令人失望的:并没有慢SQL;并且dubbo超时期间,mysql实例的CPU和内存水位都是正常的。

除了mysql、redis实例本身指标正常外,基于上面同样的理由:如果数据访问层有问题,那么重试基本上也会超时。所以数据访问层导致超时的线索也被排除。

有没有可能是Dubbo层面的问题

排查再次陷入僵局,逼迫着我们重新梳理排查思路:

  1. 除了代码阻塞
  2. 除了数据访问层异常
  3. 除了超时请求,其他请求的日志都是正常的

那么还有可能会导致超时呢?会不会是Dubbo本身异常导致的?

此时有一个关键的线索进入我们的视野:超时的那次请求去哪儿了?

在服务提供方的日志里面没有超时请求的的日志,只有重试请求成功的业务日志。太奇怪了,就算超时总的留下日志的吧,日志都不留,欺负我胖虎吗?!

到这里想到超时的请求可能是一个突破口,于是开始看Dubbo的相关的源码和文档。

从官方文档中的服务端调用链一层层往下查

01f3b3e9881b59684c996d6cbf75d729.png

AllChannelHandler源码中看到了令人兴奋的注释:

cc134d0442ca20bb56e9a869830d76a7.png

兴奋之余,为了避免理解偏差,还特地用百度翻译了一下

d0b788908b49baf174761bc88ad40874.png

满了,那么服务端不会返回,直到客户端超时!这不是正式我们碰到的问题吗?! 并且此时还没有进入业务代码,所以没有打印业务日志,这样就可以解释为什么没有服务提供方没有超时请求的日志了。

别激动,这里明明有返回threadpool is exhausted异常信息,怎么能说没有返回呢? 别急,这是另外一个项目引用的dubbo,版本是2.6.2。 回到出问题的那个项目,查看dubbo版本:2.8.6,查看AllChannelHandler源码:是的在2.8.6版本中,并没有这个返回错误

0408609ea692c7a6bdfbe412aefd479e.png

题好像找到了,OK,剩下的就是验证了。

验证

准备

  • 将DubboServerHandler线程池的最大线程数调到5
  • 使用Apache Bench进行压测:200请求、并发10个线程

case1:复现问题

  • Dubbo使用2.8.6版本
  • 预期:部分请求超时报错,重试耗时正常
  • 压测结果符合预期:部分接口报错超时,并且重试请求耗时正常

case2:验证猜想

  • Dubbo使用2.6.2版本
  • 预期:部分请求报错线程池耗尽threadpool is exhausted,并且重试大概率也会报该错误
  • 压测结果符合预期

至此,基本判定线上Dubbo调用超时的问题就是因为线程池耗尽引起的。

这个超时问题前前后后查了一周左右,排查过程中试了很多排查方向,为了叙述方便就没有展开。

避坑指南

  1. 合理设置Dubbo线程池大小。默认是200
  2. 合理设置超时时间。如果真出现了Dubbo调用超时的情况,合理的超时时间能够避免服务调用方被打爆
  3. Dubbo接口必须有返回值。从AllChannelHandler#received的源码和注释中可以看到只有有返回值的接口才会返回线程池耗尽的错误信息;其它的情况则不会将错误信息返回给调用方,直到调用方超时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中比较重要的几个函数_Python 几个重要的内置函数 python中的内置函数和关键字需要背过吗...

python重要的几个内置函数用法python内置函数什么用忘不掉的是回忆&#xff0c;继续的是生活&#xff0c;错过的&#xff0c;就当是路过吧。来来往往身边出现很多人&#xff0c;总有一个位置&#xff0c;一直没有变。看看温暖的阳光&#xff0c;偶尔还是会想一想。Python内置函…

netty worker线程数量_Dubbo线程模型

Dubbo中线程池的应用还是比较广泛的&#xff0c;按照consumer端到provider的RPC的方向来看&#xff0c;consumer端的应用业务线程到netty线程、consuemr端dubbo业务线程池&#xff0c;到provider端的netty boss线程、worker线程和dubbo业务线程池等。这些线程各司其职相互配合&…

function click_click事件的累加问题解决

click事件的 累加问题解决&#xff1a;$判断是否隐藏&#xff1a;hidden.c>span 只包含儿子.c span 包含儿子和孙子data-*嵌入自定义数据 .data(to)获取数据remove是移除标签 delete删除数组元素each()函数$(".layui-table-total .layui-table-cell").each(functi…

知道python语言应用2020答案_热点:大学moocPython语言基础与应用答案

2020年智慧树网课答案为您详细解读azMisb热点&#xff1a;大学moocPython语言基础与应用答案的详情,题主的教授应该是想要同学们找出一个值得研究和讨论的theory&#xff0c;简单来说就是你论文探讨的中心。然后需要你们定topic&#xff0c;然后搜索大量靠谱的资料&#xff0c;…

timestamp 转换 date mysql_MySQL时间函数 | 时间戳和日期之间得转换

一、时间戳转日期select FROM_UNIXTIME(1606028010, %Y-%m-%d %H:%i:%s);二、日期转时间戳select unix_timestamp(2018-01-15 09:45:16);三、时间戳格式化十位时间戳转为固定格式(yyyy-MM-dd HH:mm:ss)日期1.格式规定%M 月名字(January……December)%W 星期名字(Sunday……Satu…

python是一种动态语言这意味着_Python如何能成为全球最受欢迎的编程语言?该不该学Python?...

全文共3304字&#xff0c;预计学习时长10分钟 图源&#xff1a;(Python logo courtesy of https 有一种语言在过去十年受喜爱度一路飙升&#xff0c;成为最受欢迎的一种编程语言&#xff0c;它是谁&#xff1f; 千呼万唤始出来&#xff0c;没错&#xff0c;它就是我们的老弟Pyt…

python处理csv文件案例_让繁琐的工作自动化——python处理CSV文件

让繁琐的工作自动化——python处理CSV文件CSV&#xff1a;CSV文件是一种简化的电子表格&#xff0c;不同于Excle(二进制文件)&#xff0c;CSV是纯文本文件。1.环境python3.8pycharm2020.12.读取本期实例数据haha,18,10.0jiji,16,12.1lala,17,11.9papa,11,13.3首先导入csv模块&a…

python实现坐标求取_根据相机位姿求指定点的世界坐标及其python实现

Authorshaniadolphin求解目的本文将展示位姿估计的一种应用&#xff0c;即通过单目相机对环境进行测量。简单来说&#xff0c;本文的工作就是利用下面的两幅图&#xff0c;在已知P1、P2、P3、P4四点世界坐标的情况下&#xff0c;计算出其它点的世界坐标。如图所示&#xff0c;一…

c# treeview查找并选中节点_最通俗易懂的二叉查找树(BST)详解

原来来自 呆萌数据结构-06二叉查找树​imoegirl.com二叉查找树&#xff08;Binary Search Tree&#xff09;&#xff0c;简写BST&#xff0c;是满足某些条件的特殊二叉树。任何一个节点的左子树上的点&#xff0c;都必须小于当前节点。任何一个节点的右子树上的点&#xff0c;都…

服务器损坏mysql修复_云服务器mysql数据库损坏修复mysql

有的时候因为各种原因导致mysql数据库损坏,我们可以使用mysql自带的mysqlcheck命令来快速修复所有的数据库或者特定的数据库,检查优化并修复所有的数据库.1.先在运行中输入CMD,启动命令行.2.进入Mysql的Bin目录&#xff1a;D:\VHostData\MySQL5.1\bin,(这个路径在数据库的安装目…

bootstrap jquery alert_bootstrap第七课

bootstrap 模态框bootstrap是一个非常酷的前端开发框架&#xff0c;它可以大大的简化我们日常开发当中的功能与样式。它有非常漂亮的css组件和非常实用的控件供我们使用。接下来我们来看看bootstrap的内容吧&#xff01;首先大家要引入bootstrap的css和js可以在这里下载&#x…

java 闭包_公司新来的女实习生问我什么是闭包?

作者&#xff1a;霍语佳来源&#xff1a;前端食堂观感度&#xff1a;?????口味&#xff1a;冰镇西瓜烹饪时间&#xff1a;20min撩妹守则第一条&#xff0c;女孩子都喜欢童话故事。那就先来讲一个童话故事~// 有一个公主// 她生活在一个充满冒险的奇妙世界里// 她遇见了她的…

java org.apache.http_org.apache.http jar包下载-org.apache.http.jar包下载 --pc6下载站

org.apache.http.jar包是一款十分常用的jar包如果没有org.apache.http.jar包Apache与http的链接将会出现错误等现象马上下载org.apache.http.jar包。。相关软件软件大小版本说明下载地址org.apache.http.jar包是一款十分常用的jar包,如果没有org.apache.http.jar包,Apache与htt…

网络连接异常、网站服务器失去响应_网站常见故障解决办法

网站在运行过程中&#xff0c;常常遇到各种服务器问题&#xff0c;虽然有服务器厂商的维护&#xff0c;但是往往耗时耗工小编对常见的服务器问题&#xff0c;进行了归纳整理&#xff0c;下面跟各位分享一下。常见故障分析一、恶意攻击在我平时管理网站时&#xff0c;可能会遭到…

python3 sleep 并发_python异步编程之asyncio(百万并发)

点击上方蓝字关注我们目录[python 异步编程之 asyncio(百万并发)]一、asyncio二、aiohttp前言&#xff1a;python 由于 GIL(全局锁)的存在&#xff0c;不能发挥多核的优势&#xff0c;其性能一直饱受诟病。然而在 IO 密集型的网络编程里&#xff0c;异步处理比同步处理能提升成…

【Spring实战】02 配置多数据源

文章目录 1. 配置数据源信息2. 创建第一个数据源3. 创建第二个数据源4. 创建启动类及查询方法5. 启动服务6. 创建表及做数据7. 查询验证8. 详细代码总结 通过上一节的介绍&#xff0c;我们已经知道了如何使用 Spring 进行数据源的配置以及应用。在一些复杂的应用中&#xff0c;…

windows查看usb信息命令_【VPS】Linux VPS查看系统信息命令大全

本文转自老左笔记&#xff0c;自用mark系统# uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加…

无法初始化sftp协议。主机是sftp服务器吗?_WinSCP v5.15.3 免费的 开源图形化 SFTP 客户端...

WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端。同时支持 SCP 协议。它的主要功能是在本地与远程计算机间安全地复制文件&#xff0c;并且可以直接编辑文件。主要功能WinSCP 可以执行所有基本的文件操作&#xff0c;例如下载和上传。同时允许为文件和目录重…

java中组合_java中组合模式详解和使用方法

组合模式(Composite Pattern)&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计模式属于结构型模式&#xff0c;它创建了对象组的树形结构。这种模式创…

道客巴巴vip账号共享2020_腾讯视频VIP怎么两个手机通用?

理论上来说&#xff0c;腾讯视频VIP可以同时在3个设备上登录&#xff0c;但只能在2个设备上同时播放视频。这也就意味着&#xff0c;腾讯视频VIP可以在两个手机上同时使用。腾讯视频VIP基本可以分为微信区、QQ区&#xff0c;两者并不互通。近期腾讯视频手机端修改了登录规则&am…