首页新闻找找看学习计划

accept执行失败后未释放socket?

0
悬赏园豆:100 [已解决问题] 解决于 2014-01-08 17:58

Web服务器运行过程中,浏览器不停地向它发送请求。其中有一些请求进入到等待队列后,协议栈已经尝试将它删除(但未成功),因为后续请求到来,前面的请求被认为重置了。这些socket在accept执行时发生错误:

ECONNABORTED 353: Software caused connection abort
之后,未发现协议栈清除因accept执行失败时未关闭的socket。随着accept执行次数增多,socket memory逐渐被用完了。所有TCP连接请求都被拒绝。
 
请问大家这是个怎么解决啊?我对协议栈这块的结构还不熟悉~
协议栈是FreeBSD,一个比较早期的版本,还没去看它最新的代码,或许这个BUG已经被解决了。
 
我的分析:
请求到来,放到了等待队列中,之后被重置,协议栈删除socket,但因为socket已经在等待队列中了,失败;后来accept执行失败后,也未释放相应的socket,故此类socket不能释放。
问题补充:

在网上找到了一个相关链接,这里面说FreeBSD本身是存在这个问题的。

http://lists.freebsd.org/pipermail/freebsd-hackers/2012-December/041401.html

继续先。

为王的主页 为王 | 小虾三级 | 园豆:601
提问于:2014-01-06 19:55
< >
分享
最佳答案
0

这个和FreeBSD没有多大关系,是由于文件系统的accept函数中没处理好导致的。

在FreeBSD中执行bsd_accept失败后,已将socket指派给文件对象,在文件系统的accept函数中处理时,直接把文件对象设置为可以重用了。在之后调用文件对象时,使用了此文件对象,从而导致与之相关的socket未被释放。

为王 | 小虾三级 |园豆:601 | 2014-01-08 17:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册