Nginx惊群现象的两种解决办法
惊群现象:
惊群现象是指由多个worker进程监听同一个Socket事件时,当事件发生时,相关的所有进程被惊醒,但最终只能有一个进程对该事件进行处理,其他进程会重新休眠,从而导致系统资源的浪费和系统性能的下降。惊群包含accept惊群和epoll惊群。
惊群的本质:睡眠和唤醒问题,属于典型的观察者模式,进程通过等待事件,挂载关注的对象的等待队列上,但对象有资源时就唤醒等待队列上的进程,至于是否产生惊群关键在于wake_up_common 是否无差别地唤醒等待队列上的进程
Epoll惊群的处理:
(1)Accpet_mutex
通过开启accept_mutex锁,每个Worker进程都会去抢自旋锁,只有抢到自旋锁的才能将Socket加入到Epoll中,Accept新的请求,然后释放锁
(2)EPOLLEXCLUSIVE
linux4.5以后内核版本中,增加了EPOLLEXCLUSIVE,该选项可以通过EPOLL_CTL_ADD对要监控的fd添加EPOLLEXCLUSIVE标记,这样fd的epoll entry就带上了EPOLLEXCLUSIVE标记。当有事件到来时,唤醒第一个带有此标记的epoll entry就退出唤醒过程。通过增加这样一个标记,多线程共用同一个epoll的惊群现象得到了解决。
(3)SO_REUSEPORT
SO_REUSEPORT 是惊群最好的解决方法,Nginx 在 1.9.1 中加入了这个选项,每个 worker 进程都有自己的 socket,这些 socket 都 bind 同一个端口。当新请求到来时,内核根据四元组信息进行负载均衡,非常高效
Accpet惊群的处理
当多个进程/线程调用accept监听同一个socket上时,一个新连接的到来就会导致所有阻塞在该socket上的进程/线程都被唤醒,但是最后只有一个进程/线程可以accept成功,其余的又会重新休眠,这样就产生了惊群现象。通过维护一个等待队列(队列的元素为进程),使用WQ_FLAG_EXCLUSIVE标志位(互斥标志位),非exclusive元素会加在等待队列的前面,而exclusive元素会加在等待队列的末尾,当有新连接到来时,会遍历等待队列,并且只唤醒第一个exclusive进程(非互斥的进程由于排在队列前面也会被唤醒)就退出遍历,阻塞在accept上的进程都是互斥的(也就是WQ_FLAG_EXCLUSIVE标志位会被置位),因此现在的linux内核调用accept时,多个进程/线程只有一个会被唤醒并建立新连接
Nginx惊群现象的两种解决办法的更多相关文章
- [Android]Eclipse 安装 ADT[Android Development Tooling] 失败的两种解决办法
原因 最近想在新装的 Win7 里搭建一下 Android 的开发环境,虽然现在有 Android Studio 了,不过还是习惯 Eclipse 一点.众所周知的原因,Eclipse 直接安装 AD ...
- win10应用程序添加到开机启动项的两种解决办法
原文 win10应用程序添加到开机启动项的两种解决办法 在windows10系统中,如果想让应用程序在开机之后自动运行起来,可以怎么做呢? 方法一: 1.首先创建应用程序的快捷方式 找到自己想加入开机 ...
- Linux下面使用命令如何运行.sh文件的两种解决办法
Linux下面用命令如何运行.sh文件的方法,有两种方法: 一.直接./加上文件名.sh,如运行hello.sh为./hello.sh[hello.sh必须有x权限] 二.直接sh 加上文件名.sh, ...
- Eclipse 配置spring boot pom.xml第1行报错的两种解决办法
现象 通过spring boot项目导入eclipse后,pom.xml文件的第一行总是报错.这里使用的spring版本是2.1.5,2.1.4以前的版本等其他版本的spring没有这个问题. 解决办 ...
- Slave_SQL_Running:No的两种解决办法
进入slave服务器,运行: mysql> show slave status\G ....... Relay_Log_File: localhost-relay-bin. Relay_Log_ ...
- MySQL同步故障:" Slave_SQL_Running:No" 两种解决办法
进入slave服务器,运行: mysql> show slave status\G Relay_Log_File: localhost-relay-bin.000535 Relay_Log_Po ...
- bug_ _ java.lang.IllegalArgumentException: pointerIndex out of range 问题的两种解决办法
========== 4 如何解决java.lang.IllegalArgumentException: pointerIndex out of range? 今天遇到一个bug:java.l ...
- Oracle中除数为0的两种解决办法(decode与nullif)
Oracle中Decode函数,语句DECODE(tag,''ZCGS'',0,1)=decode(''@corp-No@'',''6010'',1,0) decode(字段或字段的运算,值1,值2, ...
- python学习笔记30(全局变量的两种解决办法)
先看程序: >>> count = 0 >>> def fuc(count): print count count +=1 >>> for i i ...
- 关于新版SDK报错You need to use a Theme.AppCompat theme的两种解决办法
android的一个小问题: Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme ( ...
随机推荐
- 将 -Xms 参数设置和-Xmx 参数的相等,对比 -Xms参数 设置为-Xmx 参数的一半,有哪些优势?
将 -Xms 参数设置为与 -Xmx 参数相等,相比于将 -Xms 参数设置为 -Xmx 参数的一半,具有以下优势: 1. 程序启动时间更短 当将 -Xms 参数设置为与 -Xmx 参数相等时,JVM ...
- Electron App 安装包定制 -- Inno Setup 脚本 Pascal Scripting 初探
在做 Electron 项目时,有个需求是安装包安装时要给客户机上装上某个软件 在查看 Inno Setup 官网后发现是通过 .iss 脚本编写实现自定义安装过程 可在 .iss 内可以添加脚本为安 ...
- 【Oracle】使用PL/SQL实现冒泡排序
[Oracle]使用PL/SQL实现冒泡排序 一般来说,SQL要排序的话直接使用order by即可 不一般来说,就是瞎搞,正好也可以巩固自己的数据结构基础 存储包内容如下 规范: create or ...
- 详解Django请求与响应:深入理解Web Http交互的核心机制
本文深入探讨了 Django 中的请求与响应处理,从 Django 请求和响应的基础知识.生命周期,到 HttpRequest 和 HttpResponse 对象的详细介绍.同时,讨论了 Django ...
- Day05_Java_作业
A:看程序写结果(写出自己的分析理由),程序填空,改错,看程序写结果. 1.看程序写结果 class Demo { public static void main(String[] args) { i ...
- Day03_Java_作业
A:选择题 1.给出以下代码,请问表达式grade==70在以下两条语句中是否获得执行? boolean flag = false && grade == 70;//第一条语句 boo ...
- MAUI中如何打开应用商店应用详情页
//打开本应用的应用商店详情页 public Task<bool> OpenStoreAppDetails() { return OpenStoreAppDetails(AppInfo.P ...
- Linux 命令:time
参考链接: time 命令
- Flutter系列文章-Flutter进阶
在前两篇文章中,我们已经了解了Flutter的基础知识,包括Flutter的设计理念.框架结构.Widget系统.基础Widgets以及布局.在本文中,我们将进一步探讨Flutter的高级主题,包括处 ...
- Flask工厂模式蓝图使用Celery实例【亲测可用,已应用于项目中】
单一模式运行Celery在官方文档中已经贴出范例代码,这里我们不过多介绍. 在使用Flaks编写大型项目时,使用工厂模式的好处显而易见.因在Celery4.x以上版本已经抛弃了init_app方法,所 ...