首页 > 系统相关 >Nginx惊群现象的两种解决办法

Nginx惊群现象的两种解决办法

时间:2023-09-25 15:46:43浏览次数:29  
标签:解决办法 等待 队列 唤醒 accept 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时,多个进程/线程只有一个会被唤醒并建立新连接

标签:解决办法,等待,队列,唤醒,accept,Nginx,惊群,进程
From: https://www.cnblogs.com/iamxiaofu/p/17728046.html

相关文章

  • nginx+keepalived 配置高可用
     1.安装keepalived官网下载最新版本进行安装下载:https://keepalived.org解压:tar-xzvfkeepalived-2.2.8.tar.gz进入目录运行./configure--prefix=/usr/local/keepalived--sysconf=/etc如果运行有报错,请根据提示安装对应的组件make&&makeinstall 安装完成后加入......
  • nginx默认配置
    usernginx;worker_processesauto;error_log/var/log/nginx/error.log;pid/run/nginx.pid;include/usr/share/nginx/modules/*.conf;events{ worker_connections1024;}http{ log_formatmain '$remote_addr-$remote_user[$time_local]"$re......
  • Mac实现IDEA和nginx前后端联调(新手向)
    前言今天看黑马程序员的javaweb课程,看到前后端联调这一节犯了难。因为老师使用的开发环境是win10,而我用的是Mac,不想装虚拟机,就想着研究一下如何在Mac上实现前后端联调。因为之前只简单学了一下前端三大件,没有系统学过nginx,所以有什么问题请多包涵。前提:获取老师的文件包我们需要......
  • Java连接MSSQL2012数据报TLS10 is not accepted by client preferences [TLS13, TLS12
    这一问题好像是因为Java新版本禁用了些老的加密算法引起的,解决方法为修改java.security文件里的配置信息即可。我用的是Java21,在安装目录 Java\jdk-21\conf\security下找到java.security文件,用记事本打开,搜索TLSv1,大概在752行的位置有如下配置信息:jdk.tls.disabledAlgorithm......
  • Nginx第四天学习笔记
    Nginx第四天学习笔记在经过了前几天的学习后,我们对Nginx已经有了一个基本的了解。今天我们将更深入地探讨Nginx的配置和优化。一、配置Nginx的配置文件位于/etc/nginx/nginx.conf。这个文件包含了Nginx服务器的主要配置信息,包括端口、域名、SSL证书等。以下是一个简单的配置示例:per......
  • 使用Nginx搭建负载均衡
    1.修改配置文件conf/nginx.conf      2.配置文件中增加服务调用upstreamNET6RC2{server127.0.0.1:5726;server127.0.0.1:5727;server127.0.0.1:5728;server127.0.0.1:5729;}server{......
  • Nginx第三天学习笔记
    Nginx第三天学习笔记在经过前两天的初步学习和了解之后,今天我们继续深入探讨Nginx的配置和高级功能。一、更复杂的配置到目前为止,我们讨论的Nginx配置都比较基础。实际上,Nginx的配置语言非常强大,可以处理更复杂的需求。例如,我们可以配置基于IP的虚拟主机,设置HTTPS,甚至可以进行负载......
  • Linux网站搭建(nginx+php+mysql)
    目录nginx安装nginx服务器依赖环境源码安装和yum安装的区别源码安装源码安装三步走:php下载安装所有扩展:(php运行所需要的环境)编辑/etc/php.ini开启php-fpm在html下创建index.php,看一下是否可以网页中访问得到它编辑nginx配置文件重启服务mysql安装mysqlmysql的使用......
  • 本科留学专业不喜欢成绩不够无法毕业拿学位的解决办法
    本科留学专业不喜欢成绩不够无法毕业拿学位的解决办法高中毕业就独自出国留学,从心里承受上来说本身就是一件不容易的事情。重新开始适应生活和学习环境所分散的精力,让学生在留学期间遇到的考试挂科、出勤率低、GPA低等等导致不能毕业的现象越来越多。有的时候成绩跟不上,并非只是学......
  • Nginx 安装
    Nginx安装版本区别常用版本分为四大阵营Nginx开源版:nginxnewsNginxplus商业版:AdvancedLoadBalancer,WebServer,&ReverseProxy-NGINXopenresty:OpenResty®-开源官方站Tengine:简介-TheTengineWebServer(taobao.org)安装Nginx安装环境yumi......