今天在生产环境发现一个前端请求一直在显示正在加载中,随后查看请求情况,发现返回的response报错。但是跟进去看代码是正常的。之后ssh连上服务器,查看cpu的使用情况,因为该请求可以会进行大量的计算,可能会导致数据返回很慢。
看了网上的一些教程,大致可以归纳为以下几点:
- 查看日志
- 查看CPU情况
- 查看TCP情况
- 查看java线程 jstack 命令
- 查看java堆 jmap命令
jmap -heap pid 输出当前进程JVM堆新生代、老年代、持久代等情况,GC使用的算法等信息
我自己也按着如下的步骤进行操作:
步骤一:执行命令top 利用top命令找到CPU占用高的进程pid
步骤二:执行命令top -Hp pid 利用 top 命令可以查出该进程中占 CPU 最高的线程 pid
步骤三:将其找到的pid转换为 16 进制形式 (因为 java native 线程以 16 进制形式输出)。可以使用在线转换工具进行转换 在线转换地址,也可以使用命令printf ‘%x\n’ pid 进行进制的换算,假设换算的结果为A
步骤四:利用 jstack 打印出 java 线程调用栈信息,从信息中进行分析,可以将信息下载也可以使用命令直接查看jstack 进程PID | grep ‘A’ -A 100 --color
查看发现对应到的后台代码是一个从Json数据中取数的操作,于是断点进入调试查看数据量大概在几十万+,想着也不会这么容易占用吧,再返回前端,看这个前端页面的请求默认是没有带查询条件的,那么它去请求获取数据的时候就会把所有的数据都计算一遍进行返回,如果是加了下拉框中的一个限定条件,计算的数据就大幅下降了,得到的计算结果的Json的数据量也不是很大,数据能够很快的正常返回。
总结:对于整个问题就是要结合前后端和线上的一些问题排查命令,能让自己对整个流程更加的清晰。