免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
发表于 2006-08-22 13:48 |显示全部楼层
5000 个?我怎么看你的listen才32?
    if (listen(fd, 32) != 0)
    {
          fprintf(stderr, "listen failed\n");
          return -1;
    }

  1. SYNOPSIS
  2.        #include <sys/socket.h>

  3.        int listen(int sockfd, int backlog);

  4. DESCRIPTION
  5.        To  accept connections, a socket is first created with socket(2), a willingness to accept incoming connec-
  6.        tions and a queue limit for incoming connections are specified with listen(), and then the connections are
  7.        accepted with accept(2).  The listen() call applies only to sockets of type SOCK_STREAM or SOCK_SEQPACKET.

  8.        The backlog parameter defines the maximum length the queue of pending connections may grow to.  If a  con-
  9.        nection request arrives with the queue full the client may receive an error with an indication of ECONNRE-
  10.        FUSED or, if the underlying protocol supports retransmission, the request may be ignored so  that  retries
  11.        succeed.
复制代码

论坛徽章:
0
发表于 2006-08-22 14:07 |显示全部楼层
你的程序我看了。好象是有漏洞,而且是必须在大量连接,慢速的断线才可疑的。

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

请讨论。

论坛徽章:
0
发表于 2006-08-22 14:13 |显示全部楼层
原帖由 playmud 于 2006-8-22 13:48 发表
5000 个?我怎么看你的listen才32?
    if (listen(fd, 32) != 0)
    {
          fprintf(stderr, "listen failed\n");
          return -1;
    }

[code]SYNOPSIS
       #include <s ...


人家这个32不是表示可以连32个的意思,这个32表示最多有32个同时在连并且都没连上,第33个进不来而已

论坛徽章:
0
发表于 2006-08-22 14:14 |显示全部楼层
虽然有HUP等else 控制。但如果EPOLLIN之后由于网络的不好状况,其它时间不在来?如何

论坛徽章:
0
发表于 2006-08-22 14:32 |显示全部楼层
原帖由 playmud 于 2006-8-22 13:48 发表
5000 个?我怎么看你的listen才32?
    if (listen(fd, 32) != 0)
    {
          fprintf(stderr, "listen failed\n");
          return -1;
    }

[code]SYNOPSIS
       #include <s ...



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

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

论坛徽章:
0
发表于 2006-08-22 14:33 |显示全部楼层
原帖由 思一克 于 2006-8-22 14:14 发表
一个fd有事件EPOLLIN后,如果断线,EPOLLOUT永不再来,你的fd不就永远不被关闭了吗?


由于有SO_KEEPALIVE可以避免这种情况吧(lz的程序也做了处理)。
否则就是client有问题,一直连着不放。

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


我一共监视了5000个描述符,程序跑了一天,基本上快耗完了。还剩不到1000个了。


ls /proc/24152/fd/
Display all 4051 possibilities? (y or n)

可见这些耗尽的描述符都在使用中。 但不知道什么地方 ...


用ls -l 看下是那些socket
再用 netstat -a看下这些socket的状态

论坛徽章:
0
发表于 2006-08-22 14:38 |显示全部楼层
原帖由 思一克 于 2006-8-22 14:07 发表
你的程序我看了。好象是有漏洞,而且是必须在大量连接,慢速的断线才可疑的。



就是漫漫耗尽的。

第二种模型也一样。出现这样耗尽的情况。 以前都是用测试工具测试的,基本上看不出破绽。
在线上测试,就很明显了。。

论坛徽章:
0
发表于 2006-08-22 14:41 |显示全部楼层
to wyezl,

FD泄露,原因就是没有close是无疑问的。
WHY MEIYOU close?
就是事件有的时候(比如网络坏等原因)没有到来。

论坛徽章:
0
发表于 2006-08-22 14:51 |显示全部楼层
原帖由 nuclearweapon 于 2006-8-22 14:34 发表


用ls -l 看下是那些socket
再用 netstat -a看下这些socket的状态



这是只监视1024个fds的时候的部分贴图。

# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 *:32768                     *:*                         LISTEN      
tcp        0      0 *:sunrpc                    *:*                         LISTEN      
tcp        0      0 *:http                      *:*                         LISTEN      
tcp        0      0 xxx.108.37.77:http          122.48.0.37:56652           SYN_RECV   
tcp        0      0 xxx.108.37.77:http          211.147.253.74:55689        SYN_RECV   
tcp        0      0 xxx.108.37.77:http          219.135.251.110:2669        SYN_RECV   
warning, got duplicate tcp line.
tcp        0      0 xxx.108.37.77:http          122.48.0.89:12881           SYN_RECV   
tcp        0      0 xxx.108.37.77:http          58.246.194.192:4254         SYN_RECV   
tcp        0      0 xxx.108.37.77:http          122.48.0.89:12923           SYN_RECV   
tcp        0      0 xxx.108.37.77:http          218.22.98.170:56851         SYN_RECV   
tcp        0      0 xxx.108.37.77:http          122.48.0.89:12888           SYN_RECV   
tcp        0      0 xxx.108.37.77:http          60.190.192.46:4072          SYN_RECV   
tcp        0      0 xxx.108.37.77:http          61.177.227.182:27180        SYN_RECV   
tcp        0      0 xxx.108.37.77:http          60.0.218.7:41237            SYN_RECV   
tcp        0      0 xxx.108.37.77:http          221.232.42.194:3713         SYN_RECV   
tcp        0      0 xxx.108.37.77:http          218.81.111.25:4495          SYN_RECV   
tcp        0      0 xxx.108.37.77:http          122.48.0.35:59812           SYN_RECV   
tcp        0      0 xxx.108.37.77:http          58.60.5.33:7660             SYN_RECV   
tcp        0      0 xxx.108.37.77:http          222.137.4.7:4296            SYN_RECV


ls -l /proc/27952/fd/
rwx------  1 root root 64 Aug 22 14:44 837 -> socket:[31398309]
lrwx------  1 root root 64 Aug 22 14:44 838 -> socket:[31397749]
lrwx------  1 root root 64 Aug 22 14:44 839 -> socket:[31394222]
lrwx------  1 root root 64 Aug 22 14:38 84 -> socket:[30926430]
lrwx------  1 root root 64 Aug 22 14:44 840 -> socket:[31398135]
lrwx------  1 root root 64 Aug 22 14:44 841 -> socket:[31398930]
lrwx------  1 root root 64 Aug 22 14:44 842 -> socket:[31397984]
lrwx------  1 root root 64 Aug 22 14:44 843 -> socket:[31390139]
lrwx------  1 root root 64 Aug 22 14:44 844 -> socket:[31398331]
lrwx------  1 root root 64 Aug 22 14:44 845 -> socket:[31397572]
lrwx------  1 root root 64 Aug 22 14:44 846 -> socket:[31397546]
lrwx------  1 root root 64 Aug 22 14:44 847 -> socket:[31396094]
lrwx------  1 root root 64 Aug 22 14:44 848 -> socket:[31393666]
lrwx------  1 root root 64 Aug 22 14:44 849 -> socket:[31398932]
lrwx------  1 root root 64 Aug 22 14:38 85 -> socket:[30884712]
lrwx------  1 root root 64 Aug 22 14:44 852 -> socket:[31397555]
lrwx------  1 root root 64 Aug 22 14:44 856 -> socket:[31390278]
lrwx------  1 root root 64 Aug 22 14:44 858 -> socket:[31392652]
lrwx------  1 root root 64 Aug 22 14:44 859 -> socket:[31392710]
lrwx------  1 root root 64 Aug 22 14:38 86 -> socket:[30883810]
lrwx------  1 root root 64 Aug 22 14:38 87 -> socket:[30913192]
lrwx------  1 root root 64 Aug 22 14:38 88 -> socket:[30943036]
lrwx------  1 root root 64 Aug 22 14:38 89 -> socket:[31133080]
lrwx------  1 root root 64 Aug 22 14:38 9 -> socket:[30951877]
lrwx------  1 root root 64 Aug 22 14:38 90 -> socket:[30999630]
lrwx------  1 root root 64 Aug 22 14:38 91 -> socket:[31134432]
lrwx------  1 root root 64 Aug 22 14:38 92 -> socket:[30928870]
lrwx------  1 root root 64 Aug 22 14:38 93 -> socket:[30975324]
lrwx------  1 root root 64 Aug 22 14:38 94 -> socket:[30936083]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP