免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wyezl

epoll模型的使用及其描述符耗尽问题的探讨 [复制链接]

论坛徽章:
0
发表于 2006-08-22 16:50 |显示全部楼层
原帖由 思一克 于 2006-8-22 16:00 发表
TO nuclearweapon,

我刚才看了KERNEL代码,看到fd消耗只有3个函数socket() , accept(), socketpair(), 而且都是成功后才消耗fd. 网络程序其它任何地方没有看到用fd的?

半连接能消耗fd吗,我不是很清楚。如 ...


按照我的理解,netstat都看到了socket的状态所以就应当有 struct socket了。



可能是我错了。
我也在看代码。查找原因

多谢指教!

论坛徽章:
0
发表于 2006-08-22 16:55 |显示全部楼层
可不可以不用分成
if(events[ i].events & EPOLLIN)

else if(events[ i].events & EPOLLOUT)
两种情况?

只要有事件来就进行读写,
当然要对读写cfd的函数进行出错判断,一旦出错就close(cfd)
这样就能避免EPOLLN之后EPOLLOUT永不再来的情况?
原帖由 思一克 于 2006-8-22 14:07 发表
你的程序我看了。好象是有漏洞,而且是必须在大量连接,慢速的断线才可疑的。

一个fd有事件EPOLLIN后,如果断线,EPOLLOUT永不再来,你的fd不就永远不被关闭了吗?

请讨论。

前提是假定产生EPOLLN事件(可读)的socket一定也可写

[ 本帖最后由 tysn 于 2006-8-22 16:59 编辑 ]

论坛徽章:
0
发表于 2006-08-22 16:56 |显示全部楼层
TO nuclearweapon,

我也不是多肯定,所以谈不到指教。你太客气。

fd好象是最后需要(仅仅是一个下标),而且都是本地(本问题中是SERVER)的APP的直接调用SOCK函数才可以产生。CLIENT要想在本机上产生fd, accept要成功

论坛徽章:
0
发表于 2006-08-22 17:06 |显示全部楼层
通过观察知道
lrwx------  1 root root 64 Aug 22 16:25 480 -> socket:[34370805]
480这个描述符是死掉。不能回收了。我怎么看它的状态?



# ls -l  /proc/28477/fd/
total 20
lrwx------  1 root root 64 Aug 22 16:14 0 -> /dev/pts/3
lrwx------  1 root root 64 Aug 22 16:14 1 -> /dev/pts/3
lrwx------  1 root root 64 Aug 22 16:14 10 -> socket:[34584054]
lrwx------  1 root root 64 Aug 22 16:14 11 -> socket:[34584140]
lrwx------  1 root root 64 Aug 22 16:14 12 -> socket:[32509524]
lrwx------  1 root root 64 Aug 22 16:14 13 -> /usr/home/fi/src/home/ww
lrwx------  1 root root 64 Aug 22 16:14 14 -> socket:[34584144]
lrwx------  1 root root 64 Aug 22 16:14 15 -> socket:[34584145]
lrwx------  1 root root 64 Aug 22 16:14 16 -> socket:[34584147]
lrwx------  1 root root 64 Aug 22 16:14 17 -> socket:[34584152]
lrwx------  1 root root 64 Aug 22 16:14 2 -> /dev/pts/3
lrwx------  1 root root 64 Aug 22 16:16 23 -> socket:[34543624]
lr-x------  1 root root 64 Aug 22 16:14 3 -> eventpoll:[32224366]
lrwx------  1 root root 64 Aug 22 16:14 4 -> socket:[32224367]
lrwx------  1 root root 64 Aug 22 16:25 480 -> socket:[34370805]
lr-x------  1 root root 64 Aug 22 16:14 5 -> /usr/home/fi/src/home/ww
lrwx------  1 root root 64 Aug 22 16:36 6 -> socket:[34581817]
lrwx------  1 root root 64 Aug 22 16:14 7 -> socket:[33195785]
lrwx------  1 root root 64 Aug 22 16:36 8 -> socket:[34584130]
lrwx------  1 root root 64 Aug 22 16:14 9 -> socket:[34583662]

论坛徽章:
0
发表于 2006-08-22 17:10 |显示全部楼层
原帖由 tysn 于 2006-8-22 16:55 发表
可不可以不用分成
if(events[ i].events & EPOLLIN)

else if(events[ i].events & EPOLLOUT)
两种情况?

只要有事件来就进行读写,
当然要对读写cfd的函数进行出错判断,一旦出错就close(cfd) ...


这个效率有点低。
因为可能会产生等待可写。

论坛徽章:
0
发表于 2006-08-22 17:35 |显示全部楼层
原帖由 wyezl 于 2006-8-22 14:32 发表



这个32与5000个同时在线并不矛盾。

又不是说1秒内把这5000个连线全接受进来。
5000是我的epoll所监视的最大描述符个数。

怎么不矛盾了?
你是if ((fd = socket(AF_INET, SOCK_STREAM, 0)) <= 0)
你把listen设成5000看看。

论坛徽章:
0
发表于 2006-08-22 17:43 |显示全部楼层
原帖由 playmud 于 2006-8-22 17:35 发表

怎么不矛盾了?
你是if ((fd = socket(AF_INET, SOCK_STREAM, 0)) <= 0)
你把listen设成5000看看。


5000以内的描述符我都能 接受到。

设那个没什么影响。 估计listen也不能支持那么大的。

论坛徽章:
0
发表于 2006-08-22 17:49 |显示全部楼层
tcp正常的断开需要3次或者4次握手确认,如果没有这个确认他就会保持一定的时间。
/proc/sys/net/ipv4/tcp_keepalive_time

论坛徽章:
0
发表于 2006-08-22 17:50 |显示全部楼层
原帖由 wyezl 于 2006-8-22 17:43 发表


5000以内的描述符我都能 接受到。

设那个没什么影响。 估计listen也不能支持那么大的。

你能接收到和你能处理掉不是一个概念。

论坛徽章:
0
发表于 2006-08-22 17:52 |显示全部楼层
实在找不到原因,你可以把那个默认超时时间设成10几秒或者几十秒。
系统帮你释放掉占用的资源。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP