记录一次Linux下应用句柄泄露问题

2 篇文章 0 订阅
1 篇文章 0 订阅

目前在做公司的一个小项目,主要是做数据转发一块,需要在本地开启一个端口接收数据,然后传给消息中间件,服务用的底层跟消息中间件是一样的,都是netty,在服务测试时发现,当真实服务器连接上之后,服务的连接数一直在上涨,并且用lsof命令查看服务的open files也在上涨,平均10秒钟上涨10个左右。

刚开始查看服务器系统参数发现,因为是新的服务器,没有改open files的数量,先改为10000,心想有可能是连接释放的时间比较长,先给多点试试。结果根本没用,该涨还是涨,一直涨到1800多,觉得肯定是代码哪出问题了。遂查看日志,可气的是日志也不报错,要是报个错也好办点,只能在茫茫的debug中寻找一些有用的信息,还好我在接收到新连接时会打印日志,发现不停地有新连接接进来,在增加新的观察点后发现,之前的连接都会变成非活动的,这时就想着,先把所有的连接放到一起,每次来一个连接就看看之前的连接哪些已经没有用了,就关闭并remove掉。改完后就觉得,呀,这下完美了,再次执行,还是上涨,只是在中间稍微短暂地有减少过,也就是说,没鸟用。
这样看来,我的连接已经被释放了,还有很多open files,说明有其他的连接没有被释放,突然就想到了那个也是用netty的中间件,因为我的业务逻辑就是收到消息,发送消息,发送是用中间件发送的,是不是那个发送端没被释放呢,一看代码,果不其然,服务端的@scope设置的是prototype,因为服务中的各种对象基本是由spring管理的,而每次有新连接都会创建新的handler,从而创建了新的中间件发送端,而每个发送端里都包含一个netty客户端,想想都心寒!
接下来就是改代码了,比较简单,除了上面的关闭连接,还有把@scope去掉,保持默认,连接数就一直在150左右了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值