zoukankan      html  css  js  c++  java
  • java应用cpu使用率过高问题排查

    ---------------------------------------linux下如何定位代码问题-------------------------------

    1、先通过top命令找到消耗cpu很高的进程id假设是123

    2、执行top -p 123单独监控该进程

    3、在第2步的监控界面输入H,获取当前进程下的所有线程信息

    4、找到消耗cpu特别高的线程编号,假设是123

    5、执行jstack 123456对当前的进程做dump,输出所有的线程信息

    6 将第4步得到的线程编号11354转成16进制是0x7b

    7 根据第6步得到的0x7b在第5步的线程信息里面去找对应线程内容

    8 解读线程信息,定位具体代码位置

    -----------------------------分割线----------------------------------------------

    最近在压力测试工作中碰到java应用某台机器cpu比较高的情况,特地下笔记以后总结:

    一个简单的淘宝认证接口 需要插入读写数据库2次。每次爬取数据,入库。完成。

    正常情况下:

    应用使用cpu在 :50%--80%

    压力高--异常情况下:

    cpu利用率在:90%---90%

    在网上查了下,一般java应用cpu过高基本上是因为

    1.程序计算比较密集

    2.程序死循环

    3.程序逻请求堵塞
    4.IO读写太高 

    方法一:

    分析步骤:

    1.登陆应用机器,top -d 1命令查看 当前占用cpu资源最多的,一般排名第一位肯定是java进程

    一般也可能存在多个java进程 

    观察 top 消耗第一的资源是PID=1679的线程

    2.查看进程的哪个线程占用cpu比较高,取线上另外一台正常情况下利用cpu比较高的应用:通过

    ps -mp pid -o THREAD,tid,time命令查看该进程的线程情况

    通过以上线程CPU切片 耗时在pid=1679 Tid =1896 耗时 1分59秒,4%CPU占用最大。时间最长。

    TID为1679的线程利用cpu资源比较多,怎么能看到这个线程在干什么呢?

    需要将1896 转换为16进制,便于在jvm堆栈中查找。

    printf "%x " 1896   ----768

    通过jstack命令来查看下当前内存状态:

     定位到cpu过高是IO读写太高 ,接下来就是找开发人员确认这段代码是否可以优化。

    方法二:

    在做压测的时候,开发给了一个工具  show-busy-java-threads.sh

    在排查JavaCPU性能问题时,找出Java进程中消耗cpu多(top us值过高)的线程,查看它的线程栈,从而找出有性能问题的方法调用。

    ####截取一段

    #!/bin/bash
    # @Function
    # Find out the highest cpu consumed threads of java, and print the stack of these threads.
    #
    # @Usage
    #   $ ./show-busy-java-threads.sh
    #
    # @author Jerry Lee
     
    readonly PROG=`basename $0`
    readonly -a COMMAND_LINE=("$0" "$@")
     
    usage() {
        cat <<EOF
    Usage: ${PROG} [OPTION]...
    Find out the highest cpu consumed threads of java, and print the stack of these threads.
    Example: ${PROG} -c 10
    
    ...................后面略

    其实就是个shell文件,把这个文件上传到目标服务器(linux),记得更改文件的读写权限: chmod -R 777  show-busy-java-threads.sh

    接方法一  top之后,只需要下命令 :./show-busy-java-threads.sh -p pid  后面CPU占用高的定位就分析出来了,具体如图

     

  • 相关阅读:
    三元运算符嵌套问题
    tp框架利用redis存储session
    PHP date('W')遇到跨年问题
    AES加解密 集成 spring MVC
    python SMTP 发送邮件
    mysql数据库安装过程
    (转)Apache启动过程
    apache服务器全局配置详解
    Apache 的 httpd.conf 详解(很实用)
    安装apache遇到的问题总结
  • 原文地址:https://www.cnblogs.com/Alexr/p/9361491.html
Copyright © 2011-2022 走看看