Nginx的accept_mutex配置分析

让我们看看accept_mutex的意义:当一个新连接到达时,如果激活了accept_mutex,那么多个Worker将以串行方式来处理,其中有一个Worker会被唤醒,其他的Worker继续保持休眠状态;如果没有激活accept_mutex,那么所有的Worker都会被唤醒,不过只有一个Worker能获取新连接,其它的Worker会重新进入休眠状态,这就是「惊群问题」。

Nginx缺省激活了accept_mutex,也就是说不会有惊群问题,但真的有那么严重么?实际上Nginx作者Igor Sysoev曾经给过相关的解释

 OS may wake all processes waiting on accept() and select(), this is called thundering herd problem. This is a problem if you have a lot of workers as in Apache (hundreds and more), but this insensible if you have just several workers as nginx usually has. Therefore turning accept_mutex off is as scheduling incoming connection by OS via select/kqueue/epoll/etc (but not accept()).

简单点说:Apache动辄就会启动成百上千的进程,如果发生惊群问题的话,影响相对较大;但是对Nginx而言,一般来说,worker_processes会设置成CPU个数,所以最多也就几十个,即便发生惊群问题的话,影响相对也较小。

假设你养了一百只小鸡,现在你有一粒粮食,那么有两种喂食方法:

  • 你把这粒粮食直接扔到小鸡中间,一百只小鸡一起上来抢,最终只有一只小鸡能得手,其它九十九只小鸡只能铩羽而归。这就相当于关闭了accept_mutex。
  • 你主动抓一只小鸡过来,把这粒粮食塞到它嘴里,其它九十九只小鸡对此浑然不知,该睡觉睡觉。这就相当于激活了accept_mutex。

可以看到此场景下,激活accept_mutex相对更好一些,让我们修改一下问题的场景,我不再只有一粒粮食,而是一盆粮食,怎么办?

此时如果仍然采用主动抓小鸡过来塞粮食的做法就太低效了,一盆粮食不知何年何月才能喂完,大家可以设想一下几十只小鸡排队等着喂食时那种翘首以盼的情景。此时更好的方法是把这盆粮食直接撒到小鸡中间,让它们自己去抢,虽然这可能会造成一定程度的混乱,但是整体的效率无疑大大增强了。

Nginx缺省激活了accept_mutex,是一种保守的选择。如果关闭了它,可能会引起一定程度的惊群问题,表现为上下文切换增多(sar -w)或者负载上升,但是如果你的网站访问量比较大,为了系统的吞吐量,我还是建议大家关闭它。

时间: 2024-10-09 17:49:32

Nginx的accept_mutex配置分析的相关文章

nginx 基本配置分析

最近由于项目需要 在搭配LNMP 环境时对nginx得一些配置不够熟练, 写下来做做笔记. nginx.conf -- user xxx;  此处配置为nginx 得运行用户, 一些默认为nobady, 建议另创建一个用户 例如: nginx, 以这个用户运行nginx, 最好不要直接用root, 虽然这样做得话可能之后不会存在太大得权限问题, 不过这么做得话可能对这个服务的安全性产生威胁: worker_processes  为nginx 开启的进程数 , 根据官发说法,开启多个可以减少IO负

nginx一些参数配置详解

nginx的配置:    正常运行的必备配置:       1.user username [groupname];           指定运行worker进程的用户和组       2.pid /path/to/pidfile_name nginx的pid文件 3.worker_rlimit_nofile #;            一个worker进程所能够打开的最大文件句柄数:       4.worker_rlimit_sigpending #;            设定每个用户能够

手把手教你nginx基础安装配置

手把手教你nginx基础安装配置! 一.Nginx安装及简单配置: 安装环境和依赖的包: #yum groupinstall "developmenttools" "server platform development" # yum -yinstall pcre-devel #yum install openssl-devel 下载相关nginx源码包: #wgethttp://nginx.org/download/nginx-1.6.2.tar.gz 解压缩源码

初探nginx架构以及配置

1.nginx特性以及功能 2.nginx的架构及工作过程 3.nginx作为web服务器的配置 一.nginx特性以及功能 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用.其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用ngin

Nginx性能优化配置(三)

Nginx性能优化配置(三)  本文主要介绍Nginx的性能优化配置,文章的层次架构如图所示. 1.Nginx的工作进程优化 1.worker_processes 作用:worker进程的数量:通常应该等于小于当前主机的cpu的物理核心数:auto表示根据CPU的物理核心数自动调整工作进程数.使用lscpu或或者cat /proc/cpuinfo | grep 'processor' | wc -l 可以查看CPU的物理核心数. 配置:worker_processes auto: 配置段:mai

LINUX——关于nginx的安装配置以及如何简易的使用

nginx是linux中非常重要的一部分,学会使用将不可少的.关闭防火墙 [[email protected] ~]# systemctl stop firewalld [[email protected] ~]# systemctl disable firewalld [[email protected] ~]# sed -ri 's/(SELINUX=).*/\1disabled/g' /etc/selinux/config [[email protected] ~]# setenforce

nginx反向代理配置里的location 反斜杠用法

两台nginx服务器 nginx A: 192.168.1.48 nginx B: 192.168.1.56 一. 测试方法 在nginx A中配置不同的规则,然后请求nginx A: http://192.168.1.48/foo/api 观察nginx B收到的请求,具体操作是查看:'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']; 二. 测试过程及结果 案例1 nginx A配

centos LNMP第二部分nginx、php配置 第二十四节课

centos  LNMP第二部分nginx.php配置  第二十四节课 上半节课 下半节课 f

Nginx(九)-- Nginx实际使用配置

1.由于在nginx中需要配置很多东西,就会使得nginx.conf配置文件过于臃肿,所以我们会将配置文件合理的切分.大体的配置依然在nginx.conf中,其他的配置会放在etc下面的目录中. 2.etc文件中一般是放置配置文件的,所以 在 etc 中新建目录 mkdir -p /etc/nginx/conf.d cd /etc/nginx/conf.d 创建一个文件:vim virtual.conf  ,创建一个虚拟主机配置文件 3.将nginx.conf中 注释掉的配置 全部删除掉,并将