CPU占用過高問題的排查及解決 cpu使用率過高怎么辦

一,排查步驟 1.使用top 定位到占用CPU高的進程PID 然后按shift+p按照CPU排序 top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,類似于Windows的任務管理器

CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖

第一行,任務隊列信息,同uptime 命令的執行結果
系統時間:07:27:05 運行時間:up 1:57 min, 當前登錄用戶:3 user 負載均衡(uptime)load average: 0.00, 0.00, 0.00average后面的三個數分別是1分鐘、5分鐘、15分鐘的負載情況 。load average數據是每隔5秒鐘檢查一次活躍的進程數 , 然后按特定算法計算出的數值 。如果這個數除以邏輯CPU的數量,結果高于5的時候就表明系統在超負荷運轉了 第二行 , Tasks — 任務(進程)
總進程:150 total, 運行:1 running, 休眠:149 sleeping, 停止: 0 stopped, 僵尸進程: 0 zombie
第三行,cpu狀態信息
0.0%us【user space】— 用戶空間占用CPU的百分比 。0.3%sy【sysctl】— 內核空間占用CPU的百分比 。0.0%ni【】— 改變過優先級的進程占用CPU的百分比 99.7%id【idolt】— 空閑CPU百分比 0.0%wa【wait】— IO等待占用CPU的百分比 0.0%hi【Hardware IRQ】— 硬中斷占用CPU的百分比 0.0%si【Software Interrupts】— 軟中斷占用CPU的百分比 第四行,內存狀態
1003020k total, 234464k used, 777824k free, 24084k buffers【緩存的內存量】
第五行,swap交換分區信息
2031612k total, 536k used, 2031076k free, 505864k cached【緩沖的交換區總量】
可用內存=free + buffer + cached 對于內存監控,在top里我們要時刻監控第五行swap交換分區的used,如果這個數值在不斷的變化,說明內核在不斷進行內存和swap的數據交換,這是真正的內存不夠用了 。第四行中使用中的內存總量(used)指的是現在系統內核控制的內存數,第四行中空閑內存總量(free)是內核還未納入其管控范圍的數量 。納入內核管理的內存不見得都在使用中,還包括過去使用過的現在可以被重復利用的內存,內核并不把這些可被重新使用的內存交還到free中去,因此在linux上free內存會越來越少,但不用為此擔心 。 更多Linux內核視頻資料免費·領取后臺私信【內核】自行獲取 。

CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖

第六行 , 空行
第七行以下:各進程(任務)的狀態監控
PID — 進程idUSER — 進程所有者PR — 進程優先級NI — nice值 。負值表示高優先級,正值表示低優先級VIRT — 進程使用的虛擬內存總量,單位kb 。VIRT=SWAP+RESRES — 進程使用的、未被換出的物理內存大?。ノ籯b 。RES=CODE+DATASHR — 共享內存大?。?單位kbS —進程狀態 。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵尸進程%CPU — 上次更新到現在的CPU時間占用百分比%MEM — 進程使用的物理內存百分比TIME+ — 進程使用的CPU時間總計,單位1/100秒COMMAND — 進程名稱(命令名/命令行) 詳解
VIRT:virtual memory usage 虛擬內存1、進程“需要的”虛擬內存大?。?包括進程使用的庫、代碼、數據等2、假如進程申請100m的內存,但實際只使用了10m , 那么它會增長100m,而不是實際的使用量 RES:resident memory usage 常駐內存1、進程當前使用的內存大小 , 但不包括swap out2、包含其他進程的共享3、如果申請100m的內存,實際使用10m,它只增長10m,與VIRT相反4、關于庫占用內存的情況,它只統計加載的庫文件所占內存大小 SHR:shared memory 共享內存1、除了自身進程的共享內存,也包括其他進程的共享內存2、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小3、計算某個進程所占的物理內存大小公式:RES – SHR4、swap out后,它將會降下來 DATA1、數據占用的內存 。如果top沒有顯示,按f鍵可以顯示出來 。2、真正的該程序要求的數據空間,是真正在運行中要使用的 。top 運行中可以通過 top 的內部命令對進程的顯示方式進行控制 。內部命令如下:s – 改變畫面更新頻率l – 關閉或開啟第一部分第一行 top 信息的表示t – 關閉或開啟第一部分第二行 Tasks 和第三行 Cpus 信息的表示m – 關閉或開啟第一部分第四行 Mem 和 第五行 Swap 信息的表示N – 以 PID 的大小的順序排列表示進程列表P – 以 CPU 占用率大小的順序排列進程列表M – 以內存占用率大小的順序排列進程列表h – 顯示幫助n – 設置在進程列表所顯示進程的數量q – 退出 tops – 改變畫面更新周期 top使用方法:
使用格式: top [-] [d] [p] [q] [c] [C] [S] [s] [n]參數說明: d:指定每兩次屏幕信息刷新之間的時間間隔 。當然用戶可以使用s交互命令來改變之 。p:通過指定監控進程ID來僅僅監控某個進程的狀態 。q:該選項將使top沒有任何延遲的進行刷新 。如果調用程序有超級用戶權限,那么top將以盡可能高的優先級運行 。S:指定累計模式 。s:使top命令在安全模式中運行 。這將去除交互命令所帶來的潛在危險 。i:使top不顯示任何閑置或者僵死進程 。c:顯示整個命令行而不只是顯示命令名 。 此時發現如果是Java的進程占用過高,并且一直下不來,則排查是什么線程導致占比過高 。以圖中進程舉例,假如發現PID為31357的Java進程占CPU比一直很高,則記錄下它的PID
2.查看Java進程里面的線程的占用情況
top -H -p 31357 然后按shift+p按照CPU排序
說明:-H 指顯示線程 , -p 是指定進程

CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖

【CPU占用過高問題的排查及解決 cpu使用率過高怎么辦】 可以看到CPU占用較高的線程,記下他們的PID,假設這里31357的CPU占比一直是50%
或者是再用ps -mp pid -o THREAD,tid,time 查詢進程中,那個線程的cpu占用率高 記住TID
CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖

將查找到的 線程占用最高的 tid 上圖中 29108 轉成16進制 --- 71b4

CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖

3.通過jstack命令獲取占用資源異常的線程棧,可暫時保存到一個文件中查看 jstack 31357 > jstack.31357.log

CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖

以上能看到指定線程的堆棧信息 。如果想看到關于線程中的鎖的附加信息,可以加一個-l參數

CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖

4.上面方法用于進程正常情況下的堆棧打印
用jstack -l命令沒有響應 , 估計是CPU一直站著不能執行正常的命令,根據提示[The -F option can be used when the target process is not responding]只能放大招了 。
jstack -F “PID” > jstack.“PID”.txt
吐出的實際日志結果如下:

CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖

發現一大坨線程阻塞了,有用的結果在這里:

CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖

顯然一直在跑的是19576這個線程,一直在執行EXCEL導出的相關方法,問題就出在這里,下面的任務就是排查這個地方的代碼邏輯了 。
jstack命令格式:
jstack [ option ] pid
參數說明:

  1. -F jstack [-l] pid無法響應時,強制打印堆棧
  2. -l l長列表. 打印關于鎖的附加信息,例如屬于java.util.concurrent的ownable synchronizers列表.
  3. -m 混合模式輸出(包括java和本地c/c++片段)堆棧 。
  4. pid: java應用程序的進程號
  5. 5jps命令查看java進程的pid更實用

CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖

命令格式
jps [ options ] [ hostid ]
參數說明:
  • -m 輸出傳遞給main方法的參數,如果是內嵌的JVM則輸出為null 。
  • -l 輸出應用程序主類的完整包名,或者是應用程序JAR文件的完整路徑 。
  • -v 輸出傳給JVM的參數 。
三個參數加在一起顯示更詳細的信息:

CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖

發現這些Java進程的啟動參數中開放了JMX的遠程端口,正常情況下可以通過jconsole遠程連接過去看到JVM的日常參數 。比如本地訪問上圖中的pay.war進程:

CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖


CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖


CPU占用過高問題的排查及解決 cpu使用率過高怎么辦
文章插圖

經驗總結擴展閱讀