当前位置: 首页 > news >正文

tcp的网络惊群问题

1. SO_REUSEPORT 可以解决epoll的惊群问题

但是,现在的 TCP Server,一般都是 多进程+多路IO复用(epoll) 的并发模型,比如我们常用的 nginx 。如果使用 epoll 去监听 accept socket fd 的读事件,当有新连接建立时,所有进程都会被触发。因为由于 fork 文件描述符继承的缘故,所有进程中的 accept socket fd 是相同的。惊群效应依然存在。nginx 也必然存在这个问题,nginx 为了解决问题,并且保证各个 worker 之前 accept 连接数的均衡,费了很大的力气。

有了 SO_REUSEPORT ,解决 多进程+多路IO复用(epoll) 并发模型 accept 惊群问题,就简单、高效很多。我们不需要通过 fork 的形式,让多进程监听同一个端口。只需要在各个进程中, 独自的 监听指定的端口,当然在监听前,我们需要为监听 socket 指定 SO_REUSEPORT ,否则会报错啦。由于没有采用 fork 的形式,各个进程中的 accept socket fd 不一样,加之有新连接建立时,内核只会唤醒一个进程来 accept,并且保证唤醒的 均衡性,因此使用 epoll 监听读事件,就不会触发所有啦。也有牛人为 nginx 提了 patch ,使用 SO_REUSEPORT 来杜绝 accept 惊群,并且还能够保证 worker 之间的均衡性哦。
泽民博客 | Jekyll theme

2. Accept 就是bio。对poll/epoll/select都是是用来实现多路复用的,都不是bio

3. linux 惊群问题

关注这块逻辑:

epoll_create()在Fork之前还是之后,有神马区别呢?

Fork之前epoll_create的话,所有进程共享一个epoll红黑数。

如果我们只需要处理accept事件的话,貌似世界一片美好了。但是,epoll并不是只处理accept事件,accept后续的读写事件都需要处理,还有定时或者信号事件。

当连接到来时,我们需要选择一个进程来accept,这个时候,任何一个accept都是可以的。当连接建立以后,后续的读写事件,却与进程有了关联。一个请求与a进程建立连接后,后续的读写也应该由a进程来做。

当读写事件发生时,应该通知哪个进程呢?Epoll并不知道,因此,事件有可能错误通知另一个进程,这是不对的。实验中观察到了这种现象

4. epoll和惊群

比较下EPOLLEXCLUSIVE 和 SO_REUSEPORT

EPOLLEXCLUSIVE 和 SO_REUSEPORT 都是在内核层面将连接分到多个worker,解决了epoll下的惊群,SO_REUSEPORT 会更均衡一些,EPOLLEXCLUSIVE在压力不大的时候会导致连接总是在少数几个worker上(但这个不会产生任何不利影响)。 SO_REUSEPORT在最坏的情况下会导致一个worker即使Hang了,OS也依然会派连接过去,这是非常致命的,所以4.5内核引入了 EPOLLEXCLUSIVE(总是给闲置等待队列的第一个worker派连接)

探索惊群 ⑤ - nginx - NGX_EXCLUSIVE_EVENT

Nginx 是如何解决惊群效应的? | LinkinStar's Blog

nginx默认在linux支持的情况下,支持EPOLLEXCLUSIVE能力。也支持手动修改配置支持SO_REUSEPORT能力

http://www.lryc.cn/news/487740.html

相关文章:

  • 云原生之运维监控实践-使用Prometheus与Grafana实现对Nginx和Nacos服务的监测
  • 软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型
  • 机器学习——期末复习 重点题归纳
  • MYSQL——数据更新
  • Vite 基础理解及应用
  • [JAVA]用MyBatis框架实现一个简单的数据查询操作
  • CSS 样式的优先级?
  • Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)
  • 数据结构《栈和队列》
  • C# 超链接控件LinkLabel无法触发Alt快捷键
  • JVM类加载过程-Loading
  • 2024年11月19日Github流行趋势
  • 详细描述一下Elasticsearch索引文档的过程?
  • 基于css的Grid布局和vue实现点击左移右移轮播过渡动画效果
  • HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)习惯推荐方案概述
  • 【AtCoder】Beginner Contest 380-F.Exchange Game
  • 30. 并发编程
  • 【包教包会】CocosCreator3.x框架——带翻页特效的场景切换
  • k8s上面的Redis集群链接不上master的解决办法
  • <项目代码>YOLOv8 瞳孔识别<目标检测>
  • 网络编程-002-UDP通信
  • MySQL更换瀚高语法更换
  • Object.prototype.hasOwnProperty.call(item, key) 作用与用途
  • DNS的10种资源记录
  • 【数据分享】1981-2024年我国逐日最低气温栅格数据(免费获取)
  • Kafka进阶_1.生产消息
  • 百度世界2024:智能体引领AI应用新纪元
  • NIST 发布后量子密码学转型战略草案
  • 同向双指针
  • 小鹏汽车大数据面试题及参考答案