[转帖]探索惊群 ①

探索 · 浏览次数 : 0

小编点评

## Nginx惊群现象概述 **1. 概述** * 惊群是一种在多进程或多线程服务中发生的现象,其特点是多个进程争抢共享资源,导致软件系统效率低下。 * 常见的解决方案包括使用 `reuseport`、`NGX_EXCLUSIVE_EVENT` 和 `accept_mutex` 等机制来避免共享资源争抢。 **2. 解决方案** **2.1. reuseport** * 允许每个子进程拥有独立的 listen socket 资源队列,避免资源争抢。 * 每个子进程通过网络四元组通过哈希分配到各个子进程的 listen socket 资源队列,资源分配相对合理(负载均衡)。 **2.2. NGX_EXCLUSIVE_EVENT** * 基于 Linux 4.5+ 内核增加的 epoll 属性 EPOLLEXCLUSIVE 独占资源属性。 * 唤醒一个睡眠等待的进程处理资源。 * 避免无差别地唤醒多个进程,尽量使得各个进程忙碌起来。 **2.3. accept_mutex** * 应用层解决惊群问题,多个子进程通过应用层抢锁,成功者可以独占 listen socket 获取资源的权利。 * 优点:有效地避免了惊群。 * 缺点:因为抢锁时机问题,原来抢到锁的进程下次抢到锁的概率很高,导致有些进程很忙,有些没那么忙,负载不均,资源利用率比较低。 **3. 参考** * 探索惊群 ①(★)探索惊群 ② - accept探索惊群 ③ - nginx 惊群现象探索惊群 ④ - nginx - accept_mutex探索惊群 ⑤ - nginx - NGX_EXCLUSIVE_EVENT探索惊群 ⑥ - nginx - reuseport探索惊群 ⑦ - 文件描述符透传

正文

https://wenfh2020.com/2021/09/25/thundering-herd/

 

 

惊群比较抽象,类似于抢红包 😁。它多出现在高性能的多进程/多线程服务中,例如:nginx。

探索惊群 系列文章将深入 Linux (5.0.1) 内核,透过 多进程模型 去剖析惊群现象、惊群原理、惊群的解决方案。


  1. 探索惊群 ①(★)
  2. 探索惊群 ② - accept
  3. 探索惊群 ③ - nginx 惊群现象
  4. 探索惊群 ④ - nginx - accept_mutex
  5. 探索惊群 ⑤ - nginx - NGX_EXCLUSIVE_EVENT
  6. 探索惊群 ⑥ - nginx - reuseport
  7. 探索惊群 ⑦ - 文件描述符透传

1. 概述

1.1. 惊群现象

多进程睡眠等待 共享 资源,当资源到来时,多个进程被 无差别 唤醒,争抢处理资源。


1.2. 惊群影响

惊群导致软件系统工作效率低下:

  1. 部分进程被频繁唤醒却获取资源失败,导致进程上下文频繁切换,系统资源开销大。
  2. 多进程争抢共享资源,有的抢得多,有的抢得少,资源分配不均。

1.3. 惊群原因

进程睡眠 唤醒 时机问题,详细请参考:探索惊群 ③ - nginx 惊群现象


2. 解决方案

需要围绕两个方面去展开。

  1. 避免共享资源争抢(独占)。
  2. 资源尽量合理分配。

换个角度去思考,如果红包私发,而不是扔进群组里… 这个思路应该是解决惊群问题的关键。😎


我们可以参考 nginx 解决惊群问题的经典方案:

  1. 探索惊群 ④ - nginx - accept_mutex
  2. 探索惊群 ⑤ - nginx - NGX_EXCLUSIVE_EVENT
  3. 探索惊群 ⑥ - nginx - reuseport

2.1. reuseport

内核解决惊群问题,目前 nginx 最好的惊群解决方案,基于 linux 内核 so_reuseport 端口重用网络特性。

  1. 每个子进程拥有独立的 listen socket 资源队列,避免资源争抢;多个队列也提升了并发吞吐。
  2. 新链接通过网络四元组通过哈希分配到各个子进程的 listen socket 资源队列,资源分配相对合理(负载均衡)。

2.2. NGX_EXCLUSIVE_EVENT

内核解决惊群问题,基于 linux 4.5+ 内核增加的 epoll 属性 EPOLLEXCLUSIVE 独占资源属性。

原理非常简单,只唤醒一个睡眠等待的进程处理资源。避免无差别地唤醒多个进程,尽量使得各个进程忙碌起来。

缺点:

  1. 多个进程争抢一个 listen socket 的共享资源。
  2. 单个资源队列,将会是并发吞吐瓶颈。

2.3. accept_mutex

应用层解决惊群问题,多个子进程通过应用层抢锁,成功者可以独占 listen socket 获取资源的权利。

优点:有效地避免了惊群。

缺点:

  1. 因为抢锁时机问题,原来抢到锁的进程下次抢到锁的概率很高,导致有些进程很忙,有些没那么忙,负载不均,资源利用率比较低。
  2. 一个时间段内,只有一个子进程独占 listen socket 的共享资源,无法同时利用多核优势。
  3. 单个资源队列,将会是并发吞吐瓶颈。

3. 参考

与[转帖]探索惊群 ①相似的内容:

[转帖]探索惊群 ①

https://wenfh2020.com/2021/09/25/thundering-herd/ 惊群比较抽象,类似于抢红包 😁。它多出现在高性能的多进程/多线程服务中,例如:nginx。 探索惊群 系列文章将深入 Linux (5.0.1) 内核,透过 多进程模型 去剖析惊群现象、惊群原理、惊

[转帖]探索惊群 ⑥ - nginx - reuseport

https://wenfh2020.com/2021/10/12/thundering-herd-tcp-reuseport/ SO_REUSEPORT (reuseport) 是网络的一个选项设置,它能开启内核功能:网络链接分配 内核负载均衡。 该功能允许多个进程/线程 bind/listen 相

[转帖]探索惊群 ④ - nginx - accept_mutex

https://wenfh2020.com/2021/10/10/nginx-thundering-herd-accept-mutex/ 由主进程创建的 listen socket,要被 fork 出来的子进程共享,但是为了避免多个子进程同时争抢共享资源,nginx 采用一种策略:使得多个子进程,同

[转帖]探索惊群 ③ - nginx 惊群现象

https://wenfh2020.com/2021/09/29/nginx-thundering-herd/ nginx kernel 本文将通过测试,重现 nginx(1.20.1) 的惊群现象,并深入 Linux (5.0.1) 内核源码,剖析惊群原因。 1. nginx 惊群现象 2. 原因

[转帖]探索测试的基本思想:CPIE思维模型

https://www.jianshu.com/p/c32d203b8d7a CPIE(Collation、Prioritization、Investigation、Experimentation,收集、划分优先级、分析调研、实验)是探索式测试的基本思维模型,如图。 CPIE 1)收集Collati

[转帖]初步探索GraalVM——云原生时代JVM黑科技

https://baijiahao.baidu.com/s?id=1749705890892955339&wfr=spider&for=pc 1 云原生时代Java语言的困境 经过多年的演进,Java语言的功能和性能都在不断的发展和提高,诸如即时编译器、垃圾回收器等系统都能体现Java语言的优秀,但

[转帖]Redis 内存优化在 vivo 的探索与实践

https://www.jianshu.com/p/0849b526f0f4 一、 背景 使用过 Redis 的同学应该都知道,它基于键值对(key-value)的内存数据库,所有数据存放在内存中,内存在 Redis 中扮演一个核心角色,所有的操作都是围绕它进行。 我们在实际维护过程中经常会被问到如

[转帖]新一代垃圾回收器ZGC的探索与实践

1. 引入 1.1 GC之痛 很多低延迟高可用Java服务的系统可用性经常受GC停顿的困扰。GC停顿指垃圾回收期间STW(Stop The World),当STW时,所有应用线程停止活动,等待GC停顿结束。以美团风控服务为例,部分上游业务要求风控服务65ms内返回结果,并且可用性要达到99.99%。

[转帖]Serverless 的前世今生

https://my.oschina.net/u/4611872/blog/5598427 从云计算到 Serverless 架构 大家好,我是阿里云 Serverless 产品经理刘宇,很高兴可以和大家一起探索 Serverless 架构的前世今生。 从云计算到云原生再到 Serverless 架

[转帖]JMETER结果分析

https://www.cnblogs.com/a00ium/p/10462892.html 我相信你同意:有很多方法可以收集和解释JMeter结果,你会感到迷茫。 嗯,看完这篇文章后,您将了解收集和分析结果的12种不同方法! 我们将探索每种可能的方式来获得富有洞察力的指标,包括图形,图表,表格,H