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\n" 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM