• 2、惊群现象


    参考文献有

    1:https://blog.csdn.net/russell_tao/article/details/7204260 

    2:https://www.jianshu.com/p/8f362e943e56

    什么是“惊群”?

    多线程/多进程(linux下线程进程也没多大区别)等待同一个socket事件,当这个事件发生时,这些线程/进程被同时唤醒,就是惊群。可以想见,效率很低下,许多进程被内核重新调度唤醒,同时去响应这一个事件,当然只有一个进程能处理事件成功,其他的进程在处理该事件失败后重新休眠(也有其他选择)。这种性能浪费现象就是惊群。
    -------------------------------------

    举一个很简单的例子,当你往一群鸽子中间扔一块食物,虽然最终只有一个鸽子抢到食物,但所有鸽子都会被惊动来争夺,没有抢到食物的鸽子只好回去继续睡觉, 等待下一块食物到来。这样,每扔一块食物,都会惊动所有的鸽子,即为惊群。

    ------------------------------------

    造成的后果:

    1)系统对用户进程/线程频繁的做无效的调度、上下文切换,系统系能大打折扣。
    2)为了确保只有一个线程得到资源,用户必须对资源操作进行加锁保护,进一步加大了系统开销。
    ------------------------------------
    对于惊群效应的场景描述,最常见的就是对于socket操作符的accept操作的描述。当多个用户进程/线程同时监听同一个端口时,由于实际上一个请求过来,只有一个进程/线程accept成功,所以就会产生惊群效应。
    -----------------------------------------
    linux解决方式:
    线程池通知改变方式,有空闲线程则通知某一个;没空闲则广播(谁先完给谁,如果同时完成,那么又惊群了)。
    ----------------------------------------
    nginx是怎么处理惊群

    同一时刻只允许一个nginx worker在自己的epoll中处理监听句柄。它的负载均衡也很简单,当达到最大connection的7/8时,本worker不会去试图拿accept锁,也不会去处理新连接,这样其他nginx worker进程就更有机会去处理监听句柄,建立新连接了。而且,由于timeout的设定,使得没有拿到锁的worker进程,去拿锁的频繁更高。(没懂)

  • 相关阅读:
    将项目发布到多台服务器并解决高并发
    Nginx 反向代理和负载均衡
    Nginx的基本理论
    图片上传功能(EasyUI前台框架+SSM框架)
    错误:Eclipse老是出现 updating error reports database
    JPA
    Java中 @override 报错
    SpringBoot常用注解
    SpringBoot学习:整合shiro(rememberMe记住我后自动登录session失效解决办法)
    SpringBoot学习:整合shiro(rememberMe记住我功能)
  • 原文地址:https://www.cnblogs.com/westlife-11358/p/10469486.html
Copyright © 2020-2023  润新知