线上问题排查方案汇总
一、抓包排查接口请求与响应
- 1.针对Linux原生环境的服务,常用的网络协议有udp、tcp、http、dns、ip、port、ssl等,针对Http请求接口,可抓取从源Ip到目的Ip的数据包或者抓取从源Port到指定Port的数据包。
- 常用命令汇总:
抓取整包(当前服务器上的调用情况)
tcpdump -i any -s 0 -w tempTest.pcap -v
抓取指定IP数据包
tcpdump -i any -s 0 host 10.10.10.10 -w tempTest.pcap -v
抓取指定Port数据包
tcpdump -i any -s 0 port 8003 -w tempTest.pcap -v
- 2.抓取的.pcap包可通过wireShark分析工具对数据包进行分析。通过命令可筛选过滤出源Ip、Port,目的Ip与Port,关键接口,参数的对应HTTP请求详情。
常用命令如下:
通过接口名筛选http contains "/student/search"
通过源Ip或Port来筛选:
ip.src_host==10.10.10.10
ip.dst_host==10.10.10.10
tcp.srcport==8080
tcp.dstport==80
通过筛选Http协议中请求方法
http.request.method==GET
筛选出不是源Ip的请求
!(ip.src_host==0.10.10.10)
二、Arthas结合源码监控程序PID分析问题
Arthas常用命令:
- 启动之前可采用ps -ef |grep 服务名 查看当前运行服务的权限,采用命令su 用户名 将权限切换到对应权限再采用java -jar arthas-boot.jar命令启动监听。
- 有时候会存在切换权限组失败的情况,可采用命令进行修改:usermod -s /bin/bash username
- arthas启动命令,首先确保存在java环境,其次存在需要开源的arthas整包,采用命令
java -jar arthas-boot.jar
启动arthas服务,根据列出的服务选择对应服务进行监听 - 若遇到无法启动arthas监听,可能是端口占用或者权限问题。
- 端口占用解决方式(切换端口启动arthas监听服务):java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
- 采用trace监控指定方法,命令格式为trace 全限定类名 方法名,如下所示:
trace com.sjj.nb.business.trace.service.StudentHandlerServiceImpl QueryStudentList
- 采用watch监控入参出参(params:入参,returnObj:出参,-x 4 参数层级):
watch com.sjj.nb.business.trace.service.StudentHandlerServiceImpl QueryStudentList "{params,returnObj}" -x 4
- 采用getstatic获取类下的静态变量
getstatic com.sjj.nb.business.trace.service.StudentHandlerServiceImpl StudentCodeMap -x 4
- 采用jad反编译代码可查看线上某个类或者方法对应的代码
jad watch com.sjj.nb.business.trace.service.StudentHandlerServiceImpl QueryStudentList