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

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

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

大寒寄语意念青春能量添大寒寄语意念青春能量添作者凌先有大寒今日节气到大寒,天寒地冻要保健。保护肠胃少刺激,饮食宜早缓淡暖。冬季皮肤多干燥,着装宽松要柔软。行动莫急防摔跤,步伐从容要柔缓。桂皮温肾能消肿,还有2天除夕,中国足球年关难过多队或解散?广州队堪忧!我的生活也是头条距离春节已经越来越近,但中国足球却丝毫没有感受到过年的喜气。足球报记者李璇透露,包括广州队在内的多家俱乐部年关难过,都存在解散的可能性。而在中国足协方面,李铁引发的战争时期大规模使用绑腿,为什么抗美援朝就突然退出了历史舞台?八路军在抗日战争和解放战争时期大规模使用绑腿,到了抗美援朝时期却不用绑腿了。所以好处非常多的绑腿,为什么突然就退出了历史的舞台?你知道吗?之所以绑腿,首先,从生理学的角度说,在行军浅谈明代巡按御史制度的形成与发展我国古代的监察制度,是中华法治文明发展史上具有里程碑意义的创举,是后世法治事业繁荣有序发展的根基,而明代巡按御史制度则是古代监察制度史上充分结合前朝历史经验与当时的政治环境创设的。去有风的地方谢晓春扮演者人称小周迅,受雷佳音影响才开窍去有风的地方的第26集,让人看得眼泪汪汪。许红豆在有风小院的三月租期即将结束,准备回北京。云苗村的老老少少都舍不得温柔美丽许红豆。谢晓春的女儿小葫芦和其他三个小孩,对着许红豆哇哇大从贞观之治到大唐精神公元626年正值大唐武德九年,这一年唐帝国先是发生了兄弟相残的玄武门之变,紧接着又上演了一出儿子逼宫的闹剧,作为开国君主的李渊被太子架空成为太上皇,太子李世民正式登基,成为唐王朝的位列4A景区的小村庄,曾走出59位宰相和59位将军,人称中国宰相村山西自古就是一片不平凡的沃土,承载了太多厚重的历史。都说五千年文明看山西,看的便是泱泱华夏五千年在这片土地上留下的不朽印记。在山西,对比相对热门的大同太原平遥等地,运城是更为小众的梦回大唐!梦幻西游联动西安中国年,剑侠客亮相长安灯会携伴逛灯会,兔神赏花灯梦幻西游与西安曲江新区管委会文化和旅游局灯火耀长安梦幻中国年梦幻新春灯会活动,在1月14日小年夜正式开启后,玩家和游客络绎不绝。剑侠客作为新任的西安曲江旅游特荆楚国宝表情包上线,Get拜年新姿势!它来了!它来了!农历癸卯兔年就要来了!春节临近之际湖北省博物馆联手长江云送上一份新春贺礼2023年春节荆楚国宝表情包拜年送福,群聊斗图一套表情包轻松拿下!animateanimat誓死效忠秦国的蒙家军,秦朝灭亡后去了哪里?结局如何?一国的将士为国征战,他们的功劳无数,国胜与国同光,国亡与国同葬。他们一直都是一个国家的攻坚力量,听起来辉煌却没几个能善终。蒙家军今天要说起的蒙家军,他们一直是历史爱好者们关注的存在胡杏儿晒儿子萌态,兄弟三人穿唐装摇扇子,扮成公子王孙超可爱1月18日晚上,胡杏儿在社交平台上分享了三个儿子穿着唐装的可爱模样,她附文道看到他们大家想起什么角色呢?预祝大家兔年行大运!老大和老二穿着同款,戴着帽子,像极了两个阿哥,但是他们戴
第一次的母乳能给宝宝吃吗?妈妈送给宝宝的第一份珍贵礼物就是初乳,堪比黄金,近两年在母乳喂养大力科普的形势下,越来越多的妈妈知道了初乳的珍贵,但是仍不排除有些老一辈的家长还存在着误区,比如刚生产完的妈妈奶太少业态新融合出行多花样湖北美丽经济持续升温来源人民网春天,是姹紫嫣红百花齐放的美好季节,也是踏青赏花出门旅游的大好时机。在湖北,樱花油菜花桃花花开似海,城市披彩,吸引四方来客。融观赏游玩生态休闲采摘体验和农耕文化等于一体的2023年3月27日焦点图近日,柳州市近30万株紫荆花热情绽放,给市民和游客带来了一场赏心悦目的视觉盛宴。刘峥摄(广西新闻网广西日报)3月25日,在梧州市玫瑰湖公园,一群白鹭在湖中栖息觅食。近年来,随着该市阜阳的春天,是什么颜色?鸟儿探春。阜阳的春天,是什么颜色?春天是打翻在人间的调色盘在我们不经意间已便是五彩斑斓柳绿梅红梨花白油菜黄当春天与阜阳不期而遇会是怎样的颜色呢?有人说,阜阳的春天是一望无际的绿有人中法半岛小镇将造别样水晶宫长江日报大武汉客户端3月26日讯把水上世界装进水晶宫里,让法国风情触手可及。3月26日上午,总投资22亿元占地343亩的武汉城建开元森泊度假乐园项目在武汉中法半岛小镇集中建设年启动专科快毕业了,是找工作好还是专升本好?这个问题根本不应该放在现在回答,而应该放在三年前。同样的五年,为什么要在专升本上拼,而不试着再复读一年努努力考个本科呢?第一学历跟随你一辈子,就算你以后又考了研究生,你的第一学历依从师范大学出来的就业什么情况?我认为从师范大学毕业的学生就业方向有以下几种第一,最好是通过招考进入中小学当老师,这种一般是有编制的。特别注意,如果想考编当老师,一定要利用好应届毕业生的身份,也就是在你大四这一年失眠吃什么改善最好,最快?感谢邀请。失眠吃什么改善最好,最快?坦白说,临床上,最好的最快的不见得就适合你。作为医生来讲,我们当然希望每一例失眠的个体能够通过自我的调整改善失眠而不是药物,但不得不承认,近年来为什么剖腹产前8小时不给吃东西,水也不能喝呢?我做的算是紧急剖宫产,即使不是预约剖腹产的情况,护士医生也会问,你当天是几点吃的饭几点喝的水,吃了什么。一听我从中午到晚上7点都没吃过饭下午三点后没喝过水,护士松了一口气。通常做计如果买了一家股票持续亏损,但是就是不抛会怎么样?很多散户会面对这样的一个问题,选择一只股票做交易,买入这支股票之后,股票的价格节节下挫,让股民处在套牢的折磨之中,很多股民会选择持股不卖出,死扛等待解套,但这样做一般都会遇到以下几和美乡村迎盛会近年来,海南琼海全力打造博鳌田园小镇,沙美村莫村南强村等村庄逐渐成为兼具国际范与乡土味于一体和美乡村样板,为迎接2023年博鳌亚洲论坛开幕做好准备。这是3月25日拍摄的海南博鳌莫村