首页 > 其他分享 >如何从消失的异常堆栈定位线上问题

如何从消失的异常堆栈定位线上问题

时间:2023-06-29 09:57:57浏览次数:47  
标签:定位 java 重传 sirector jd 线上 堆栈 com

一、消失的异常堆栈

在618保障大促稳定性过程中,消失的异常堆栈可能会给我们带来严重的麻烦,因为这些堆栈信息是我们解决线上问题的关键之一。如何快速定位问题?想必大家心中都有自己的答案,当然最简单直接的办法还是查找异常堆栈信息。

然而有时异常堆栈并不完整,只有一句描述,如下:

Caused by: java.lang.NullPointerException

造成这种现象的原因其实很简单,原因如下:

JIT编译器对异常进行了优化,当代码中的某个位置抛出同一个异常很多次后,
JIT服务端编译器(C2)会将其优化成抛出一个事先编译好的、类型匹配的异常,异常堆栈信息就看不到了。

二、Fast Throw

Fast Throw,字段上理解就是快速抛异常,目前需要满足以下条件才有如此的优化:

  • 只针对HotSpot VM才有, 例如oracleJDK, libericaJDK等

  • 特定位置抛出很多次,其实就是JIT将它优化了

  • JIT必须使用C2才会这样优化,不抛出原来的异常,改用fast throw抛出

  • 这是一个事先分配好的异常,message和堆栈都是空的

可以看出,如果某个异常在同一位置被抛出多次,会被JIT C2优化成空异常,例如本文的NullPointerException,既没有message,也没有堆栈.但他的速度非常快,不用分配内存和获取堆栈.

如果想关闭这个优化,设置-XX:-OmitStackTraceInFastThrow即可。

存在即合理,既然存在fast throw的优化,必然有其价值。fast throw优化的原因是为了提高性能。当同一种异常在相同的位置被抛出多次,编译器就会重新编译此方法。重编译后,编译器可能会使用不提供跟踪的预分配异常来选择更快的策略。

本地测试了一下抛出NullPointerException,在开启与关闭fast throw的性能。

执行次数 开启Fast Throw 关闭Fast Throw
10w 996ms 3525ms
100w 5983ms 28345ms
500w 35678ms ——

言而简之,不能因此出现了消失的异常堆栈就尝试关闭fast throw优化功能。

三、问题原因定位

对于线上环境中触发了Fast Throw机制,则可以通过向前追溯相同的日志来定位问题。

如在开门红中,有个接口的可用率调到98.3%(不是100%),如下图。

然后搜索日志发现大量的Caused by: java.lang.NullPointerException,没有详细的异常堆栈,很显然是由于fast throw导致的,然后不断向前追溯相同的日志来定位问题如下图。

19:05:32.592 [JSF-BZ-22001-245-T-522] ERROR com.jd.m.soa.shop.service.jsf.shop.impl.ShopSoaOutSideJsfServiceImpl - ShopSoaOutSideJsfServiceImpl.getKACard error
com.jd.sirector.SirectorException: java.lang.NullPointerException
	at com.jd.sirector.ScriptRuntime.waitIfNecessary(ScriptRuntime.java:129) ~[sirector-core-0.2.2-beta.jar:?]
	at com.jd.sirector.ScriptRuntime.run(ScriptRuntime.java:66) ~[sirector-core-0.2.2-beta.jar:?]
	at com.jd.sirector.Sirector.publish(Sirector.java:153) ~[sirector-core-0.2.2-beta.jar:?]
	****************
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_60]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[?:1.8.0_60]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[?:1.8.0_60]
	at java.lang.Thread.run(Thread.java:745) ~[?:1.8.0_60]
Caused by: java.lang.NullPointerException
	at com.jd.******************wProxy.java:321) ~[shop-soa-service-1.1.jar:?]
	**************
	... 5 more
19:05:44.063 [JSF-BZ-22001-245-T-503] ERROR com.jd.m.soa.shop.service.jsf.shop.impl.ShopSoaOutSideJsfServiceImpl - ShopSoaOutSideJsfServiceImpl.getKACard error
com.jd.sirector.SirectorException: java.lang.NullPointerException
	at com.jd.sirector.ScriptRuntime.waitIfNecessary(ScriptRuntime.java:129) ~[sirector-core-0.2.2-beta.jar:?]
	at com.jd.sirector.ScriptRuntime.run(ScriptRuntime.java:66) ~[sirector-core-0.2.2-beta.jar:?]
	at com.jd.sirector.Sirector.publish(Sirector.java:153) ~[sirector-core-0.2.2-beta.jar:?]
	****************
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_60]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[?:1.8.0_60]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[?:1.8.0_60]
	at java.lang.Thread.run(Thread.java:745) ~[?:1.8.0_60]
Caused by: java.lang.NullPointerException
19:05:47.831 [pool-84-thread-10] ERROR com.jd.m.soa.shop.service.base.shop.impl.ShopBaseServiceImpl - 上游返回的店铺星级值非法。value=0.0

出现问题的原因找到了,接着就分析原因。原因很简单,由于某一台机器性能波动导致接口超时将兜底对象缓存,后续逻辑在处理的过种中对象中的Boolean属性值在转boolean时出现NPE,问题根源还是代码兼容性不足够好。

这这台机器进行系统视图层分析,发现TCP重传数较高,如下左图。

四、问题原因分析

TCP重传主要是为了保证数据传输的可靠性,TCP是一种保证可靠传输的机制,如重传与确认机制、数据校验、数据分片、流量控制、拥塞控制等。TCP重传的类型有超时重传和快速重传。超时重传是在请求包发送出去时开启计时器,当到达时间之后,没有收到ACK,则进行重传直到达到上限次数或者收到ACK。快速重传则依赖于数据包的期望序列号,并进行一致性检查。

  • 多台机器或者同一机房同时TCP重传

很大原因是网络抖动

  • 单机或者某个应用出现TCP重传

一般是由于链路的服务器或端口无法访问,对于虚拟机或者docker,还需要考虑宿主机的问题。

通过系统级分析,最后确定是由于宿主机连接性问题导致docker实例TCP重传增高,当然最重要的是补充相关的指标监控。

总之,无论是在大促期间还在平时,遇到问题首先解决好问题,更为重要的是追本溯原,找出问题的根因,以便推动团队优化和提升。

作者:京东零售 张帅

来源:京东云开发者社区

标签:定位,java,重传,sirector,jd,线上,堆栈,com
From: https://www.cnblogs.com/Jcloud/p/17513223.html

相关文章

  • CSS:定位
    position属性position属性用来指定一个元素在网页上的位置,一共有5种定位方式,即position属性主要有五个值。staticrelativefixedabsolutesticky下面主要介绍前四个常用的值。static属性值static是position属性的默认值。这时,浏览器会按照源码的顺序,决定每个元素的位......
  • 2023.6.28 - vue项目打包内存堆栈溢出JS stacktrace
    vue项目打包时报错,JSstacktrace:ReachedheaplimitAllocationfailed-JavaScriptheapoutofmemory这是因为node打包时是有内存空间限制的,node能分配多少空间,默认是根据电脑内存占比来算的。在内存比较小的电脑里,默认分配给node的内存可能不足以支撑起项目运行或者打包......
  • UWB定位系统做0维一维二维三维定位
    UWB定位系统做0维/一维/二维/三维定位一、0维UWB定位(存在性检测)0维UWB定位系统,硬件方面只需要一个UWB基站和一个UWB标签即可实现,如下图1所示,一个UWB基站VDU2503和一个UWB标签VDU1501,UWB标签和基站之间相互通信,再通过和后台的交互实现对人员的存在性监测、报警等功能。二、一维......
  • 性能测试理论、定位、分析总结
    一、理论1.1概念性能测试针对系统的性能指标,建立性能测试模型,制定性能测试方案,制定监控策略,在场景条件之下执行性能场景,分析判断性能瓶颈并调优,最终得出性能结果来评估系统的性能指标是否满足既定值。1.2性能指标指标包括:时间指标、容量指标和资源利用率指标时间指标指......
  • OSPF故障定位没思路?照这篇抄就行
    我的网工朋友大家好。好久没聊OSPF技术了,相关基础且经典的内容,公众号陆陆续续分享过一些,趣味科普,面试考题,实验操作,都有涉及。按照惯例,先给你整一波优质的往期内容:《 5个超经典实验,老杨带你高效进阶OSPF 》《 不懂OSPF,你就千万别点开这篇文章 》《图解OSPF,看这70张图已经足够(一)......
  • UWB隧道管廊人员定位
    UWB隧道管廊人员定位技术:精准解决安全与效率问题隧道、地下轨道交通、矿井的建筑施工环境艰苦恶劣、事故多发、管理复杂,施工过程中迫切需要能够保障施工人员安全的管理系统,实现管理的现代化、信息化,提升作业人员的管理效率,同时保障人员的安全。在隧道管廊作业中,精确的定位和测距......
  • #yyds干货盘点#线上MySQL的自增id用尽处理
    MySQL的自增id都定义了初始值,然后不断加步长。虽然自然数没有上限,但定义了表示这个数的字节长度,计算机存储就有上限。比如,无符号整型(unsignedint)是4个字节,上限就是2^32-1。那自增id用完,会怎么样?表定义自增值id表定义的自增值达到上限后的逻辑是:再申请下一个id时,得到的值保持不......
  • TreeSaver 图片的定位
    Treesaver是浏览器大小尺寸敏感(size-sensitive)的,会就着当前的浏览器尺寸(browsersize),选用不同的分栏表格(grid)做排版。不同排版效果下,图片出现的位置有啥规律,这就是本文要分析的内容: 一些典型的图片出现的规律:首先我们看一些图片出现的规律:一、当显示的区域只有两栏时,显示另外一个......
  • WEB自动化-selenium-定位方式
    定位元素的时候可以修改JS样式来确定定位的元素是否正确#通过selenium修改JS属性,用来确定我定位的元素是什么?driver.execute_script("arguments[0].setAttribute('style',arguments[1]);",el,"border:2pxsolidgreen;"#边框,green绿色) ......
  • 数据库索引问题定位与分析
    数据库索引问题定位与分析一.数据库服务器添加慢查询配置1.my.cnf文件添加监控慢查询配置cd/etc/my.cnfvimy.cnf添加如下配置:slow_query_log=1long_query_time=0.012.重启数据库服务器systemctlrestartmysqld3.检查配置是否生效showvariableslike'%slow_query_......