专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

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

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

鲁迅故里和沈园会去绍兴旅游,80以上的原因是因为鲁迅先生,第一次听说绍兴也自然是因为它是鲁迅先生的故乡,因为阿Q闰土和孔乙己,知道了鲁迅的小说集呐喊,因为无福可祝的祥林嫂知道了鲁迅的短篇小说祝福不出国就能抵达巴厘岛,一户一私汤引爆你的开年第一泡!入冬之后,泡温泉就成了大家口中的高频词。最近有朋友留言想要浙江附近的温泉酒店推荐。千呼万唤始出来,今天就给大家梳理了一下浙江地区的温泉度假区和酒店,全是天然真温泉,可不是烧出来的锅世事一场大梦,人生几度秋凉2022年,似乎就注定是个极度不平凡之年。它有太多的核酸,有太多的心酸,有太多的愤懑,有太多的悲伤就仿佛,2022这几个数字,都带着刀割的声音。抗疫三年,我们不能忘记国家的护佑抗疫为什么我们都喜欢八卦,谣言传播得更快?我们都喜欢八卦过去我们都觉得,大家喜欢八卦,是因为好多八卦里都带有禁忌信息。比如,明星出轨两口子吵架明星酒驾,这类八卦受关注,是因为这些事,都在一定程度上违背了社会的公序良俗。这是古人早就发现世界是虚拟的?人生如梦背后,生活也许只是一场梦我们生活的这个世界,到底是真实的,还是一个虚拟世界?这是一个细思极恐的问题,如果不刻意去思考,那所有人都会觉得我们生活在一个很真实的世界,一切都真实到不能再真实,掐一下自己会疼,打冬季续航测试,小姐姐喜欢的欧拉闪电猫,真实续航能有多少?随着新能源车变得越来越主流,如今关注新能源用车问题的消费者也是越来越多,特别是在冬季用车的情况下,你续航打几折已经成为了不少新能源车主之间打招呼的方式,可见冬季用车的真实续航大家都杜兰特有些人只是喜欢看比赛,有些人是真正的球迷篮网前锋凯文杜兰特近日接受了ESPN专访。节选如下在经历了这个夏天之后,你是否认为自由球员市场吸引了太多的关注度?杜兰特NBA已经存在了很长时间,常规赛对于真正的篮球迷来说,他们喜最中意的文案是什么?1。人生的曲折,就像没有泡开的泡面2。众口难调,不管你怎么做,总有人会有不同的质疑。所以做好自己,开心就好。3。比起态度的表达,更重要的是真知的积累。比起随便地接受,更重要的是坚定文案闲言碎语太吵了你别听捂住耳朵往前走做自己1去阅书,去越山,去悦己,槿花一日自为荣。2你啊,是父母捧出来干净本分的女孩子,你就温温柔柔,不需要和任何人比,世界不会再有第二个你,做自己吧,总有人因为是你所以爱你。3你不是选择浙江宁波这两大网红老街,风格相似却都很红火,你更喜欢哪一个?原本计划去绍兴寻找风景,因为某些原因没有成行,顺便去了南塘老街转了一圈。我来的时候是早上八点钟左右,老街上还没有游客,显得很冷清。看着有些逼仄的街道,我突然想起了东钱湖畔的韩岭老街亲,你有护照吗?疫情防控政策调整,沉寂了三年的全国旅游市场开始呈现复苏态势,特别是最近临近春节假期,大家出行的热情日渐高涨。从元旦假期的出行数据,就能得到印证。据媒体报道,作为疫情防控放开后的首个
孩子厚厚的近视镜片,大部分来自于父母的拖延和盲目!孩子厚厚的近视镜片,大部分来自于父母的拖延和盲目!前言没有好视力,再美好的事物也会离我们远去。理念普及戴眼镜10年,她说她的近视历程是这样的上课看不清黑板发现眯眼能看清眯着眼睛看了高速公路智能化维护,多点布局智慧交通车路协同随着智能交通科技和产业的发展,我国正在形成一个安全可靠便捷高效绿色智能开放共享的现代化综合交通运输体系。十四五现代综合交通运输体系发展规划明确提出,加快智能技术深度推广应用,坚持创游戏巨头动视暴雪被罚3500万美元美国证券交易委员会(SEC)周五宣布,视频游戏开发商动视暴雪同意支付3500万美元的罚款,以解决对该公司未能维持工作场所不当行为投诉有关的披露程序,以及违反举报人保护规则的指控。动12306界面简陋,最终却花费3亿资金,堪称是中国难度最高软件身处21世纪的我们正在经历的是一个信息技术高速发展的时代,信息社会的高速发展也伴随着软件行业的不断发展,计算机软件技术不断提高,各国的软件产业也在相互促进中得到了史无前例的高速发展支撑万人规模技术人员高效协作,揭秘京东云行云DevOps平台独到之处当前,随着业务变化的速度越来越快,各类IT系统的建设也越来越复杂,大规模研发团队的管理问题日益突出,如何提升研发效能成为时下各类技术团队面临的重要挑战。2月2日,京东云DevOps中国科大提出热固性材料新型3D打印方法原位双重加热(ISDH)打印热固性材料示意图中国科大供图中新网合肥2月3日电(记者吴兰)记者3日从中国科学技术大学获悉,该校工程科学学院机器人与智能装备所副教授李木军近代力学系特任虚拟现实行业国标即将实施中关村石景山园企业燧光科技参与编制由国家工信部主管,TC242(全国音频视频及多媒体系统与设备标准化技术委员会)具体颁布执行的国家标准计划虚拟现实设备接口定位设备近日获得批准,即将正式实施。相关标准的实施将推动虚拟快手推出新知如师说寒假班,北大名师与行业名家在线授课红网时刻新闻2月3日讯(通讯员沐目)学历史探索过去,看前沿遇见未来。近日,快手教育宣布推出新知如师说寒假班教育公益活动,邀请北大历史系名师和科学科技界名家打造9场精品直播课,带领大消息称EvansHankey离职后,苹果不再继续设立首席设计官角色来源IT之家IT之家2月3日消息,彭博社的马克古尔曼(MarkGurman)在最新文章中表示,在埃文斯汉基(EvansHankey)几个月离职之后,苹果将不再继续设立首席产品设计官以为孩子只是睡眠习惯不好,未加干预,等到发现才后悔莫及我家孩子晚上睡觉经常鼻塞流涕张口呼吸睡觉打鼾等等。一开始这并没有引起我的警惕,以为孩子只是睡眠习惯不好,等到时间久了发现时,腺样体肥大已经很严重了。而且肥大的腺样体不同程度地阻塞后中国工商银行2023年2月份最新存款利率3年期大额存单利率最高中国工商银行2023年2月份最新存款利率3年期大额存单利率最高。很多人都特别关注银行存款的利率,是因为喜欢存钱已经成为了大多数居民的习惯,而存钱的背后,更是对未来美好生活的期待,即
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网