java cpu過高問題排查問題


top命令參數含義
top - 01:06:48 up  1:22,  1 user,  load average: 0.06, 0.60, 0.48
Tasks:  29 total,   1 running,  28 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3% us,  1.0% sy,  0.0% ni, 98.7% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:    191272k total,   173656k used,    17616k free,    22052k buffers
Swap:   192772k total,        0k used,   192772k free,   123988k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
1379 root      16   0  7976 2456 1980 S  0.7  1.3   0:11.03 sshd
14704 root      16   0  2128  980  796 R  0.7  0.5   0:02.72 top
1 root      16   0  1992  632  544 S  0.0  0.3   0:00.90 init
2 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/0


統計信息區前五行是系統整體的統計信息。第一行是任務隊列信息,同 uptime 命令的執行結果。其內容如下:

01:06:48    當前時間
up 1:22 系統運行時間,格式為時:分
1 user 當前登錄用戶數
load average: 0.06, 0.60, 0.48 系統負載,即任務隊列的平均長度。三個數值分別為 1分鍾、5分鍾、15分鍾前到現在的平均值。

 

第二、三行為進程和CPU的信息。當有多個CPU時,這些內容可能會超過兩行。內容如下:
total 進程總數
running 正在運行的進程數
sleeping 睡眠的進程數
stopped 停止的進程數
zombie 僵屍進程數
Cpu(s): 
0.3% us 用戶空間占用CPU百分比
1.0% sy 內核空間占用CPU百分比
0.0% ni 用戶進程空間內改變過優先級的進程占用CPU百分比
98.7% id 空閑CPU百分比
0.0% wa 等待輸入輸出的CPU時間百分比
0.0%hi:硬件CPU中斷占用百分比
0.0%si:軟中斷占用百分比
0.0%st:虛擬機占用百分比

 

 

最后兩行為內存信息。內容如下:
Mem:
191272k total    物理內存總量
173656k used    使用的物理內存總量
17616k free    空閑內存總量
22052k buffers    用作內核緩存的內存量
Swap: 
192772k total    交換區總量
0k used    使用的交換區總量
192772k free    空閑交換區總量
123988k cached    緩沖的交換區總量,內存中的內容被換出到交換區,而后又被換入到內存,但使用過的交換區尚未被覆蓋,該數值即為這些內容已存在於內存中的交換區的大小,相應的內存再次被換出時可不必再對交換區寫入。
 
怎么看內存有多少空閑呢?
totalfree = free17616 + buffers22052 + cached123988

 

進程信息區統計信息區域的下方顯示了各個進程的詳細信息。首先來認識一下各列的含義。
序號  列名    含義
a    PID     進程id
b    PPID    父進程id
c    RUSER   Real user name
d    UID     進程所有者的用戶id
e    USER    進程所有者的用戶名
f    GROUP   進程所有者的組名
g    TTY     啟動進程的終端名。不是從終端啟動的進程則顯示為 ?
h    PR      優先級
i    NI      nice值。負值表示高優先級,正值表示低優先級
j    P       最后使用的CPU,僅在多CPU環境下有意義
k    %CPU    上次更新到現在的CPU時間占用百分比
l    TIME    進程使用的CPU時間總計,單位秒
m    TIME+   進程使用的CPU時間總計,單位1/100秒
n    %MEM    進程使用的物理內存百分比
o    VIRT    進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
p    SWAP    進程使用的虛擬內存中,被換出的大小,單位kb。
q    RES     進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
r    CODE    可執行代碼占用的物理內存大小,單位kb
s    DATA    可執行代碼以外的部分(數據段+棧)占用的物理內存大小,單位kb
t    SHR     共享內存大小,單位kb
u    nFLT    頁面錯誤次數
v    nDRT    最后一次寫入到現在,被修改過的頁面數。
w    S       進程狀態(D=不可中斷的睡眠狀態,R=運行,S=睡眠,T=跟蹤/停止,Z=僵屍進程)
x    COMMAND 命令名/命令行
y    WCHAN   若該進程在睡眠,則顯示睡眠中的系統函數名
z    Flags   任務標志,參考 sched.h
 
cpu使用率很高,所以首先找到該進程,通過top命令,監控該進程的使用率,然后通過H,查看各個線程的cpu使用率情況,記下cpu使用率高的線程id,然后通過jstack pid,獲取各個線程棧,聽過top獲取的線程id轉化成16進制后
 
 方法一、
1、使用命令 top -Hp 進程id 查看所有的進程id

2、將需要的線程ID轉換為16進制格式 printf "%x\n" 線程tid

3、jstack pid | grep tid -A 進程id  查看進程的堆棧日志
 
方法二、

1.使用top 定位到占用CPU高的進程PID

通過ps aux | grep PID命令

2.獲取線程信息,並找到占用CPU高的線程

ps -mp PID -o THREAD,tid,time | sort -rn 

3.將需要的線程ID轉換為16進制格式

printf "%x\n" tid

4.打印線程的堆棧信息

jstack pid |grep tid -A 30


免責聲明!

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



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