Java常见线上问题排查及其工具使用
发布日期:2021-11-11 12:48:03 浏览次数:1 分类:技术文章

本文共 3123 字,大约阅读时间需要 10 分钟。

一、常见故障原因

1、网络原因

  • 网络抖动
  • 线路故障

2、外部接口故障

3、中间件原因

  • 负载太高,需要扩容等

4、服务自身原因

  • OOM
  • JVM参数导致,metaspace太小等
  • 死锁
  • 接口延时高
  • mysql、redis、mongdb、hbase、kafka等慢查询
  • 业务逻辑缺陷

二、解决方案

1、下线:将故障的实例从nacos下线,保留现场供问题排查

2、重启:如果不能通过下线解决,比如队列消费导致的原因等,则需要重启

3、扩容:如果是容量问题,或者通过扩容能解决,直接扩容,先保障业务,待问题解决后再回收资源

三、排查思路

1、查看监控

  • 硬件资源监控:重点关注CPU、内存、网络带宽、网络连接数,地址:
  • JVM监控:重点关注Heap、CPU、Metaspace、GC,地址:
  • 腾讯云服务器监控:重点关注CPU、内存、网络带宽、TCP连接数,地址:
  • 腾讯云mysql监控:重点关注慢查询、连接数,地址:
  • 腾讯云kafka监控:重点关注连接数、未消费消息数,地址:
  • 腾讯云cmq监控:重点关注不可见消息数量、可见消息数量、删除消息数量、堆积的消息数量,地址:
  • 腾讯云mongdb监控:重点关注请求数、连接数、QPS、延时,地址:
  • 腾讯云redis监控:重点关注CPU、内存、连接数、延时,地址:

2、查看日志

  • Kibana日志

3、查看调用链

  • 根据logId查询调用链,地址:

4、登录服务器排查

  • 登录服务器,通过arthas在线排查

四、常用工具

1、系统命令

  • 查看java进程:

jps 或者 ps -ef|grep java

  • 查看某个进程内部线程

top -H -p pid,其中pid为进程Id

  • 本地和远程文件传输

1、安装lrzsz(可选,已安装则忽略):yum install lrzsz

2、从服务端发送文件到本地:sz filename

3、从本地上传文件到服务端:rz

  • 远程拷贝文件

1、将本地文件拷贝到远程:scp local_file remote_username@remote_ip:remote_folder/remote_file

2、将远程文件拷贝到本地:scp remote_username@remote_ip:remote_folder/remote_file local_file

2、网络命令

  • 查看所有网络连接

1、查看所有连接:netstat -an

2、通过管道搜索:netstat -an |grep CLOSE_WAIT

3、查看监听状态的端口: netstat -an | grep LISTEN

  • tcpdump抓包

1、抓取某端口的所有包:tcpdump -iany -Xns0 port 16000

2、抓取来自某host的包:tcpdump -iany -Xns0 src host 10.1.7.7

3、抓取发往某host的包:tcpdump -iany -Xns0 dst host 10.1.7.7

4、抓取从一台机器发往另外一台机器的包:tcpdump -iany -Xns0 dst host 10.1.7.7 and src host 10.1.1.102

  • httpry抓包(或者fiddler)

1、安装httpry(可选,已安装则忽略):yum install httpry

2、抓取所有http包:httpry

3、抓取所有http包,并支持通过管道grep过滤:httpry | grep cmq

4、抓取符合tcpdump表达式的包:httpry 'src host 10.1.1.102 and dst host 10.1.2.10'

3、在线调试工具arthas,详细文档参考:

  • 启动arthas,并attach到java进程

1、java -jar arthas-boot.jar

2、选择进程对应的编号

  • 退出arthas

exit

  • 查看支持的所有命令

help

  • 查看某条命令的使用方式

命令 -h,比如查看thread的命令使用方式,输入:thread -h

  • 查看系统看板,包括线程状态、JVM、GC、系统变量等

dashboard

  • 查看JVM信息

jvm,其中最后两行有文件描述符的信息,其中MAX-FILE-DESCRIPTOR-COUNT即为能打开的最大数量

  • 查看线程情况:输入”thread -h”查看thread的用法

1、查看所有线程:thread -all

2、通过grep搜索符合条件的线程:thread -all | grep TIMED_WAITING

3、查看被阻塞的线程:thread -b

4、查看CPU占用的前3的线程:thread -n 3

5、查看springboot中内置tomcat的线程:thread -all | grep http,tomcat工作线程默认有200个,另外还有Acceptor、Poller、Timeout线程,可以通过线程名称来查看

6、查看线程的堆栈信息:thread id,比如thread 4741

  • 反编译class,查看源码(注意:在控制台查看反编译后的源码对应的行数是准的,和保存到文件的代码不一样,前者更准)

反编译类:jad .CampaignBiz

反编译类的某个方法:jad .CampaignBiz checkCampaignInfo

  • 追踪方法调用

1、追踪方法:trace 类 方法,比如trace .CampaignBiz checkCampaignInfo

2、过滤超过指定耗时的方法:trace 类 方法 '#cost>时间(单位毫秒)',比如过滤耗时超过100毫秒的方法:trace .CampaignBiz checkCampaignInfo '#cost>100'

3、通过表达式追踪多个类和方法:trace -E com.test.ClassA|org.test.ClassB method1|method2|method3

  • 线上查看Bean

1、查看http调用时的index:tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod,当有http请求时会得到如下结果

 

;如果没有http请求时可以通过触发微服务的监控接口,其中host和port分别为微服务的IP地址和端口。

2、通过指定的index查看bean

查看bean

tt -i 1178 -w 'target.getApplicationContext()'

查看bean

tt -i 1078 -w 'target.getApplicationContext().getBean("nacosConfig")'

查看bean的字段
tt -i 1078 -w 'target.getApplicationContext().getBean("LBSConfig").getKey()'

查看实现bean

tt -i 1078 -w 'target.getApplicationContext().getBean("LBSServiceImpl")'

  • 查看静态字段

getstatic com.ruqimobility.nacosapi.nacos.SpringContextHolder DEV

getstatic com.ruqimobility.nacosapi.nacos.SpringContextHolder context

 

转载地址:https://blog.csdn.net/Carson073/article/details/119214597 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Mybatis-Plus报Invalid bound statement (not found)
下一篇:判断Java对象及其所有属性值是否完全为空

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月26日 05时04分07秒