分布式问题系列--惊群
惊群
怎么理解
当你往一群鸽子中间扔一块食物,虽然最终只有一个鸽子抢到食物,但所有鸽子都会被惊动来争夺,没有抢到食物的鸽子只好回去继续睡觉, 等待下一块食物到来。这样,每扔一块食物,都会惊动所有的鸽子,即为惊群。
简单地说:就是扔一块食物,所有鸽子来抢,但最终只一个鸽子抢到了食物。
语义分析:食物只有一块,最终只有一个鸽子抢到,但是惊动了所有鸽子,每个鸽子都跑过来,消耗了每个鸽子的能量。(这个很符合达尔文的进化论,物种之间的竞争,适者生存。)
计算机中的惊群
-
在多进程/多线程等待同一资源时,也会出现惊群。即当某一资源可用时,多个进程/线程会惊醒,竞争资源。这就是操作系统中的惊群。
-
在分布式系统对同一资源进行更新的时候
惊群造成的影响
多进程/线程中:
-
惊醒所有进程/线程,导致n-1个进程/线程做了无效的调度,上下文切换,cpu瞬时增高
-
多个进程/线程争抢资源,所以涉及到同步问题,需对资源进行加锁保护,加解锁加大系统CPU开销
多进程/线程惊群常见分析
accept惊群
epoll惊群
nginx惊群
参考: nginx惊群处理
线程池惊群
在多线程设计中,经常会用到互斥和条件变量的问题。当一个线程解锁并通知其他线程的时候,就会出现惊群的现象。
pthread_mutex_lock/pthread_mutex_unlock:线程互斥锁的加锁及解锁函数。 pthread_cond_wait:线程池中的消费者线程等待线程条件变量被通知; pthread_cond_signal/pthread_cond_broadcast:生产者线程通知线程池中的某个或一些消费者线程池,接收处理任务; 这里的惊群现象出现在3里,pthread_cond_signal,语义上看,是通知一个线程。调用此函数后,系统会唤醒在相同条件变量上等待的一个或多个线程(可参看手册)。如果通知了多个线程,则发生了惊群。
正常的用法:
-
所有线程共用一个锁,共用一个条件变量
-
当pthread_cond_signal通知时,就可能会出现惊群
解决惊群的方法:
- 所有线程共用一个锁,每个线程有自已的条件变量
- pthread_cond_signal通知时,定向通知某个线程的条件变量,不会出现惊群
业务中的惊群
缓存惊群
回想起当年在微博使用的多级cache(php+memcache+redis),memcache是为了节省网络IO做的本地缓存,miss之后从redis读取,数据变化之后会针对key对memcache notify发送消息。
惊群如何避免
总体来说,惊群是由于网络中事件的重复通知造成,从技术侧而言,最简单的方案就是对中间节点进行逻辑处理,避免掉不必要的通知。
各有各的好处,也各有各的弊端,要根据自己的需要选择合适的模式解决
加锁,性能开销
数据版本则会造成传输包成本增大

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
顶会VLDB'22论文解读:多元时序预测算法METRO
摘要:本文提出了一个端到端的MTS预测框架METRO。METRO的核心思想是利用多尺度动态图建模变量之间的依赖关系,考虑单尺度内信息传递和尺度间信息融合。 本文分享自华为云社区《VLDB'22 METRO论文解读》,作者:云数据库创新Lab 。 0 导读 本文(METRO: A Generic Graph Neural Network Framework for Multivariate Time Series Forecasting)是由华为云数据库创新Lab联合电子科技大学数据与智能实验室发表在顶会VLDB‘22的文章,该文章提出了一种的多元时序预测算法METRO。VLDB是CCF推荐的A类国际学术会议,是数据库领域顶级学术会议之一。该论文是云数据库创新LAB在时序分析层面取得的关键技术成果之一。 METRO是基于自注意力机制(self-attention)的深度学习算法。该算法能有效学习历史数据的多种周期性以及提取不同时间线的相关性,为时序预测任务提供更准确的结果,使时序数据库具有强大的分析能力。目前METRO已经作为GaussDB for Influx的时序预测算子在华为云上线...
- 下一篇
ORM 框架 Bee 2021 程序员节日版(1024)发布,增强对嵌入式场景支持
Bee,互联网新时代的Java ORM工具,简单、高效,小巧(311k),开发速度快! V1.9.8.1024(2021 程序员节日版) 只有311k的Bee增强对嵌入式场景支持 可以使用指定路径的bee.properties进行配置. bee.properties可以在jar以外的目录配置。 在V1.9.8虽然有支持整合Spring boot,可以动态更新配置,但对jar大小要求特殊要求的场景,不一定适用。 此次更新,正解决了此问题。 使用实例: 实例中bee.properties放在:D:\temp中。 HoneyConfig.getHoneyConfig().resetBeeProperties("D:\\temp\\"); suid.select(new TestUser()); // 对DB操作的示例 /** * 使用指定路径的bee.properties进行配置. * 若使用第三方框架管理配置,不建议在此处重置配置. * @param filePath bee.properties所在的路径 */ public void resetBeePropert...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7安装Docker,走上虚拟化容器引擎之路
- MySQL8.0.19开启GTID主从同步CentOS8
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程