新闻中心
news center

原创技术分享 | 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库来构建高性能、可扩展的网络通信框架,可作为客户端或服务端建立网络通信,其提供了便捷的网络通信接口以及连接池等。在作为客户端使用时,建立连接时设置了连接超时参数时,需要注意连接超时导致的资源未关闭问题,发生此问题时需要修改源码解决问题。


 

 

 

 

热门新闻
联系我们
400-8866366
扫一扫二维码
业务合作