转:Nginx的accept_mutex配置

一般多数人不会注意Nginx的accept_mutex配置,不过实际上它对系统的吞吐量有必定的影响。php

 

  1. events { 
  2. accept_mutex off; 

 

 

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

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()).this

简单点说:Apache动辄就会启动成百上千的进程,若是发生惊群问题的话,影响相对较大;可是对Nginx而言,通常来讲,worker_processes会设置成CPU个数,因此最多也就几十个,即使发生惊群问题的话,影响相对也较小。.net

另:高版本的Linux中,accept不存在惊群问题,不过epoll_wait等操做还有。code

xml

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

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

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

此时若是仍然采用主动抓小鸡过来塞粮食的作法就过低效了,一盆粮食不知何年何月才能喂完,你们能够设想一下几十只小鸡排队等着喂食时那种翘首以盼的情景。此时更好的方法是把这盆粮食直接撒到小鸡中间,让它们本身去抢,虽然这可能会形成必定程度的混乱,可是总体的效率无疑大大加强了。get

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

相关文章
相关标签/搜索