-
accept_mutex 锁
如果开启了
accept_mutex
锁,每个 worker 都会先去抢自旋锁,只有抢占成功了,才把 socket 加入到 epoll 中,accept 请求,然后释放锁。accept_mutex
锁也有负载均衡的作用。accept_mutex
效率低下,特别是在长连接的时候。因为长连接时,一个进程长时间占用accept_mutex
锁,使得其它进程得不到 accept 的机会。因此不建议使用,默认是关闭的。EPOLLEXCLUSIVE 标识
EPOLLEXCLUSIVE
是 4.5+ 内核新添加的一个 epoll 的标识,Ngnix 在 1.11.3 之后添加了NGX_EXCLUSIVE_EVENT
。EPOLLEXCLUSIVE
标识会保证一个事件发生时候只有一个线程会被唤醒,以避免多侦听下的“惊群”问题。不过任一时候只能有一个工作线程调用 accept,限制了真正并行的吞吐量。SO_REUSEPORT 选项
SO_REUSEPORT
是惊群最好的解决方法,Ngnix 在 1.9.1 中加入了这个选项,每个 worker 都有自己的 socket,这些 socket 都bind
同一个端口。当新请求到来时,内核根据四元组信息进行负载均衡,非常高效。参考:
- http://xiaorui.cc/2015/12/02/使用 socket-so_reuseport 提高服务端性能/
- http://pureage.info/2015/12/22/thundering-herd.html
- http://www.cnblogs.com/sxhlinux/p/6254396.html
- http://m.blog.csdn.net/russell_tao/article/details/7204260
- https://www.zhihu.com/question/51618274?utm_medium=social&utm_source=wechat_session&from=groupmessage&isappinstalled=1
- http://www.sohu.com/a/148006569_470018
-
NGINX
313 引用 • 547 回帖 • 1 关注
NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。
-
epoll
7 引用 • 13 回帖
相关帖子
-
-
wenfh2020 • • 1 • 1 赞同
可以看看 EPOLLEXCLUSIVE 的 github 解析。
一个事件只唤醒一个线程是正确的,但是“任一时候只能有一个工作线程调用 accept” 这句话表达不正确。因为 EPOLLEXCLUSIVE 属性是唤醒一个正在睡眠等待的线程,换句话说,正在工作的线程不用唤醒了,但是正在工作的线程也可能会调用 accept。所以实际压力测试,不同线程 accept 仍然可能会产生 EAGAIN 这样的错误,也就是 accept 新连接失败,不过失败的概率相对来说比较低。
这个属性的最大好处是,让那些闲着的线程忙碌起来。为什么说这个属性能避免惊群呢?因为一个就绪事件触发后它并不是无差别地唤醒所有睡眠线程处理,而是有目的地唤醒一个正在睡眠的线程。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于