zoukankan      html  css  js  c++  java
  • 查询最耗cpu的进程

    最新方案:
    1,查看博客的文件:服务器CPU异常排查.pdf
    2,具体tomcat优化配置详见有道笔记:CPU异常升高-dump

    生成dump文件
    ①,top出异常进程
    ②,生成异常进程的dump文件
    jmap -dump:format=b,file=[文件名] [进程]
    jmap -dump:format=b,file=heap.dump 2576
    jmap -dump:format=b,file=heap.hprof 2576
    ③,使用jvisualvm分析dump文件

    查找异常线程

    wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release/show-busy-java-threads

    chmod +x show-busy-java-threads 

    使用jstack

    top 记录进程ID: 20485

    Shift + h  记录线程ID: 20551

    printf %x  20551     记录线程十六进制: 5047

    jstack 20485 | grep 5047 -A 10    (-A:往后多少行)

    进程内存状态

    jstat -gcutil 进程ID

    xshell脚本检查线程异常:见附件 cpuinfo.zip

    JVM配置
    JAVA_OPTS="-Dfile.encoding=UTF-8 -server -d64 -Xms2048m -Xmx2048m -Xmn1024m -XX:CICompilerCount=6 -XX:SurvivorRatio=6 -XX:+UseCompressedOops -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution -XX:+PrintAdaptiveSizePolicy -XX:+CMSScavengeBeforeRemark -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat-mail-provider/oomheapdump -Xloggc:/usr/local/tomcat-mail-provider/gclog.log"


    查询最耗cpu的进程

    top
    
    top -Hp proccessId
    
    printf "%x
    " PID
    
    jstack proccessId | grep 3b2

    1,查找进程

    top

    2,查找线程

    top -Hp proccessId

    3,获取线程id的十六进制

    printf "%x " PID

    [root@iZj6c4f8n80x3vpa38x9frZ ~]# printf "%x " 946
    3b2

    4,jstack proccessId | grep 3b2

    5,根据线程名称查找对应代码


    CPU使用率异常排查

    主要内容:

    1,排查方法

    2,快捷脚本

    3,实例分析

    4,TOP扩展

    一,排查方法

    •1,使用top查到占用cpu很高的java进程PID
           •开启线程显示模式(top -H或打开top后按H)
           •CPU使用率排序(打开top后按P可按CPU使用降序)
           •记下Java进程id
    •2,ps -mp 7200 -o THREAD,tid,time | sort -rn 
    •3,手动转换线程id成十六进制 
    •4,查找十六进制的线程id

    命令行:

    1,top -H

    2,ps -mp [进程PID] -o THREAD,tid,time | sort -rn

    3 ,  printf "%x " [线程PID]

    4, jstack [进程PID]|vim +/[十六进制线程PID] -

    二,快捷脚本

    –对于线上问题定位来说,分秒必争,上面的 4 步还是太繁琐耗时了,之前介绍过淘宝的oldratlee 同学就将上面的流程封装为了一个工具:show-busy-java-threads.sh,一步搞定!

    使用帮助:

    github地址:https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md

    1,下载

    wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release/show-busy-java-threads

    chmod +x show-busy-java-threads 

    2,使用

         ①,找出最消耗CPU的线程(默认前5个),并打印出其线程栈

               ./show-busy-java-threads

               ./show-busy-java-threads -c [要显示的线程栈数]

         ②,找出指定的Java进程PID的线程栈

               ./show-busy-java-threads -p [进程PID]

         ③,重复查询

               ./show-busy-java-threads [重复执行的间隔秒数] [重复执行的次数]

               ./show-busy-java-threads -c 2 5 10 执行10次间隔5秒,每次显示前两个线程栈

         ④,记录到文件以方便回溯查看

               ./show-busy-java-threads -a [运行输出的记录到的文件名]

         ⑤,指定jstack输出文件的存储目录,方便记录以后续分析

               ./show-busy-java-threads -S [存储jstack输出文件的目录]

                       2018-11-12_20:36:01.842197669_1_top                                       2018-11-12_20:36:01.842197669_1_ps

                       2018-11-12_20:36:01.842197669_show-busy-java-threads         2018-11-12_20:36:01.842197669_1_jstack_23093

                       2018-11-12_20:36:01.842197669_1_jstack_2641

    脚本扩展:

    1,如果Java进程的用户 与 执行脚本的当前用户 不同,则jstack不了这个Java进程

         为了能切换到Java进程的用户,需要加sudo来执行,即可以解决:

         sudo show-busy-java-threads

    2,# 对于sudo方式的运行,JAVA_HOME环境变量不能传递给root,

         # 而root用户往往没有配置JAVA_HOME且不方便配置, 

         # 显式指定jstack命令的路径就反而显得更方便了

         show-busy-java-threads -s <指定jstack命令的全路径>

    3,-m选项:执行jstack命令时加上-m选项显示上Native的栈帧,一般应用排查不需要使用

         show-busy-java-threads –m

    4,-F选项:执行jstack命令时加上 -F 选项(如果直接jstack无响应时,用于强制jstack)

         show-busy-java-threads –F

    5,-l选项:执行jstack命令时加上 -l 选项,显示上更多相关锁的信息

         show-busy-java-threads -l

    三,实例分析

    –RabbitMQ导致的CPU异常
    –1,消息发送 
    –2,消息消费

    ①,消息发送-线程栈

           消息发送 – 源代码

    ②,消息消费 – 线程栈

           消息消费 – 源代码

    四,TOP扩展

    1,top行-任务队列信息

    11:36:18   当前时间

    up 25 days, 6:48   系统运行时间,格式为时:分

    1 user   当前登录用户数

    load average: 0.10, 0.15, 0.14   系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

    注意:这三个值可以用来判定系统是否负载过高——如果值持续大于系统 cpu 个数,就需要优化你的程序或者架构了。

    2,Tasks行-进程统计信息

    78 total   进程总数

    1 running   正在运行的进程数

    77 sleeping   睡眠的进程数

    0 stopped   停止的进程数

    0 zombie   僵尸进程数

    3,%Cpu(s)行 - CPU统计信息

    4.3 us  用户程序的运行空间占用CPU百分比

    0.5 sy  Linux 内核的运行空间占用CPU百分比

    0.0 ni  用户进程空间内改变过优先级的进程占用CPU百分比

    95.0 id  空闲CPU百分比,这个值越低,表示 CPU 越忙

    0.0 wa  等待输入输出的CPU时间百分比,这段时间 CPU 不能干其他事,但是也没有执行运算,这个值太高就说明外部设备有问题

    0.0 hi  CPU 响应硬件中断请求的时间百分比

    0.2 si  CPU 响应软件中断请求的时间百分比

    0.0 st   该项指标只对虚拟机有效,表示分配给当前虚拟机的 CPU 时间之中,被同一台物理机上的其他虚拟机偷走的时间百分比

    4,KiB Mem - 内存统计信息

    8010688 total  物理内存总量

    145172 free  空闲内存总量

    3625856 used  使用的物理内存总量

    4239660 buff/cache 用作内核缓存的内存量

    实际的程序可用内存 = free + (buffers + cached)

    程序已用内存 = used – (buffers + cached)

    5,KiB Swap

    0 total  交换区总量

    0 free  空闲交换区总量

    0 used  使用的交换区总量 swap used 数值大于 0内存不足

    4031912 avail Mem  缓存交换区总量

    6,进程信息

    PID   进程id

    USER  进程所有者

    PR   进程优先级

    NI   nice值。负值表示高优先级,正值表示低优先级

    VIRT   进程使用的虚拟内存总量,单位kb

    RES   进程使用的、未被换出的物理内存大小,单位kb

    SHR   共享内存大小,单位kb

    S   进程状态。D=不可中断的睡眠状态R=运行S=睡眠T=跟踪/停止Z=僵尸进程

    %CPU   上次更新到现在的CPU时间占用百分比

    %MEM   进程使用的物理内存百分比

    TIME+   进程使用的CPU时间总计,单位1/100秒

    COMMAND  命令名/命令行

  • 相关阅读:
    Ubuntu设置root用户登录图形界面
    Hadoop的安装与设置(1)
    SSH框架和Redis的整合(1)
    @Autowired注解的使用
    The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory
    Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define ...
    java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE
    Android Studio的SVN Performing VCS Refresh/Commit 长时间不结束
    Error:Execution failed for task ':app:clean'.
    Android Studio项目提交到GitHub
  • 原文地址:https://www.cnblogs.com/wanhua-wu/p/9272046.html
Copyright © 2011-2022 走看看