实际项目中,我们有很多高并发的场景需要考虑、设计,在高并发领域有个很有特点的名词叫惊群效应,你了解吗?

一、啥是惊群效应

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

也就是说,虽然只扔了一块实物,但是惊动了整个鸽群,最后只有一个鸽子抢到食物了,浪费了其他鸽子的能量。

二、惊群导致的问题

对于操作系统来说,多个进程/线程在等待同一资源是,也会产生类似的效果,其结果就是每当资源可用,所有的进程/线程都来竞争资源,造成了资源的浪费。

  1. 系统对用户进程/线程频繁的做无效的调度、上下文切换,系统系能大打折扣。
  2. 为了确保只有一个线程得到资源,用户必须对资源操作进行加锁保护,进一步加大了系统开销。

三、常见的惊群场景

1、linux惊群

linux中惊群主要是accept惊群和epoll惊群。

1)accept惊群,以多进程为例,在主进程创建监听描述符listenfd后,fork()多个子进程,多个进程共享listenfd,accept是在每个子进程中,当一个新连接来的时候,会发生惊群。

2)epoll惊群分两种,一是在fork之前创建epollfd,所有进程共用一个epoll;二是在fork之后创建epollfd,每个进程独用一个epoll。

epoll惊群和accept惊群类似,共享一个epollfd, 加锁或标记解决。在新的linux内核版本中都已得到解决。

2、nginx惊群

在nginx中使用的epoll,是在创建进程后创建的epollfd。因些会出现类似linux的惊群问题。即每个子进程worker都会惊醒。

nginx使用了互斥锁来解决惊群的问题

  • 采用了主动的方法去把监听描述符放到epoll中或从epoll移出。
  • 采用互斥锁去解决谁来accept问题,保证了同一时刻,只有一个worker接收新连接(所以nginx并没有惊群问题)。
  • 根据自已的载负情况,决定去不去抢锁,简单方便地解决负载,防止进程因业务太多而导致所有业务都不及时处理。

3、线程池惊群

多线程设计中,经常会用到互斥和条件变量的问题。当一个线程解锁并通知其他线程的时候,就会出现惊群的现象。

  1. pthread_mutex_lock,线程互斥锁的加锁及解锁函数。
  2. pthread_cond_wait,线程池中的消费者线程等待线程条件变量被通知。
  3. pthread_cond_signal,生产者线程通知线程池中的某个或一些消费者线程池,接收处理任务。

这里的惊群现象出现在3里,pthread_cond_signal,语义上看,是通知一个线程。调用此函数后,系统会唤醒在相同条件变量上等待的一个或多个线程(可参看手册)。如果通知了多个线程,则发生了惊群。

1)一般用法,

  • 所有线程共用一个锁,共用一个条件变量。
  • 当pthread_cond_signal通知时,就可能会出现惊群

2)解决惊群的方法,

  • 所有线程共用一个锁,每个线程都有自己的条件变量。
  • pthread_cond_signal通知时,定向通知某个线程的条件变量,不会出现惊群。

好了,惊群效应大体了解了吧。惊群有不同的场景和解决方案,在高并发场景下,需要做适当考虑哦。

系统通知并发问题_玩转Java高并发?请先说明下并发下的惊群效应相关推荐

  1. 玩转Java高并发?请先说明下并发下的惊群效应

    实际项目中,我们有很多高并发的场景需要考虑.设计,在高并发领域有个很有特点的名词叫惊群效应,你了解吗? 一.啥是惊群效应 啥叫惊群效应,有个例子说明的很透彻.当你往一群鸽子中间扔一块食物,虽然最终只有 ...

  2. java unsafe获取指针_【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

  3. JAVA高并发的三种实现 Java高并发,如何解决,什么方式解决

    提到锁,大家肯定想到的是sychronized关键字.是用它可以解决一切并发问题,但是,对于系统吞吐量要求更高的话,我们这提供几个小技巧.帮助大家减小锁颗粒度,提高并发能力. 初级技巧-乐观锁 乐观锁 ...

  4. mysql 高并发 优惠券_转 mysql处理高并发,防止库存超卖

    今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过:但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识.今天就我的一些理解,整理一下 ...

  5. java queue 线程安全_详解Java高并发——设计线程安全的类

    前言: 将现有的线程安全的组件组合为更大规模的组件或程序. 通过使用封装技术可以使得在不对整个程序进行分析的情况下就可以判断一个类是否是线程安全的. 一. 基本要素 1. 找出对象状态的所有变量 如果 ...

  6. java程序实现按并发数收费_java-实战java高并发程序设计-ch3JDK并发包

    JDK 并发包 3.1 多线程的同步协助:同步控制 3.1.1 synchronized 扩展功能:重入锁 jdk1.5之前重入锁ReentrantLook性能好于synchronized, 但jdk ...

  7. cpu高 thread vm_阿里大佬总结,Java高并发必读!

    作者:wxdoop 原文:https://blog.csdn.net/qq_36235098 来源:前程有光 前言 进程是计算机中程序关于某几何数据集合上的一次运行活动,是系统进行资源分配和调度的基本 ...

  8. 《实战Java高并发程序设计》读后感

    写在前面无关的内容 白驹过隙,看下日历已经毕业4年多,加上在大学里的4年,算算在计算机界也躺了八年,按照格拉德韦尔的1万小时定律差不多我也该成为行业的专家了,然后并没有.当看着"什么是Jav ...

  9. java高并发系列 - 第3天:有关并行的两个重要定律

    java高并发系列第3篇文章,一个月,咱们一起啃下java高并发,欢迎留言打卡,一起坚持一个月,拿下java高并发. 有关为什么要使用并行程序的问题前面已经进行了简单的探讨.总的来说,最重要的应该是处 ...

最新文章

  1. python多线程的几种方法
  2. 【SM2证书】利用BC的X509v3CertificateBuilder组装X509国密证书
  3. killall 后面信号_五个你可能不了解的killall选项
  4. BizTalk开发系列(九) MAP的连接方法
  5. vue 给取data值_web前端教程分享Vue相关面试题
  6. 判断个十百千位之后是否大于20 java——CSDN博客
  7. EBS业务学习之应付INVOICE类型
  8. ComponentName知识
  9. 程序员真是一门苦差事!
  10. 富文本常用封装(NSAttributedString浅析)
  11. mysql必需记住的语句_关于MySql的语句
  12. Ubuntu16.04刷机+装驱动
  13. Linux禁用文件可执行权限
  14. 华为交换机冗余链路(VRRP)和vlan负载均衡
  15. Ansys-结构动力学分析-悬臂梁模态分析学习收获
  16. 十二种人生感悟(转贴)
  17. 水果店的售价应该怎么来定,水果店怎样确定价格
  18. 【漆学军】分享一个自定义K线的指标的源码
  19. 如何群发邮件,5秒帮你搞定
  20. 视觉显著性 matlab,转载图像/视觉显著性检测技术发展情况梳理(Saliency Detection、Visual Attention)...

热门文章

  1. Jquery DataTable基本使用
  2. PHP不同域名cookie共享(单点登录实现原理)
  3. sqlserver存储过程循环写法
  4. jquery实现回车键触发事件
  5. 详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名
  6. 如何在一天内被Google和百度收录
  7. 就业模拟试题1_答案
  8. Ice-3.5.1在CentOS 6.5系统中的编译配置教程
  9. Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!
  10. 《大型网站技术架构》读书笔记之七:随需应变之网站的可扩展架构