接口耗时2000多秒!我人麻了!

news2024/11/28 2:34:08

接口耗时2000多秒!我人麻了!

  • 前几天早上,有个push服务不断报警,报了很多次,每次都得运维同学重启服务来维持,因为这个是我负责的,所以我顿时紧张了起来,匆忙来到公司,早饭也不吃了,赶紧排查!

1、 现象与排查步骤:

下面是下午时候几次告警的截图:

  • 来看下图。。。。接口超时 2000多秒。。。。我的心碎了!!!人也麻了!!!脑瓜子嗡嗡的。。。
  • image.png
  • 另外还总是报pod不健康、不可用 这些比较严重的警告!
  • image.png

我的第一反应是调用方有群发操作,然后看了下接口的qps 貌似也不高呀!也就 9req/s, 之后我去 grafana 监控平台 观察jvm信息发现,线程数量一直往上涨,而且线程状态是 WAITING 的也是一直涨。

如下是某一个pod的监控:

image.png image.png

为了观察到底是哪个线程状态一直在涨,我们点进去看下详情:

image.png

上图可以看到 该pod的线程状态图 6种线程状态全列出来了, 分别用不同颜色的线代表。而最高那个同时也是14点以后不断递增那个是蓝线 代表的是 WAITING 状态下的线程数量。

通过上图现象,我大概知道了,肯定有线程是一直在wait无限wait下去,后来我找运维同学 dump了线程文件,分析一波,来看看到底是哪个地方使线程进入了wait !!!

如下 是dump下来的线程文件,可以看到搜索出427个WAITING这也基本和 grafana 监控中状态是WAITTING的线程数量一致

image.png

重点来了(这个 WAITING 状态的堆栈信息,还都是从 IOSPushStrategy#pushMsgWithIOS 这个方法的某个地方出来的(151行出来的)),于是我们找到代码来看看,是哪个小鬼在作怪?

image.png 而类 PushNotificationFuture 继承了 CompletableFuture,他自己又没有get方法,所以本质上 就是调用的 CompletableFuture的 get 方法。 image.png ps:提一嘴,我们这里的场景是 等待ios push服务器的结果,不知道啥情况,今天(指发生故障的那天)ios push服务器(域名: api.push.apple.com )一直没返回,所以就导致一直等待下去了。。

看到这, 我 豁然开朗 && 真相大白 了,原来是在使用 CompletableFutureget时候,没设置超时时间,这样的话会导致一直在等结果。。。(但代码不是我写的,因为我知道 CompletableFuture 的get不设置参数会一直等下去 ,我只是维护,后期也没怎么修改这块的逻辑,哎 ,说多了都是泪呀!)

好一个 CompletableFuture#get();

(真是 死等啊。。。一点不含糊的等待下去,等的天荒地老海枯石烂也要等下去\~\~\~ )

到此,问题的原因找到了。

2、 修复问题

解决办法很简单,给CompletableFuture的get操作 加上超时时间即可,如下代码即可修复: image.png

在修复后,截止到今天(6月8号)没有这种报警情况了,而且线程数和WAITING线程都比较稳定,都在正常范围内,如下截图(一共4个pod): image.png

至此问题解决了\~\~\~ 终于可以睡个好觉啦!

3、 复盘总结

3.1、 代码浅析

既然此次的罪魁祸首是 CompletableFuture的get方法 那么我们就浅析一下 :

  1. 首先看下 get(); 方法 image.png image.png

上边可以看到 不带参数的get方法: if(deadLine==0) 成立 ,也就是最终调用了LockSupport的park(this);方法,而这个方法最终调了unsafe的这个方法-> unsafe.park(false, 0L); 其中第二个参数就是等待多长时间后,unpark即唤醒被挂起的线程,而0 则代表无限期等待。

  1. 再来看下 get(long timeOut,TimeUnit unit);方法 image.png 我们可以看到 带参数的get方法: if(deadLine==0) 不成立,走的else逻辑 也就是最终调用了LockSupportparkNanos(this,nanos);方法,而这个方法最终调了unsafe的这个方法-> unsafe.park(false, nanos); 其中第二个参数就是你调用get时,传入的tiimeOut参数(只不过底层转成纳秒了) 我们跑了下程序,发现超过指定时间后,get(long timeOut,TimeUnit unit); 方法抛出 TimeoutException异常,而至于超时后我们开发者怎么处理,就在于具体情况了。 java Exception in thread "main" java.util.concurrent.TimeoutException at java.base/java.util.concurrent.CompletableFuture.timedGet(CompletableFuture.java:1886) at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2021)

而在 我的另一篇文章 万字长文分析synchroized 这篇文章中,我们其实深入过openjdk的源码,见识过parkunpark操作,我们截个图回忆一下:

image.png

3.2、最后总结:

1.在调用外部接口时。一定要注意设置超时时间,防止三方服务出问题后影响自身服务。

2. 以后无论看到什么类型的Future,都要谨慎,因为这玩意说的是异步,但是调用get方法时,他本质上是同步等待,所以必须给他设置个超时时间,否则他啥时候能返回结果,就得看天意了! 3. 凡是和第三方对接的东西,都要做最坏的打算,快速失败的方式很有必要。 4. 遇到天大的问题,都尽可能保持冷静,不要乱了阵脚!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有什么好用的通用型项目管理软件

目前市面上的项目管理产品非常丰富,在选择项目管理软件的过程中一一了解这些产品哪个更好更适合自己的团队,无疑会浪费很多时间成本。通用性项目管理工具可以满足大部分团队的项目管理需求,那有什么好用的通用型项目管理软件呢?知…

漏洞利用 --- VSFTPD 2.3.4 后门

Metasploit工具 &#xff08;1&#xff09;术语解释&#xff1a; <1> 渗透攻击&#xff08;Exploit&#xff09;&#xff1a;指由攻击者或渗透测试者利用一个系统、应用或服务中的安全漏洞&#xff0c;所进行的攻击行为。 <2> 攻击载荷&#xff08;Payload&…

go快速开发入门指南(一)

Go快速开发指南 &#x1f4a1; 由于工作和未来大数据发展需要&#xff0c;需要对Go语言进行一定学习与使用&#xff0c;特此记录。本系列不会说太多文字概念&#xff0c;重在业务实践和相关开发技巧的总结&#xff0c;和错误的排查记录。因此&#xff0c;如有片面或不足之处&am…

Java 实现类似于网盘一样的文件管理功能

**需求是使用阿里云oss存储&#xff0c;实现一个文件管理功能,支持新建文件夹、文件的上传、下载、批量下载、删除、批量删除、预览、移动、名称搜索、文件路径搜索等。**本人也参考了网上的一些项目&#xff0c;这里记录一下后端的Java代码实现&#xff1a; 首先是表设计的实…

SpringBoot共享图书平台(有文档)

1.简介 SpringBoot共享图书平台 本项目比较简单&#xff0c;适合练手&#xff0c;也适合二开 1.访问地址 http://localhost/ 超级管理员账户 账户名&#xff1a;admin 密码&#xff1a;admin123 普通用户 账户名&#xff1a; zhangsan 密码&#xff1a;123456 普通用户 账…

Talk| CMU博士胡亚飞 :基于离线强化学习的机器人自主探索

本期为TechBeat人工智能社区第503期线上Talk&#xff01; 北京时间6月07日(周三)20:00&#xff0c;CMU Robotics Institute 在读博士生—胡亚飞的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “基于离线强化学习的机器人自主探索 ”&#xff0c…

chatgpt赋能python:Python快速复制

Python快速复制 Python是一种高级编程语言&#xff0c;具有简单易学、优雅简洁的编程风格&#xff0c;也被称为“胶水语言”&#xff0c;因为它可以与其他编程语言很好地结合使用。在Python中&#xff0c;复制文件或文件夹是一个常见的任务&#xff0c;因此在本文中&#xff0…

过五关斩六将,欧科云链荣膺2023安博会“创新产品优秀奖”

6月7日&#xff0c;由中华人民共和国公安部指导、中华人民共和国商务部批准&#xff0c;公安部主管的中国安全防范产品行业协会主办和承办的2023中国国际社会公共安全产品博览会&#xff08;以下简称&#xff1a;安博会&#xff09;正式开幕。 此次安博会&#xff0c;欧科云链携…

6月9日,亚马逊云科技携手出海新势力一同而来

向全球价值链上游奋进 中国企业增强国际竞争力的关键&#xff0c;是努力朝全球价值链上游奋进&#xff0c;发力技术出海。中国的出海新机遇&#xff0c;背后曾是疫情在全球按下数字互联和数字化升级的快进键&#xff0c;跨境电商、在线社交、移动支付、数字服务等数字经济迎来…

chatgpt赋能python:Python快速处理数据的SEO文章

Python快速处理数据的SEO文章 Python是一种通用的高级编程语言&#xff0c;被广泛用于处理数据和科学计算。它以其简洁和高效的语法闻名&#xff0c;可以在短时间内编写出大量的代码&#xff0c;从而快速处理数据。在本文中&#xff0c;我们将讨论如何使用Python快速处理数据&…

万字详解普遍操作系统进程七态与Linux进程七态

作为一个称职的系统管理员&#xff0c;为了更熟悉进程的管理流程&#xff0c;我们必须要知道进程的不同状态所对应的意义。 目录 了解进程状态普遍操作系统的概念就绪状态运行状态等待状态阻塞状态挂起状态暂停状态终止状态 Linux下的进程状态R (running)运行状态S (sleeping)可…

开关柜无线测温技术的研发与发展前景

安科瑞虞佳豪 开关柜无线测温技术发展前景 当前&#xff0c;随着我国科技水平的迅速提升&#xff0c;无线测温技术的研制与应用越来越多地引起国内外专家学者的关注&#xff0c;同时也推动了电力企业对其进行更为广泛的研究与开发&#xff0c;目前已有多种在线检测系统应用于开…

【Android】WMS(三)Window的更新UI刷新

Window的更新 在 Android 中&#xff0c;窗口的更新是一个非常常见的事情。比如&#xff0c;在使用 App 过程中&#xff0c;需要弹出键盘窗口或者切换横竖屏时&#xff0c;就会发生窗口的更新。 首先&#xff0c;当需要更新窗口时&#xff0c;会调用 WindowManager 的 updateV…

基于Java+SpringBoot+Vue前后端分离校园闲置物品交易网站

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

POI in Action

POI 组件依赖 按需引入对应依赖 (给出官方的指引) 组件作用Maven依赖POIFSOLE2 FilesystempoiHPSFOLE2 Property SetspoiHSSFExcel XLSpoiHSLFPowerPoint PPTpoi-scratchpadHWPFWord DOCpoi-scratchpadHDGFVisio VSDpoi-scratchpadHPBFPublisher PUBpoi-scratchpadHSMFOutloo…

MCP1501基准电源系列输出电容为什么不能超过300P

1 介绍 在我们通常理解中基准的输出电容需要在100nF以上&#xff0c;才能有较好的性能输出&#xff0c;为什么MCP1501系列官方推荐输出负载电容不能超过300P呢 2 原理分析 如下是MCP1501手册中标注的&#xff0c;最大负载电容不能超过300pF&#xff0c;超过300pF容易振荡 MC…

JavaSE-01【初识Java】

文章目录 JavaSE-01【初识Java】第一章 Java开发序言1.1 Java语言概述1.2 Java语言的发展史1.3 Java语言应用领域1.4 掌握Java可以从事的工作 第二章 Java开发环境2.1 JDK、JRE、JVM2.2 Java虚拟机 (JVM)2.3 JDK JRE JVM三者的关系2.4 JDK的下载2.5 JDK的安装2.6 JDK环境变量的…

华为认证 | HCIE-Big Data-Data Mining 认证即将升级新版本!

华为认证HCIE-Big Data-Data Mining V3.0&#xff08;中文版&#xff09;预计将于2023年6月30日正式对外发布。 为了帮助您做好学习、培训和考试计划&#xff0c;现进行预发布通知&#xff0c;请您关注。 01 发布概述 基于“平台生态”战略&#xff0c;围绕“云-管-端”协同的…

使用PowerDesigner生成数据库设计文档

第一步&#xff1a;将现有得数据表通过PowerDesigner导入sql脚本(同时保证注释不丢失及name code comment) 1&#xff1a;依次点击File->Reverse Engineer->Database... 2.弹出弹窗对模型进行命名&#xff0c;同时在DBMS下拉选择框中需要选择自己对应的数据库类型&#…

Vue+SpringBoot打造生活废品回收系统(附源码文档)

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲师&#xff0c;全栈领域优质创作者。 一、摘要…