范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

一次线程池引发事故带来的思考

  问题
  系统中某个接口响应全部超时,dubbo线程池被全部占满,并堆积了大量待处理任务,整个应用无法响应任何外部请求,处于"假死"的状态,过去几分钟后,应用居然自己自动恢复了。 排查是不是流量暴增引起?排查后台流量监控,发现最近流量很平稳。
  是不是有慢查导致整个应用拖慢?当应用的高QPS接口出现慢查时,会导致处理请求的线程池中(dubbo线程池),大量堆积处理慢查的线程,占用线程池资源,使新的请求线程处于线程池队列末端的等待状态,情况恶劣时,请求得不到及时响应,引发超时。但遗憾的是,出问题的时间段,并未发生慢查。 是不是频繁GC?如果JVM频繁的发生Stop The World,或者停顿时间较长,会一定程度的影响应用处理请求的能力。但是我们查看了GC日志,并没有任何的异常,看来也不是GC异常导致的。 排查日志,发现了一个异常现象,某个平时不怎么报错的接口,在1秒内被外部调用了500多次,此后在那个时间段内,根据traceid这500多次请求产生了400多条错误日志,并且错误日志最长有延后好几分钟的。
  这是怎么回事呢?这里有两个问题让我们疑惑不解: 500QPS完全在这个接口承受范围内,压力还不够。 为什么产生的错误日志能够被延后好几分钟。
  日志中明显的指出,这个http请求Read timed out。http请求中读超时设置过长的话,最终的效果会和慢查一样,导致线程长时间占用线程池资源(dubbo线程池),简言之,老的出不去,新的进不来。带着疑问,我们翻到了代码。
  但是代码中确实是设置了读超时的,那么延后的错误日志是怎么来的呢?我们已经接近真相了吗? 破案
  我们不免对这个RestTemplateBuilder起了疑心,是这个家伙有什么暗藏的设置嘛?针对这个工具类,将线上的情况回放到本地进行了模拟。我们构建了500个线程同时使用这个工具类去请求一个http接口,这个http接口让每个请求都等待2秒后再返回,具体的做法很简单就是Thread.sleep(2000),然后观察每次请求的response和rt。
  我们发现response都是正常返回的(没有触发Read timed out),rt是规律的5个一组并且有2秒的递增。看到这里,大家是不是感觉到了什么?对!这里面有队列!通过继续跟踪代码,我们找到了"元凶"。
  这个工具类默认使用了队列去发起http请求,形成了类似pool的方式,并且pool active size仅有5。
  现在我们来还原下整个案件的经过: 500个并发的请求同时访问了我们应用的某个接口,将dubbo线程池迅速占满(dubbo线程池大小为200),这个接口内部逻辑需要访问一个内网的http接口 由于某些不可抗拒因素,这个时间段内这个内网的http接口全部返回超时 这个接口发起http请求时,使用队列形成了类似pool的方式,并且pool active size仅有5,所以消耗完500个请求大约需要(500/5)*2=200s,这200s内应用本身承担着大约3000QPS的请求,会有大约3000*200=600000个任务会进入dubbo线程池队列(如悬案中的日志截图)。PS:整个应用当然就凉凉咯。 消耗完这500个请求后,应用就开始慢慢恢复(恢复的速率与时间可以根据正常rt大致算一算,这里就不作展开了)。 思考
  到这里,大家心里的一块石头已经落地。但回顾整个案件,无非就是我们工作中或者面试中,经常碰到或被问到的一个问题:"对象池是怎么用的呢?线程池是怎么用的呢?队列又是怎么用的呢?它们的核心参数是怎么设置的呢?"。答案是没有标准答案,核心参数的设置,一定需要根据场景来。拿本案举例,本案涉及两个方面:
  发起http请求的队列
  这个使用队列形成的pool的场景是侧重IO的操作,IO操作的一个特性是需要有较长的等待时间,那我们就可以为了提高吞吐量,而适当的调大pool active size(反正大家就一起等等咯),这和线程池的的maximum pool size有着异曲同工之处。那调大至多少合适呢?可以根据这个接口调用情况,平均QPS是多少,峰值QPS是多少,rt是多少等等元素,来调出一个合适的值,这一定是一个过程,而不是一次性决定的。那又有同学会问了,我是一个新接口,我不知道历史数据怎么办呢?对于这种情况,如果条件允许的话,使用压测是一个不错的办法。根据改变压测条件,来调试出一个相对靠谱的值,上线后对其观察,再决定是否需要调整。
  dubbo线程池
  在本案中,对于这个线程池的问题有两个,队列长度与拒绝策略。队列长度的问题显而易见,一个应用的负载能力,是可以通过各种手段衡量出来的。
  就像我们去餐厅吃饭一样,顾客从上桌到下桌的平均时间(rt)是已知的,餐厅一天存储的食物也是已知的(机器资源)。回到本案,如果我们调低了队列的长度,增加了适当的拒绝策略,并且可以把长时间排队的任务移除掉(这么做有一定风险),可以一定程度的提高系统恢复的速度。
  最后补一句,我们在使用一些第三方工具包的时候(就算它是spring的),需要了解其大致的实现,避免因参数设置不全,带来意外的"收获"。 补充
  线程池的提交过程
  线程池中的线程数小于核心线程数量(corePoolSize)时,开启新线程执行任务 线程数大于等于核心线程数时,将任务提交到队列(workQueue)中 如果队列也满了,就尝试启动非核心线程执行任务 如果已达到最大线程数量(maximumPoolSize),则根据拒绝策略(handler)进行任务拒绝 此后,核心线程会一直阻塞并监听队列中的任务,非核心线程也阻塞监听队列中的任务,但是会在等待固定的时间(keepAliveTime+unit)依然没有任务时,结束等待,销毁线程 AbortPolicy:任务过量,不处理,直接抛异常 CallerRunsPolicy:任务过量,哪来的回哪去,谁把任务给线程池的,就谁去执行,这里是main线程扔给线程池的,因此main线程执行,不抛异常 DiscardPolicy:过量的任务直接放弃,不抛异常 DiscardOldestPolicy:过量的任务会尝试和最早的竞争,不抛异常
  案例分析  Executor executor = new ThreadPoolExecutor(1, 1, 60 * 3, TimeUnit.SECONDS,new LinkedBlockingQueue<>(1), Executors.defaultThreadFactory(),   new ThreadPoolExecutor.CallerRunsPolicy());  executor.execute(线程1);  executor.execute(线程2);  executor.execute(线程3);  r1.stop();  r2.stop();  r3.stop();    线程处理逻辑  while (!stop) {      Thread.sleep(1000L);     if (stop) {         break;     }     System.out.plintln("当前线程:"+Thread.currentThread()) }
  结果:线程1和线程3死循环执行。
  原因:线程1是核心线程,处于循环执行中,线程2放到队列中等待线程1完成,线程3看到队列满,又达到最大线程数,采取拒绝策略,根据CallerRunsPolicy策略要交给主线程执行。由于主线程处于循环逻辑,于是下面stop逻辑执行不到,进而线程1和线程3死循环执行。

2K焊门员上线!红米K60系列爆料汇总全系2K直屏索尼IMX800有一说一,在2K价位,红米K系列是名副其实的焊门员,而且在小米和红米实行双品牌策略后,卢伟冰更是放手一搏,在K系列经常背刺小米数字系列。从K40系列开始,K宇宙就正式成立,围绕K系被雷剧耽误的五位女演员,雷到最后无戏可拍,网友就不该演雷剧摘要被雷剧耽误的五位女演员,雷到最后无戏可拍,网友就不该演雷剧。文萌妹闹太套马京京曾经和金星现场连麦你看我这个胳膊,撕个鬼子没问题!金星则不慌不忙正面回应你的块头再大,也不能手撕鬼网红带火的短裙黑丝,带偏多少普通女孩?廉价感最致命清纯风和性感风作为两大对立审美帮派,可以说是互撕好多年,但是小编个人认为不管是性感风还是清纯风都是我们女性选择的权利,所以我完全中立。但如果仅从风格特质上来讨论,性感风还是会显得比谁说年轻女孩不能穿豹纹?豹纹衣服总给人感觉,需要成熟的女性才能够驾驭。其实,年轻的女孩一样能穿好豹纹衣服,让人有一种野性的小性感。她就是本期主角林真。嘟嘟嘴,柔柔脸,这样的女孩有点不一样。之前介绍了不少亚整容女星前后对比,有的实现了颜值逆袭,可有的越老面部越僵化曾经的演员都是天然的,每一位都美的与众不同,即使长得不够漂亮的,也能凭借自己有特点的容貌被人记住。但是再看现在的女明星,虽然乍一看上去觉得无可挑剔,但是看得多了,就会发现没什么韵味打赌她还会红!不信你看除了李子柒,哪个网红敢豁出去500天?文蓝橙北调距离李子柒最后一次更新,已经有500天了,500天,足以让很多网红迭代更新,为了保留住流量,许多大IP一刻都不敢停。但李子柒似乎成了一个特别的存在,在她停更的500天里,1月份9部剧待播,古装剧占了3部,刘亦菲李现新剧已定档今年寒假提前开始,各大影视平台的假期档已经准备就绪,接下来的一个月预计将会有9部新剧上线,倍感期待。古装剧占3部一直以来,古装剧都是备受观众喜爱的一种影视剧题材,今年的寒假档期也不阿斯茹男友谷智鑫坠马瘫痪后,她痴情照顾8年,未办婚礼成遗憾2013年的一天,阿斯茹接到了兵出潼关剧组的电话。谷智鑫在拍戏的时候,不小心坠马了,病情比较严重,你赶紧过来吧。谷智鑫是阿斯茹谈了四年的男友,拍完这部戏他们就要携手走进婚姻的殿堂。少年歌行热播,89岁游本昌本色出演忘忧大师,一开口就泪目了近日,又一王炸剧开播,这部剧是由李宏毅,刘学义,林博洋等人出演的少年歌行,不少网友之所以看这部剧,并非是奔着男主女主去的,而是奔着老戏骨游本昌才追这部剧的。提起游本昌,给大家的第一近期热播的五部口碑剧,回来的女儿排在第三,你在追哪一部?第五部县委大院豆瓣6。9主演胡歌吴越剧情点评这个片很多地方欲言又止,或者说点到即止。涉及zz,本就无法太直白,所以常常需要细品,方知其味。至于说片子拍的稀碎的,我觉得政府工作和基层今年过节看什么,满江红还是流浪地球2?在经过三年严格的清零政策之后,国内开始逐步放宽对新冠疫情控制的措施,其中包括娱乐场所不再设置核酸检测等相关限制。这意味着电影院将有序开放。事实上,电影业的回暖也真实地在发生。据报道
幼儿园黄金三年做好3件事,孩子小学成绩好,不知道的看这里幼儿园阶段是孩子成长的一个重要阶段,如果家长们能够让孩子抓住这黄金三年,并且陪孩子做好这三件事,那么孩子上了小学之后,学习成绩一般都会名列前茅,再也不需要家长操心了。育儿群里面就有合集!大众日报七篇评论,谈全力推动党的二十大精神在山东落地生根党的二十大,事关党和国家事业继往开来,事关中国特色社会主义前途命运,事关中华民族伟大复兴。11月5日至6日举行的省委十二届二次全会,深入学习贯彻党的二十大和二十届一中全会精神,审议新华全媒新技术新共识新未来2022年世界互联网大会乌镇峰会观察来源新华网新华社杭州11月11日电题新技术新共识新未来2022年世界互联网大会乌镇峰会观察新华社记者袁震宇于佳欣唐弢千年古镇吹来数字新风,思想激荡拥抱数字未来。以共建网络世界共创数蓬安4A景区龙角山景点附近这栋房子外面的场景,算违建吗?转路经过龙角山,金易叠翠怡园小区附近一栋房屋,忽然就让我感到颇为奇怪,因为该路段两侧都有供群众行走的人行道,唯独到了此处,人行道被不锈钢围栏圈住,直接变成了屋主种花种树堆放杂物的场百度首发时空数智中台,助力智能交通与智慧城市创新发展花朵财经11月11日,在成都举行的第十七届中国智能交通年会上,聚焦智能交通与智慧城市融合发展,百度首次发布时空数智中台,致力于挖掘地理信息的时空及大数据价值,服务智慧城市智能交通数再添一城!7个城市,谋划第二机场11月财经新势力作者子非鱼01多个中心城市谋划第二机场在谋划第二机场的路上,又多了一个城市,南京。南京在不久前发布的南京市国土空间总体规划(20212035年)草案中明确提出瞄准国徐向春2023年中国钢铁需求或逐渐企稳,中长期需求无虞2022年11月11日,由全联冶金商会和中国金属材料流通协会指导,河北新金万利新材料科技有限公司西王特钢有限公司和上海钢联电子商务股份有限公司共同主办的2022(第五届)环渤海钢铁如何评价宁波和厦门这两个城市从规模来看,2021年宁波的GDP14594。9亿元,厦门是7033。9亿元,宁波是厦门的2。07倍。从财政收入来看,宁波3264。4亿元,厦门1530。21亿元,宁波是厦门的2。从资本宠儿沦为弃子!属于蔚小理的时代正逐渐落幕新能源汽车行业赛程进入中段,二线造车新势力迎头赶上,传统车企业集中发力,造车江湖座次改写,造车三巨头蔚小理正一步步从资本宠儿沦为弃子,属于蔚小理的时代正逐渐落幕。01hr2014年HIFI音箱的双线分音全攻略玩法,追求最极致声音的音箱高阶乐趣双线分音是音箱的线材玩法,玩线材的都是老烧,为了追求最极致的听觉享受。对于线材对音质的提升功效一直都有两种声音,而且对立严重,小编是以一个平和的心态去看待这个事情,玩音响本身是一个加注中国!宝马百亿项目落地沈阳据央视新闻联播,宝马宣布再投资100亿元人民币扩建其沈阳动力电池生产基地,以提速其电动化发展。这是继6月里达工厂后的又一笔重大投资,再次证明宝马对中国市场的坚定信心。11月4日,第