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

主进程 listenepoll , 得到可读数据后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越界。
页: [1]
查看完整版本: epoll_wait惊群返回值