原创技术分享 | xsocket连接异常排查分析
xsocket
是一个轻量级的基于NIO的开源网络通讯框架,核心思想是屏蔽NIO底层网络通信实现,提供统一的调用接口,降低开发难度,提高开发效率。与Mina、Netty等网络通信框架相比,xsocket更轻量化,适用于简单的网络通信环境。
项目地址:
https://sourceforge.net/projects/xsocket

问题现象
在某项目中,采用tcp协议和其他服务进行网络通信,需要定时获取服务状态进行监控。项目部署在linux环境中,使用xsocket作为客户端和服务端的通信框架,使用方式如下:

项目中监控其他服务状态使用短连接方式,每次获取状态时建立Socket连接并发送请求获取服务的状态。配置连接超时时间为1s,并配置多个被监控的服务,且监控程序与被监控的服务网络不可达。启动监控程序后,监控程序日志显示网络连接超时异常(因配置的服务为网络不可达,故该日志为正常日志)。

但持续一段时间后,发现监控程序无法提供服务,日志文件中出现大量的"too many open files"异常信息。
排查问题
1、使用linux中的lsof命令查看进程打开的文件数,发现很多打开的socket连接。
lsof –p xxx(进程号)

统计进程打开的文件数,一直持续增长。
lsof –p xxx(进程号)|wc –l
2、怀疑是监控程序和服务间建立socket连接问题,于是修改监控程序代码,将与服务的连接超时时间设置为5s,重新发布测试,监控程序日志文件中显示“没有到主机的路由”异常,未出现“连接超时”异常。测试一段时间后,监控程序打开的文件数并没持续增长。初步排查确定是xsocket建立连接设置连接超时时间后,触发连接超时异常导致打开文件数增长。

3、疑问:为什么连接超时会导致打开的文件一直被占用而未释放?
java nio中网络通道(channel)建立连接步骤为:open()->connect(),关闭通道:close(),资源未被释放可能是由于某种原因导致close()函数未被调用。
4、查看xsocket源码,分析关于连接超时的代码,超时处理代码如下:
源码位置:
org.xsocket.connection.NonBlockingConnection.SyncIoConnectorCallback#onConnectTimeout
5、从源码分析出xsocket在处理连接超时时,在超时函数调用前后和超时函数中,没有执行通道(channel)关闭,导致资源未释放。
解决方法
修改xsocket源码,在发生连接超时的代码中新增关闭操作释放资源。
源码位置:
org.xsocket.connection.NonBlockingConnection.SyncIoConnectorCallback#onConnectTimeout

重新打包发布,日志显示连接超时异常,查看当前进程打开的文件数,并未持续增长。经过长时间测试,程序稳定运行,xsocket连接超时异常导致打开文件数过多问题得到解决。
总结
xsocket是一个易于使用的基于NIO库来构建高性能、可扩展的网络通信框架,可作为客户端或服务端建立网络通信,其提供了便捷的网络通信接口以及连接池等。在作为客户端使用时,建立连接时设置了连接超时参数时,需要注意连接超时导致的资源未关闭问题,发生此问题时需要修改源码解决问题。
-
近日,经国家能源局严格审查与核准,北京国泰网信科技股份有限公司(以下简称“国泰网信”)正式获得承装(..
-
近日,由人民网·人民数据主办的2026人民数据大会在四川省自贡市盛大召开。本届大会以“智汇盐都,数据‘贡..
-
近日,国家标准化管理委员会正式发布国家标准《网络安全技术SM9密码算法加密签名消息格式》(GB/T 47471-20..
-
近日,工业大数据分析与集成应用工业和信息化部重点实验室(以下简称“实验室”)正式公布新一批工作组成员..
-
在量子计算加速演进、传统密码体系面临颠覆性挑战的时代背景下,抗量子密码技术已成为全球网络安全领域的战..
-
近日,由中国仪器仪表行业协会、全国机械安全标准化技术委员会、全国工业过程测量控制和自动化标准化技术委..
-
近日,由安徽省商用密码行业协会主办的“徽密卫健”安徽省医疗网络安全与密码应用峰会在合肥成功召开。北京..
-
近日,由网信自主创新调研报告编委会组织开展的年度“网信自主创新尖锋榜”评选结果正式揭晓。北京国泰网信..


