Chinaunix

标题: epoll_wait惊群返回值 [打印本页]

作者: zhongyj    时间: 2013-09-18 17:35
标题: epoll_wait惊群返回值
多个进程epoll_wait侦听某个端口的时候存在惊群的问题。
有一个客户端连接时,会唤醒所有进程。
这里说的唤醒是说的每个侦听这个端口的进程都从epoll_wait中返回,只有一个返回值大于0,其他都返回0吗。
作者: linux_c_py_php    时间: 2013-09-18 23:15
父进程listen, 之后fork若干子进程一起epoll listen fd.

只有一个client连接上来, listen fd可读, 所有进程的epoll都返回=1, 你会得知listen fd可读, 然后做accept, 这时候只有一个进程的accept>=0, 其他都返回-1, 错误原因不需要在乎, 设置了非阻塞一般就是EAGAIN了.
作者: luokaichuang    时间: 2016-10-28 04:22
线程间提取数据的时候用互斥锁同步epoll_wait的返回值
作者: codechurch    时间: 2016-10-28 08:32
用shot模式试试
作者: hanzhenlll    时间: 2016-10-28 09:30
主进程 listen  epoll , 得到可读数据后  event_fd 通知可用线程池 accpet 可行否 ?
作者: yulihua49    时间: 2016-10-28 10:15
本帖最后由 yulihua49 于 2016-10-28 10:17 编辑
zhongyj 发表于 2013-09-18 17:35
多个进程epoll_wait侦听某个端口的时候存在惊群的问题。
有一个客户端连接时,会**所有进程。
这里说的 ...

不建议用epoll_wait侦听端口。我是用select守护侦听端口,用专门一个线程。
accept后经过一些处理才送到epoll。其后才是多线程守候处理。

你是多进程的?这个没用过。


作者: codechurch    时间: 2016-11-03 09:06
回复 6# yulihua49

建议用poll代替select,select这个函数最好别再用了。

作者: lxyscls    时间: 2016-11-03 09:13
2楼是的leader-follower模式吧

其他的solutions,memcached就是这种模型
作者: yulihua49    时间: 2016-11-03 12:20
codechurch 发表于 2016-11-03 09:06
回复 6# yulihua49

建议用poll代替select,select这个函数最好别再用了。

只用来守候侦听fd还是可以的,在服务器上台时打开的fd,值很小不会造成select越界。





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2