目录
(2)第二步,显示线程列表 ps -mp 42 -o THREAD,tid,time
(3)第三步,选择自己要看的线程 id ,即 tid,将其转换成16进制格式
1 问题发现与背景
问题背景,项目对外提供查询接口,其核心逻辑对一些报文做正则解析返回。由于起初对正则不熟悉,对报文格式规律不清楚,导致写了大量的长正则表达式,生产环境并发量上来(200/s),直接导致 CPU 使用率峰值徘徊在 100%,运维报警反馈。
2 运维报警
3 问题定位与解决
(1)第一步,jps 查看 java pid
(2)第二步,显示线程列表 ps -mp 42 -o THREAD,tid,time
可以看到 CPU 占用率很高线程,如下面显示标红的线程。
(3)第三步,选择自己要看的线程 id ,即 tid,将其转换成16进制格式
当时选择的是 tid 为211。
(4)第四步,打印堆栈信息
(5)第五步 从堆栈信息中定位问题代码
定位到问题代码在 AvQueryClientImpl 的 319 行。具体是由于长正则匹配,吃 CPU 引起,并发量上来扛不住。根据业务情景,把正则精简到了原来1/20的长度。CPU 占用恢复正常,峰值在10%左右。
4 涉及命令梳理
(1)jps 命令
jps(Java Virtual MachineProcess Status Tool)是 JDK 1.5 提供的一个显示当前所有 java 进程 pid 的命令。
- jps # 列出 pid
- jps -l # 列出 pid 和 java主 类全称
- jps -v # 列出 pid 和 JVM 参数
(2)jstack 命令
jstack 是 java 虚拟机自带的一种堆栈跟踪工具。jstack 用于生成 java 虚拟机当前时刻的线程快照。线程快照是当前 java 虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过 jstack 来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
Usage:
jstack [-l] <pid>
jstack -F [-m] [-l] <pid>
Options:
-F 强制 dump 线程堆栈信息. 用于进程 hang 住, jstack <pid> 命令没有响应的情况
-m 同时打印 java 和本地(native)线程栈信息,m 是 mixed mode 的简写
-l 打印锁的额外信息
(3)Linux ps 和 printf 命令
(1)ps指令报告系统进程状态。http://man.linuxde.net/ps
(2)printf命令格式化并输出结果到标准输出。 http://man.linuxde.net/printf
(3)附录:cpu 占用过高:https://blog.csdn.net/u013066244/article/details/53503530