免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 29472 | 回复: 74
打印 上一主题 下一主题

epoll 边缘触发模式的问题 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-04 18:02 |只看该作者 |倒序浏览
1. 我将listen_fd 设置为nonblock 然后用EPOLLET + EPOLLIN 加入到epoll events中.
    当压力测试时(800个客户端), 一开始的时候接收连接有点儿迟钝, 但马上就好起来了. 总之. 效果不如水平触发的
    观察日志, 发现在接收 fd=319 后, 3秒钟后才接收到fd = 320, 多次测试后, 发现总是在三百多个连接后,出现3种钟的间隔.
2. 我要所有connection fd 设置为nonblock 然后用EPOLLET + EPOLLIN 加入到epoll events中.
    当压力测试时(800个客户端), 只检测到了556(总之是比800小)个关闭消息.

注: 采用单线程模型.

不知各位有没有遇到过同样的问题.

[ 本帖最后由 cookis 于 2008-11-4 18:07 编辑 ]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
2 [报告]
发表于 2008-11-04 20:37 |只看该作者
你是用一个client端模拟出800个连接过来?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2008-11-05 09:31 |只看该作者
原帖由 chenzhanyiczy 于 2008-11-4 20:37 发表
你是用一个client端模拟出800个连接过来?



对..

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
4 [报告]
发表于 2008-11-05 12:56 |只看该作者
会不会client端实现有问题

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2008-11-05 13:00 |只看该作者
原帖由 chenzhanyiczy 于 2008-11-5 12:56 发表
会不会client端实现有问题


不会..同样的客户端连接水平触发模式的epoll就没事

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
6 [报告]
发表于 2008-11-05 13:14 |只看该作者
首先要清楚ET的概念

不知你的server端怎样实现的?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2008-11-05 14:04 |只看该作者
http://code.google.com/p/netdkit/

有时间帮我看一下.EpollProactor

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
8 [报告]
发表于 2008-11-05 14:10 |只看该作者
希望能帮到你吧

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2008-11-05 16:33 |只看该作者


  1.     if (acceptor.open (local_addr) != 0)
  2.     {
  3.         std::cout << errno << std::endl;
  4.         perror ("open");
  5.         return 0;
  6.     }
  7.     NDK::set_non_block_mode (acceptor.handle ());
  8.     int ep_fd = epoll_create (1000);
  9.     struct epoll_event ep, evs[1000];
  10.     ep.events  = EPOLLIN | EPOLLET;
  11.     ep.data.fd = acceptor.handle ();
  12.     epoll_ctl (ep_fd, EPOLL_CTL_ADD, acceptor.handle (), &ep);
  13.     int close_count = 0;
  14.     int connection_count = 0;
  15.     char buff[4096] = {0};
  16.     while (1)
  17.     {
  18.         int ret = epoll_wait (ep_fd, evs, 1000, -1);
  19.         if (ret > 0)
  20.         {
  21.             for (int i = 0; i < ret; ++i)
  22.             {
  23.                 if (evs[i].data.fd == acceptor.handle ())
  24.                 {
  25.                     NDK_HANDLE new_handle = ::accept (evs[i].data.fd,
  26.                             0,
  27.                             0);
  28.                     if (new_handle != -1)
  29.                     {
  30.                         ++connection_count;
  31.                         fprintf (stderr, "new connection index = %d\n", connection_count);
  32.                         NDK::set_non_block_mode (new_handle);
  33.                         struct epoll_event eh;
  34.                         eh.events  = EPOLLIN | EPOLLET;
  35.                         eh.data.fd = new_handle;
  36.                         epoll_ctl (ep_fd, EPOLL_CTL_ADD, eh.data.fd, &eh);
  37.                     }
  38.                 }else
  39.                 {
  40.                    int ret = NDK::recv (evs[i].data.fd, buff, sizeof (buff), 0);
  41.                    if (ret == 0)
  42.                    {
  43.                        ++close_count;
  44.                        fprintf (stderr, "peer close index = %d\n", close_count);
  45.                        NDK::closesocket (evs[i].data.fd);
  46.                        struct epoll_event eh;
  47.                        eh.events  = EPOLLIN | EPOLLET;
  48.                        eh.data.fd = evs[i].data.fd;
  49.                        epoll_ctl (ep_fd, EPOLL_CTL_DEL, eh.data.fd, &eh);
  50.                    }
  51.                 }
  52.             }
  53.         }
  54.     }
  55.     NDK::closesocket (acceptor.handle ());
  56.     return 0;

复制代码


我这样写了一个简单的..但发现在 close_count总是比new_connection少几个.

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
10 [报告]
发表于 2008-11-05 21:54 |只看该作者
会不会有ret == -1的情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP