记录一次Linux下应用句柄泄露问题
2018-01-22 22:48
295 查看
目前在做公司的一个小项目,主要是做数据转发一块,需要在本地开启一个端口接收数据,然后传给消息中间件,服务用的底层跟消息中间件是一样的,都是netty,在服务测试时发现,当真实服务器连接上之后,服务的连接数一直在上涨,并且用lsof命令查看服务的open files也在上涨,平均10秒钟上涨10个左右。
刚开始查看服务器系统参数发现,因为是新的服务器,没有改open files的数量,先改为10000,心想有可能是连接释放的时间比较长,先给多点试试。结果根本没用,该涨还是涨,一直涨到1800多,觉得肯定是代码哪出问题了。遂查看日志,可气的是日志也不报错,要是报个错也好办点,只能在茫茫的debug中寻找一些有用的信息,还好我在接收到新连接时会打印日志,发现不停地有新连接接进来,在增加新的观察点后发现,之前的连接都会变成非活动的,这时就想着,先把所有的连接放到一起,每次来一个连接就看看之前的连接哪些已经没有用了,就关闭并remove掉。改完后就觉得,呀,这下完美了,再次执行,还是上涨,只是在中间稍微短暂地有减少过,也就是说,没鸟用。
这样看来,我的连接已经被释放了,还有很多open files,说明有其他的连接没有被释放,突然就想到了那个也是用netty的中间件,因为我的业务逻辑就是收到消息,发送消息,发送是用中间件发送的,是不是那个发送端没被释放呢,一看代码,果不其然,服务端的@scope设置的是prototype,因为服务中的各种对象基本是由spring管理的,而每次有新连接都会创建新的handler,从而创建了新的中间件发送端,而每个发送端里都包含一个netty客户端,想想都心寒!
接下来就是改代码了,比较简单,除了上面的关闭连接,还有把@scope去掉,保持默认,连接数就一直在150左右了。
刚开始查看服务器系统参数发现,因为是新的服务器,没有改open files的数量,先改为10000,心想有可能是连接释放的时间比较长,先给多点试试。结果根本没用,该涨还是涨,一直涨到1800多,觉得肯定是代码哪出问题了。遂查看日志,可气的是日志也不报错,要是报个错也好办点,只能在茫茫的debug中寻找一些有用的信息,还好我在接收到新连接时会打印日志,发现不停地有新连接接进来,在增加新的观察点后发现,之前的连接都会变成非活动的,这时就想着,先把所有的连接放到一起,每次来一个连接就看看之前的连接哪些已经没有用了,就关闭并remove掉。改完后就觉得,呀,这下完美了,再次执行,还是上涨,只是在中间稍微短暂地有减少过,也就是说,没鸟用。
这样看来,我的连接已经被释放了,还有很多open files,说明有其他的连接没有被释放,突然就想到了那个也是用netty的中间件,因为我的业务逻辑就是收到消息,发送消息,发送是用中间件发送的,是不是那个发送端没被释放呢,一看代码,果不其然,服务端的@scope设置的是prototype,因为服务中的各种对象基本是由spring管理的,而每次有新连接都会创建新的handler,从而创建了新的中间件发送端,而每个发送端里都包含一个netty客户端,想想都心寒!
接下来就是改代码了,比较简单,除了上面的关闭连接,还有把@scope去掉,保持默认,连接数就一直在150左右了。
相关文章推荐
- 记录一次Linux定时任务遇到的问题
- linux句柄泄露问题查看
- 记一次VNC远程连接Linux问题解决记录(5900端口测试、KDE桌面安装)
- 记录一次mysql 主从不同步的问题操作(hashlinux)
- 记一次VNC远程连接Linux问题解决记录(5900端口测试、KDE桌面安装)
- linux句柄泄露问题
- 应用从PB 9.0升级到11 应该注意的问题(记录)
- x3950 M2安装linux问题和解决记录
- 应用 Valgrind 发现 Linux 程序的内存问题
- 【转】应用 Valgrind 发现 Linux 程序的内存问题
- 一次linux web服务器优化记录
- 解决linux无法一次删除许多文件的问题
- 我的mini2440 linux2.9.32 移植问题记录
- 应用 Valgrind 发现 Linux 程序的内存问题
- 菜鸟安装Linux的问题记录
- 由cache"引起"的内存问题——记录Linux的Cache Memory(缓存内存)机制
- 基于2440 linux2.6.30 移植问题记录
- 应用 Valgrind 发现 Linux 程序的内存问题
- 解决linux无法一次删除许多文件的问题
- Linux下用JMap对Java程序进行性能测试检查内存泄露问题