Thrift java.net.SocketException: Broken pipe问题分析定位

本文详细记录了在使用Thrift时遇到的'Broken pipe'异常问题,分析了问题产生的原因,可能涉及到服务器端的心跳检测关闭连接或网络异常导致的连接关闭。通过对thrift客户端和服务器端的源码探究,发现客户端无法自动感知连接关闭,而服务器端也未设置长连接超时控制。最后得出结论,问题可能是由socket异常或心跳检测触发的连接关闭,需要进一步实验验证。

在实际的thrift使用过程中,thrift客户端跟服务端通讯会有时爆出org.apache.thrift.transport.TTransportException: java.net.SocketException: Broken pipe异常,复现概率不高,很是困惑不知道是由什么原因引起的,在此记录一下分析和定位的过程,以备查看。

环境:

-centos 7
-jdk1.7
-thrift 0.9.1
-连接管理使用的对象池

问题产生的原因

这个异常产生的原因为thrift客户端向一个已经关闭的socket,写入数据导致该异常发生,在我们的客户端表现为client从对象池获取一个TCP长连接,然后在这个长连接上给服务端发送校验,校验连接是否存活,在实际写入探测字符串的时候,该异常发生,由TIOStreamTransport类在flush的时候抛出,关健的问题点在于客户端向一个已经关闭的socket做写入操作。
这里让我们推测一下,首先该连接已经在服务器端被服务器端显示关闭了,而客户端无法感知该连接已经被关闭,为什么服务器端会将这个连接关闭掉呢?原因有很多,例如:

  1. 服务器keeplive心跳,检测发现客户端存活,但是网络不可达,服务器就会关闭这个连接
  2. 连接由于其他原因,例如socket传输异常,导致服务器将这个连接关闭

我们初步怀疑是第一种原因导致的,因为在这个问题发生时,我们的客户端所在的服务还在正常运行。
下面我来看问题发生时的现象。
客户端截图:
这里写图片描述
根据图中,我们明显看到客户端处于CLOSE-WAIT状态,而根据TCP状态图,我们知道进入这个是个状态是由于被动关闭导致的,也就是说我们对应的thrift服务器端将这个socket连接关闭了,而服务器端会进入FIN-WAIT2/TIME-WAIT和CLOSED,这里我们把TCP交互图列举出来:
这里写图片描述
服务端TCP状况截图:
这里写图片描述
通过截图,我们可以很清楚的看到服务端已经将这个连接关闭了,这也就印证了我们的猜测,是由服务器端主动关闭了连接,导致了该问题发生

thrift探究

  1. 既然这个问题是由于thrift上报上来的,我们就去探寻一下thrift客户端的机制,看它是否能感知。通过源码分析得知(源码很多,就不具体列举了)thrift客户端是被动调用,由用户在需要的时候显示调用,进行RPC通讯,写入数据,然后读取返回值,这样就导致,即使服务端给客户端发送了fin挥手信息,他也不能处理,这样也就无法有效将这个连接关闭掉,而是由对象池在实际使用中进行检测,关闭这个失效的连接,对象池也只是管理了这个socket句柄,并没有对FIN的处理。
  2. 在thrift服务器端,我们分析查看了源码,发现,服务器端也没有针对长连接长时间不适用的应用程序的超时控制

结论

经过上文排查,基本怀疑是socket异常导致内核主动关闭连接或者心跳检测异常关闭连接,后续会针对这两种情况进行试验验证

内容概要:本文针对离网光伏直流微网中存在的功率供需失衡问题,提出一种基于光伏最大功率点跟踪(MPPT)与锂离子储能系统双向削峰填谷协同控制的抑制机制。通过在Simulink中构建完整的光伏储能直流系统仿真模型,涵盖PV光伏阵列、Boost DC-DC变换器、负载、双向DC-DC变换器及锂离子电池系统,实现对系统能量流动的精确建模与动态调控。研究核心在于协调MPPT高效捕捉光伏出力与储能系统快速响应负荷波动的能力,提升系统在光照强度变化和负载突变等动态工况下的运行稳定性与供电质量,有效缓解因光伏出力间歇性与负荷不确定性引发的母线电压波动和能量损耗问题。该方法为离网微网的能量管理提供了理论支持与仿真验证平台。; 适合人群:具备电力电子、新能源系统或自动控制等相关专业知识背景,从事微电网、光伏储能系统研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于离网型直流微网能量管理系统的设计与优化;②支撑高比例可再生能源接入场景下的稳定运行控制策略研究;③为MPPT与储能协同控制策略提供仿真验证手段;④适用于科研项目攻关、学术论文复现与实际控制系统开发。; 阅读建议:建议结合Simulink仿真模型与控制算法代码同步学习,重点关注MPPT算法实现、双向DC-DC变换器的控制逻辑以及储能系统充放电策略的设计细节,宜在不同工况下进行仿真实验与参数调试,以深入掌握系统的动态响应特性与控制性能。
内容概要:本文提出了一种基于神经网络的数据驱动迭代学习控制(ILC)算法,专门针对具有未知动态模型和重复作业特征的非线性单输入单输出(SISO)离散时间系统,应用于无人车路径跟踪控制问题,并配套提供了完整的Matlab代码实现。该方法巧妙融合了神经网络强大的非线性逼近能力与迭代学习控制在重复任务中不断提升精度的优势,能够在缺乏精确系统数学模型的情况下,通过多次运行迭代自主优化控制输入序列,显著提高路径跟踪的准确性与鲁棒性。文章不仅展示了核心算法的设计与实现,还列举了涵盖机器学习、深度学习、图像处理、路径规划、电力系统优化等多个前沿科研领域的技术资源,凸显其在智能控制系统仿真与科研创新中的广泛适用性和实用价值。; 适合人群:具备自动控制理论、机器人学或智能系统相关背景,正在从事科研或工程开发工作的研究生、科研人员及技术研发工程师;熟悉Matlab/Simulink编程环境者将更易于上手和深入理解。; 使用场景及目标:①应用于无人车、移动机器人等在重复轨迹任务下的高精度路径跟踪控制,特别适用于系统模型难以精确建模但任务周期性重复的实际场景;②作为数据驱动型智能控制算法的教学与实验平台,帮助研究人员深入理解神经网络与ILC的协同机制,推动先进控制策略的自主创新;③为科研工作者提供可复现的算法范例,加速控制理论研究成果的验证与转化,提升科研效率。; 阅读建议:建议结合所提供的Matlab代码逐模块分析算法实现流程,重点剖析神经网络如何与ILC框架集成以实现误差补偿与控制律更新,并尝试在不同路径场景下调试参数以观察控制性能变化,同时可参考文中提及的其他技术方向拓展研究思路,实现跨领域融合创新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值