免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Aquester
打印 上一主题 下一主题

epoll_wait有惊群效应吗? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-05-06 14:29 |只看该作者

回复 #2 cugb_cat 的帖子

环境是多线程,不是多进程,即多个线程对同一个epfd调用epoll_wait,当epoll_wait返回大于时,先判断是否为监听套接字可读,如果是就调用accept接受连接请求,现在的现象是accept会返回EWOULDBLOCK,从这可推断出epoll_wait出现了惊群效应,否则accept不应当失败,置errno为EWOULDBLOCK。

论坛徽章:
0
12 [报告]
发表于 2008-05-06 22:49 |只看该作者
LZ的程序结构有问题吧? epoll_wait不需要多个进程同时wait. 应是一个进程的主循环wait. 这也是有poll这样的机制的本来意义所在

论坛徽章:
0
13 [报告]
发表于 2008-05-07 12:04 |只看该作者
原帖由 Aquester 于 2008-5-6 14:29 发表
环境是多线程,不是多进程,即多个线程对同一个epfd调用epoll_wait,当epoll_wait返回大于时,先判断是否为监听套接字可读,如果是就调用accept接受连接请求,现在的现象是accept会返回EWOULDBLOCK,从这可推断 ...


似乎是程序有问题。只用一个线程调用epoll_wait,然后把可读写的socket交给专门的线程读写。

我最近也在这方面的程序。有机会可以讨论讨论哦.

论坛徽章:
0
14 [报告]
发表于 2008-05-07 14:30 |只看该作者
原帖由 思一克 于 2008-5-6 06:49 发表
LZ的程序结构有问题吧? epoll_wait不需要多个进程同时wait. 应是一个进程的主循环wait. 这也是有poll这样的机制的本来意义所在

程序的结构可能有点问题,不过问题不大吧。为了利用MP而在多个进程/线程中同时poll/epoll然后各自处理,我觉得问题也不大啊。如果有惊群问题的话,倒是应该修正了。

论坛徽章:
0
15 [报告]
发表于 2009-05-06 16:51 |只看该作者
我试过,在多进程环境下,所有的子进程都epoll_wait同一个epoll fd,确实有“惊群”现象,不过不是所有子进程都被唤醒,而是某几个被唤醒,其中有的出现EAGAIN错误。

论坛徽章:
0
16 [报告]
发表于 2009-05-06 17:03 |只看该作者

论坛徽章:
0
17 [报告]
发表于 2009-05-06 17:30 |只看该作者
同意12、13楼。
我在我的项目中一直只使用一个epoll_wait对一个epfd.epoll_wait后,将fd传入线程调配模块交给其他线程处理。
这样即使有惊群效应,也不会对我的程序有任何影响。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
18 [报告]
发表于 2009-05-06 18:20 |只看该作者
挖坟呢

论坛徽章:
0
19 [报告]
发表于 2009-05-06 20:09 |只看该作者
据我所知多进程下是没有问题的,至少在比较新的平台,你的模型和apache的event mpm类似 据闻nginx也是这样使用 熟悉的可以证实下 有两点
可能会对此有影响:1,epoll_wait 的句柄需要在父进程中调用listen
                           2,  epoll_wait的fd_set 是在你的子进程中创建

根据目前的测试 没有发现问题
再说下这样的好处 还是多进程的好处 即使一个进程挂掉 服务不会有影响 再结合一个执行简单维护子进程工作的父进程,稳定,高效。

Hi,

If multiple threads are parked on epoll_wait (on a single epoll fd) and
events become available, epoll performs a wake up of all threads of the
poll wait list, causing a thundering herd of processes trying to grab
the eventpoll lock.

This patch addresses this by using exclusive waiters (wake one). Once
the exclusive thread finishes transferring it's events, a new thread
is woken if there are more events available.

Makes sense?

Signed-off-by: Davi E. M. Arnaut <davi@haxent.com.br>

---
fs/eventpoll.c |    7 +++++++
1 file changed, 7 insertions(+)
Index: linux-2.6/fs/eventpoll.c
===================================================================
--- linux-2.6.orig/fs/eventpoll.c
+++ linux-2.6/fs/eventpoll.c
@@ -1491,6 +1491,12 @@ static void ep_reinject_items(struct eve
                }
        }

+        /*
+         * If there is events available, wake up the next waiter, if any.
+         */
+        if (!ricnt)
+                ricnt = !list_empty(&ep->rdllist);
+
        if (ricnt) {
                /*
                 * Wake up ( if active ) both the eventpoll wait list and the ->poll()
@@ -1570,6 +1576,7 @@ retry:
                 * ep_poll_callback() when events will become available.
                 */
                init_waitqueue_entry(&wait, current);
+                wait.flags |= WQ_FLAG_EXCLUSIVE;
                __add_wait_queue(&ep->wq, &wait);

                for (; {


wait.flags |= WQ_FLAG_EXCLUSIVE;
这句是后来加进去的 至少2.6.24后的内核是有的 也就是说这个补丁是被打上拉 设置了互斥进程的标志

[ 本帖最后由 zhoubug 于 2009-5-6 21:08 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2009-05-07 09:02 |只看该作者

回复 #20 mynets 的帖子

多进程的情况下,epoll_create函数应该在创建子进程之后调用,这样就不会出现epoll的惊群现象,lighttpd也是这么做的,所以没有出现这个问题.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP