一、常见故障原因
1、网络原因
- 网络抖动
- 线路故障
2、外部接口故障
3、中间件原因
- 负载太高,需要扩容等
4、服务自身原因
- OOM
- JVM参数导致,metaspace太小等
- 死锁
- 接口延时高
- mysql、redis、mongdb、hbase、kafka等慢查询
- 业务逻辑缺陷
二、解决方案
1、下线:将故障的实例从nacos下线,保留现场供问题排查
2、重启:如果不能通过下线解决,比如队列消费导致的原因等,则需要重启
3、扩容:如果是容量问题,或者通过扩容能解决,直接扩容,先保障业务,待问题解决后再回收资源
三、排查思路
1、查看监控
- 硬件资源监控:重点关注CPU、内存、网络带宽、网络连接数,地址:https://owl.ruqimobility.com/d/9CWBz0bik/yun-wei-jian-kong-fu-wu-qi-ying-jian-zi-yuan-jian-kong
- JVM监控:重点关注Heap、CPU、Metaspace、GC,地址:https://owl.ruqimobility.com/d/_-l-V6kGk2233/jvm-micrometer?orgId=1&refresh=30s
- 腾讯云服务器监控:重点关注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 用户文档 — Arthas 3.5.4 文档
- 启动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 (找到里面对应的类,可用于反编译class)
5、查看springboot中内置tomcat的线程:thread -all | grep http,tomcat工作线程默认有200个,另外还有Acceptor、Poller、Timeout线程,可以通过线程名称来查看
6、查看线程的堆栈信息:thread id,比如thread 4741
- 反编译class,查看源码(注意:在控制台查看反编译后的源码对应的行数是准的,和保存到文件的代码不一样,前者更准)
反编译类:jad com.ruqimobility.marketing.application.biz.CampaignBiz
反编译类的某个方法:jad com.ruqimobility.marketing.application.biz.CampaignBiz checkCampaignInfo
- 追踪方法调用
1、追踪方法:trace 类 方法,比如trace com.ruqimobility.marketing.application.biz.CampaignBiz checkCampaignInfo
2、过滤超过指定耗时的方法:trace 类 方法 '#cost>时间(单位毫秒)',比如过滤耗时超过100毫秒的方法:trace com.ruqimobility.marketing.application.biz.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请求时可以通过http://host:port/actuator/prometheus触发微服务的监控接口,其中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