1 问题来源与背景
问题背景,项目对外提供查询航班舱位接口,对航信黑屏报文做正则解析返回。由于起初对正则不熟悉,对黑屏报文格式规律不清楚,导致写了大量的长正则表达式,生产环境并发量上来(200/s),直接导致CPU使用率峰值徘徊在100%,运维报警反馈。
2 运维报警
3 问题定位与解决
(1)第一步,用jps查看javapid
(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的命令,
简单实用,非常适合在linux/unix平台上简单察看当前java JVM进程的一些简单情况。
<1>jps
列出pid
<2>jps -l
列出pid和java主类全称
<3> jps -v
列出pid和JVM参数
(2)Jstack命令
jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于生成java虚拟机当前时刻的线程快照。
线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,
如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知
道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core
文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
Usage:
jstack [-l] <pid>
jstack -F [-m] [-l] <pid>
Options:
-F 强制dump线程堆栈信息. 用于进程hung住, jstack <pid>命令没有响应的情况
-m 同时打印java和本地(native)线程栈信息,m是mixed mode的简写
-l 打印锁的额外信息
(3)附录linux常用的指令
(1)ps指令报告系统进程状态。/ps
(2)printf命令格式化并输出结果到标准输出。 /printf
5 拓展参考附录
(1)cpu占用过高
/u013066244/article/details/53503530
(2)Linux系统监控常用命令
/xtjc/1203/31828.html