记一次生产环境CPU占用飙高问题解决

1 问题来源与背景

        问题背景,项目对外提供查询航班舱位接口,对航信黑屏报文做正则解析返回。由于起初对正则不熟悉,对黑屏报文格式规律不清楚,导致写了大量的长正则表达式,生产环境并发量上来(200/s),直接导致CPU使用率峰值徘徊在100%,运维报警反馈。

2 运维报警

记一次生产环境CPU占用飙高问题解决_第1张图片

3 问题定位与解决

(1)第一步  , 用jps 查看java pid 

记一次生产环境CPU占用飙高问题解决_第2张图片

(2)第二步,显示线程列表 ps -mp 42 -o THREAD,tid,time

记一次生产环境CPU占用飙高问题解决_第3张图片

记一次生产环境CPU占用飙高问题解决_第4张图片

    可以看到CPU占用率很高线程,如上面显示标红的线程。

(3)第三步,选择自己要看的线程id , 即tid。将其转换成16进制格式。当时选择的是tid 为211.

记一次生产环境CPU占用飙高问题解决_第5张图片

(4)第四步  打印堆栈信息

记一次生产环境CPU占用飙高问题解决_第6张图片

(5)第五步 从堆栈信息中定位问题代码

记一次生产环境CPU占用飙高问题解决_第7张图片

    定位到问题代码在 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]
jstack -F [-m] [-l]
Options:
-F  强制dump线程堆栈信息. 用于进程hung住, jstack 命令没有响应的情况
-m  同时打印java和本地(native)线程栈信息,m是mixed mode的简写
-l  打印锁的额外信息
(3)附录linux常用的指令
   (1)ps指令报告系统进程状态。http://man.linuxde.net/ps
   (2)printf命令格式化并输出结果到标准输出。 http://man.linuxde.net/printf

5 拓展参考附录

    (1)cpu占用过高
        https://blog.csdn.net/u013066244/article/details/53503530
    (2)Linux系统监控常用命令
        http://www.xitongzhijia.net/xtjc/20141203/31828.html

你可能感兴趣的:([JavaSE]_[线程并发])