让我们看看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)或者负载上升,但是如果你的网站访问量比较大,为了系统的吞吐量,我还是建议大家关闭它。

最新文章

  1. ubuntu 上安装字体
  2. Ubuntu16.04 安装配置Caffe
  3. docker--buildbot安装
  4. linux可靠信号和非可靠信号测试样例
  5. TextInfo
  6. 高吞吐量的分布式发布订阅消息系统Kafka--安装及测试
  7. Hibernate批处理操作优化 (批量插入、更新与删除)
  8. td也可以溢出隐藏显示
  9. C# Quartz.Net 定时任务的简单使用
  10. [Twisted] transport
  11. TableLayout
  12. 团队工作准则&贡献分配规则
  13. calling c++ from golang with swig--windows dll (四)
  14. 我知道你不知道的负Margin
  15. CentOS中对ext4文件系统做磁盘配额
  16. Windows 10 安装ElasticSearch(2)- MSI安装ElasticSearch和安装Kibana
  17. 自动驾驶系统 bfs
  18. php多线程代码
  19. java_架构与模式
  20. 20155326 2006-2007-2 《Java程序设计》第4周学习总结

热门文章

  1. 用过的一些js函数[备份用的]
  2. mysql 汉字乱码
  3. ARM中MMU地址转换理解
  4. 在EF的code frist下写稳健的权限管理系统:界面设计(四)
  5. 小白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》连载四(场景切换)
  6. [terry笔记]RMAN综合学习之配置
  7. python中读取配置文件ConfigParser
  8. 刀哥多线程之主队列gcd-06-main_queue
  9. AppCan认为,移动APP开发不是技术活
  10. Windows PowerShell ISE