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

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

  问题
  系统中某个接口响应全部超时,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死循环执行。

先是华为再是中兴,相继撕下联想遮羞布,核心技术才是硬道理文Dong审核子扬校正知秋对于一众科技企业而言,想要在当下立足,需要不断提升自身的核心竞争力。而综合来看各大企业的核心竞争力,技术创新以及核心技术的掌握才是硬道理。这也是为何全球科自然分娩好处多如果你和宝宝无异常情况,请尽量选择自然分娩,最自然的方式迎接宝宝的到来。1避免了手术风险,住院时间短。2创口小,新妈妈身体恢复快。3有利于母乳喂养成功。4有助于促进性生活,呼吸神经顺其自然,天宽地阔大自然的力量很强大。冬去春来,秋收冬藏,每个节气都有条不紊的准时上场,不推不搡,顺其自然,合乎规律。你方唱罢我登场一切安然有序却又一片繁荣,生机勃勃!顺其自然的力量,总会让一量拨千母爱如此伟大,为何毒字下面是一母字,造字人有何用意?如果问世界上什么爱最伟大?答案无疑是母爱。母亲无私地将我们带到这个世界,给了我们温暖,呵护我们成长女子本柔弱,然母爱却无比坚强,为了孩子不受到一丝一毫的伤害,哪怕再软弱的母亲,都会人生繁华,平淡最真人生路上,每一步有每一步的风景每一程有每一程的感悟每一帧有每一帧的色彩。但不论时光如何流转,岁月如何变换,最真与最淡的事物永远不会改变。有人曾说,生活到极致一定是简和静,美到极致一70年毛主席专列列车长找到张玉凤你先放下手中工作,快去中南海张玉凤前言张玉凤是毛主席晚年最信任的人,他甚至将自己的私人保险柜钥匙,交给张玉凤保管。毛主席的私人保险柜里,有支票存折绝密文件等等。所以,这个钥匙,在一些人眼中可是无价之宝。可见毛西部最新积分榜勇士独享第一,湖人跌至第十,5队争状元一天比赛日过去后,西部积分榜又发生了一些变化,我们一起来看一看。勇士120107击败火箭,豪取4连胜,战绩来到8胜1负,继续独享西部第一,同时也是联盟第一。库里表现马马虎虎,16投中年人的自律,就是这3件小事自律,是把握命运的前提,也是解决苦恼的途径。人到中年,更是如此。得过且过的安逸,只会浪费光阴,拖垮自己。在自律当中不断精进,才能治愈焦虑,获得内心的充实和平静,迎来精彩的人生。中年小诗十首苦苣菜小诗十首苦苣菜作者张利红1。寒衣节给您买了别墅是您喜欢的风格青砖,黛瓦,篱笆,小花给您买了棉衣是您喜欢的色调安静,清雅还有冰箱,电视,沙发,车马在世上买不起的,舍不得买的统统买下了冬初里中年那些别样的风花雪月昨夜的那场风花雪月,酝酿了很久很久,从夏到秋,又从秋到冬,在这冬头,在这立冬第一天,也算是一场风花雪月的面对吧。无论季节如何轮换世事如何变迁,我们都在用不同的心情在面对一场场风花雪自信是成功的柱石自信自信换句话说它叫志在必得!满怀信心哪怕无论是在多么的大型场合与人交流都毫不动摇,不会经意别人的观点。自信什么叫满怀信心自信,是民用对温馨所做各种预备的神志评估。相信友好行,是一
羊了个羊,背后套路被彻底拆解来源今日互联网大事件最近网上闹得沸沸扬扬的两大骗子,不知道你们中招了没。一个是易联购低价在网上小程序卖新的iPhone14新款手机,比官网便宜500到1000元一部。然后一堆网友顾20分钟超级快充,200kmh时速,中国设计师设计的特斯拉ModelZ百公里加速仅耗时3。5秒,最大续航280km。从去年到今年,以特斯拉为主题的设计概念车型我们看了不少。但既紧扣未来主义主题审美又不陈腐,且又能将车辆性能配备等方方面面都考虑到位的作ROG游戏手机6天玑版发布跑满60Hz高画质原神最低仅33。6对于科技数码圈来讲,9月历来都是智能手机行业最受关注的月份,很多顶尖大厂都喜欢在这期间推出新品。而就在9月19日下午,知名电竞外设品牌ROG正式推出了ROG游戏手机6天玑系列,其中面对太空天气,我们必须依靠运气,因为很难预测太空天气很难预测只有一个小时可以防止地球上的灾难。沙丘般的北极光太阳风和地球大气的相互作用产生了在夜空中翩翩起舞的北极光。(图片来源格雷姆威普斯)MartinGerardConno愈演愈烈,低速电动车乱象根治难日前,第18届中国(济南)新能源汽车电动车展览会在山东国际会展中心隆重举行。推广新能源汽车固然是好事,不过这个以新能源电动车智领未来为主题的展览会似乎并不简单。这个展览会打着新能源地位与格局领导干活叫以身作则,富人干活叫体验生活,穷人干活叫混吃混喝。领导发脾气叫重视,富人发脾气叫威风,穷人发脾气叫犟驴。领导喝醉了叫微醺,富人喝醉了叫酩酊,穷人喝醉了叫死狗。领导说话叫指这首诗,像光一样,救赎了我生活中,你是否也有过像这样的经历?有的时候,明明自己付出了很多,可到最后换来的却是他人的,不理解和质疑。有的时候,明明你很爱一个人,可是在生活的道场里,有很多的事,总是让你事与愿违不使用来路不明的充电宝这些网络安全知识点你需要知道最近,以网络安全为题材的网络剧你安全吗正在热播中,其中涉及网络安全的知识点引发关注。片中,演员们会在每集结尾亲身讲解各种网络安全案例。比如,从使用共享充电宝的安全性到一张照片背后的人过五十,命里的祸福,是有定数的人生在世命也运也布大道于天下施善念于人心虽无修行身亦是修行人洞明修行苦方开修行门众生之相老话常言祸兮福所倚,福兮祸所伏!人生一世,总是不知道明天与意外谁先来。9月18日,贵州客车的买i9款华为MateBook16s的人,需要的是什么?HUAWEIMateBook16s虽然不是华为最旗舰的笔记本产品,但绝对算得上是华为迄今性能最好的一款轻薄式笔记本。它用的是第12代IntelCore平台,有三个处理器版本可选,i梁安琪的隐形财富有多少?在澳门有160亩地,还将建成豪华度假村赌王四太太梁安琪的财富到底被低估多少呢?在何鸿燊家族的分家中,梁安琪看似是最大的输家。因为梁安琪分到了澳娱公司股份最少。澳娱公司是澳博控股的大股东,同时澳娱在澳门还控制了非常多的资