zoukankan      html  css  js  c++  java
  • cpu占用率高排查知识点

    1. 使用top命令查看cpu占用高的进程

    cpu使用率参数含义:

    %us:us:用户空间占用CPU的百分比。简单来说,高我们是由程序引起的。通过分析线程堆栈很容易找到有问题的线程。

    %sy:内核空间占用CPU的百分比。当sy为高时,如果它是由程序引起的,那么它基本上是由于线程上下文切换。

    %ni:表示用户空间且通过nice调度过的程序的cpu使用率。

    %id:空闲cpu

    %wa:cpu运行时在等待io的时间

    %hi:cpu处理硬中断的数量

    %si:cpu处理软中断的数量

    %st:被虚拟机偷走的cpu

    %CPU为什么会超过100%?

    %CPU是指进程占每个核的百分比之和,假设你的机器是2个cpu,每个cpu 4核,那么%CPU的最大值可以达到800%

    2. 查看某个进程中所有线程的资源占用  top -Hp pid

    3. 查看java线程信息

    printf "%x " tid  可以获取tid的16进制

    jstack pid |grep -A 10 tid的16进制

    java进程状态

    NEW   // 没有启动过的线程状态,当程序使用 new 关键字创建了一个线程之后,该线程就处于新建状态,此时仅由 JVM 为其分配 内存,并初始化其成员变量的值

    RUNNABLE  // 当线程对象调用了 start()方法之后,该线程处于就绪状态。Java 虚拟机会为其创建方法调用栈和 程序计数器,等待调度运行。

    BLOCKED  // 阻塞状态,等待锁(monitor lock)

    WAITING     //等待状态,等待其他线程的某个操作,例如Object.wait Thread.join

    TIMED_WAITING  //带有超时时间的等待状态

    TERMINATED   //已终止线程状态

    备注:

    线程状态为“waiting for monitor entry”:意味着它 在等待进入一个临界区 ,所以它在”Entry Set“队列中等待。
    此时线程状态一般都是 Blocked:java.lang.Thread.State: BLOCKED (on object monitor)

    如果大量的线程处于BLOCKED(on object monitor) 状态,可能是一个全局锁阻塞了大量线程。

    线程状态为“waiting on condition”:
    说明它在等待另一个条件的发生,来把自己唤醒,或者干脆它是调用了 sleep(N)。
    此时线程状态大致为以下几种:
    • java.lang.Thread.State: WAITING (parking):一直等那个条件发生;
    • java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定时的,那个条件不到来,也将定时唤醒自己。

    线程状态为”Object.wait()“:

    说明这个线程之前获得了某个monitor,进入临界区,但是发现执行条件不满足,调用object.wait进入Wait Set

    此时线程状态大致分为:

    • java.lang.Thread.State:WAITING  (on object monitor)
    • java.lang.Thread.State: TIMED_WAITING (on object monitor)

    如果大量的线程在waiting on condition状态,可能是第三方资源迟迟获取不到导致大量线程进入等待状态,比如网络资源等。所以如果你发现有大量的线程都处在 Wait on condition,从线程堆栈看,正等待网络读写这可能是一个网络瓶颈的征兆,因为网络阻塞导致线程无法执行。

    获取monitor过程

    每个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”,而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()”。

    当线程获得了 Monitor,如果发现线程继续运行的条件没有满足,它则调用对象(一般就是被 synchronized 的对象)的 wait() 方法,放弃了 Monitor,进入 “Wait Set”队列。

    参考博客:https://www.cnblogs.com/noteless/p/10372674.html

    https://www.cnblogs.com/zhengyun_ustc/archive/2013/03/18/tda.html

  • 相关阅读:
    mybatis学习笔记
    markdownPad常用功能示例
    2018-2019-2 《Java程序设计》第3周学习总结
    2018-2019-2 《Java程序设计》第2周学习总结
    2018-2019-2 《Java程序设计》第1周学习总结
    Djnago models 一对多、多对多
    Superset 安装
    lvm 添加分区
    partprobe 重新检测Linux系统分区
    Docker 、Docker Compose 安装
  • 原文地址:https://www.cnblogs.com/catpainter/p/12988287.html
Copyright © 2011-2022 走看看