1. 程式人生 > >JAVA程序高CPU佔用故障排查

JAVA程序高CPU佔用故障排查

問題描述:
生產環境下的某臺tomcat7伺服器,在剛釋出時的時候一切都很正常,在執行一段時間後就出現CPU佔用很高的問題,基本上是負載一天比一天高。

問題分析:
1,程式屬於CPU密集型,和開發溝通過,排除此類情況。
2,程式程式碼有問題,出現死迴圈,可能性極大。

問題解決:
1,開發那邊無法排查程式碼某個模組有問題,從日誌上也無法分析得出。
2,記得原來通過strace跟蹤的方法解決了一臺PHP伺服器CPU佔用高的問題,但是通過這種方法無效,經過google搜尋,發現可以通過下面的方法進行解決,那就嘗試下吧。

解決過程:
1,根據top命令,發現PID為2633的Java程序佔用CPU高達300%,出現故障。

2,找到該程序後,如何定位具體執行緒或程式碼呢,首先顯示執行緒列表,並按照CPU佔用高的執行緒排序:

[[email protected] logs]# ps -mp 2633 -o THREAD,tid,time | sort -rn

顯示結果如下:
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
root     10.5  19    - -         -      -  3626 00:12:48
root     10.1  19    - -         -      -  3593 00:12:16

找到了耗時最高的執行緒3626,佔用CPU時間有12分鐘了!

將需要的執行緒ID轉換為16進位制格式:
[[email protected]
logs]# printf "%x\n" 3626

e18

最後列印執行緒的堆疊資訊:
[[email protected] logs]# jstack 2633 |grep e18 -A 30


將輸出的資訊發給開發部進行確認,這樣就能找出有問題的程式碼。

通過最近幾天的監控,CPU已經安靜下來了。

使用 jstack [pid]  > xx.log 命令列印程序資訊

#jstack 16511 > 1.log

#jstack 16511 > 2.log

#jstack 16511 > 3.log

3、開啟日誌檔案,找到兩個執行緒資訊,如下

"Thread-77" prio=10 tid=0x00007f58d4041800 nid=0x4ceb runnable [0x00007f58d175f000]
   java.lang.Thread.State: RUNNABLE
 at com.huawei.iiss.upadapter.common.oprindex.thread.OprUserIndexThread.run(OprUserIndexThread.java:61)
 at java.lang.Thread.run(Thread.java:662)

"Thread-76" prio=10 tid=0x00007f58d4a43800 nid=0x4cea runnable [0x00007f58bd066000]
   java.lang.Thread.State: RUNNABLE
 at com.huawei.iiss.upadapter.common.oprlog.thread.SaveOprLogThread.run(SaveOprLogThread.java:80)
 at java.lang.Thread.run(Thread.java:662)

找到以上紅色資訊,已經定位到JAVA具體程式碼,產看程式碼,發現死迴圈。。。速度改之

附:TOP命令中需要關注的值:
(1)load average:此值反映了任務佇列的平均長度;如果此值超過了CPU數量,則表示當前CPU數量不足以處理任務,負載過高
(2)%us:使用者CPU時間百分比;如果此值過高,可能是程式碼中存在死迴圈、或是頻繁GC等
(3)%sy:系統CPU時間百分比;如果此值過高,可能是系統執行緒競爭激烈,上下文切換過多,應當減少執行緒數
(4)%wa:等待輸入、輸出CPU時間百分比;如果此值過高,說明系統IO速度過慢,CPU大部分時間都在等待IO完成
(5)%hi:硬體中斷CPU百分比;當硬體中斷髮生時,CPU會優先去處理硬體中斷;比如,網絡卡接收資料會產生硬體中斷
(6)swap used:被使用的swap;此值過高代表系統因為記憶體不足在進行頻繁的換入、換出操作,這樣會影響效率,應增大記憶體量
(7)%CPU:程序使用CPU的百分比;此值高表示CPU在進行無阻塞運算等


相關推薦

JAVA程序CPU佔用故障排查

問題描述:生產環境下的某臺tomcat7伺服器,在剛釋出時的時候一切都很正常,在執行一段時間後就出現CPU佔用很高的問題,基本上是負載一天比一天高。問題分析:1,程式屬於CPU密集型,和開發溝通過,排除此類情況。2,程式程式碼有問題,出現死迴圈,可能性極大。問題解決:1,開

生產環境下JAVA程序CPU佔用故障排查

轉自:http://blog.chinaunix.net/uid-10449864-id-3463151.html 問題描述: 生產環境下的某臺tomcat7伺服器,在剛釋出時的時候一切都很正常,在執行一段時間後就出現CPU佔用很高的問題,基本上是負載一天比一天高。 問題分

Java應用故障CPU佔用的問題及排查方案

做為應用負責人,誰都希望自己負責的應用能夠在線上跑得順順當當,不出任何錯誤,也不產生任何告警,當然這是最理想的結果,也是做為技術人員希望達到的最終效果。可是實事上應用就像小孩一樣,總會在不經意間,不按你期望的結果執行,如CPU偏高、記憶體佔用偏高、應用沒有響應、應用自動掛掉等

Java線上應用故障排查之一:CPU佔用【轉】

近期java應用,CPU使用率一直很高,經常達到100%,通過以下步驟完美解決,分享一下。 方法一: 轉載:http://www.linuxhot.com/java-cpu-used-high.html 1.jps 獲取Java程序的PID。 2.jstack pid

Java線上應用故障排查之一:CPU佔用

一個應用佔用CPU很高,除了確實是計算密集型應用之外,通常原因都是出現了死迴圈。 以我們最近出現的一個實際故障為例,介紹怎麼定位和解決這類問題。 根據top命令,發現PID為28555的Java程序佔用CPU高達200%,出現故障。 通過ps aux | gre

故障排查之一:CPU佔用

http://www.blogjava.net/hankchen/archive/2012/05/09/377735.html 一個應用佔用CPU很高,除了確實是計算密集型應用之外,通常原因都是出現了死迴圈。 根據top命令,發現PID為28555的Java程序佔用CPU高達200%,出現故

線上應用故障排查之一:CPU佔用

一個應用佔用CPU很高,除了確實是計算密集型應用之外,通常原因都是出現了死迴圈。 以我們最近出現的一個實際故障為例,介紹怎麼定位和解決這類問題。 根據top命令,發現PID為28555的Java程序佔用CPU高達200%,出現故障。 通過ps aux | grep PID命令,可以進一步確定是t

Java中的CPU佔用和記憶體佔用的問題排查

下面通過模擬例項分析排查Java應用程式CPU和記憶體佔用過高的過程。如果是Java面試,這2個問題在面試過程中出現的概率很高,所以我打算在這裡好好總結一下。 1、Java CPU過高的問題排查 舉個例子,如下:  package com.classloading; public class Te

Linux 定位程序CPU佔用的執行緒

一、Top+pstack+gdb的組合拳 閒言少述,先直接上操作例項,再做原理講解。 1.1 用top命令找到最佔CPU的程序 top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 22688 root 20 0 1842

服務重啟導致的Java服務抖動CPU佔用

今天后臺組發現新上線的應用CPU總是會佔用過高。(心裡暗罵,新來的運維真無聊,閒著沒事看top幹啥) 首先發送命令 jps -lv 查詢執行的程序pid=18182, [[email protected] service-8072]$ jps 19017 Jp

java web伺服器cpu佔用的處理

平時專案中有時遇到cpu過高的情況,在此基於自己有限的經驗寫個分享,此處的伺服器都是基於linux平臺。 cpu的佔有執行緒型別總的來說分為兩種: us :使用者空間佔用CPU百分比 sy :核心空間佔用CPU百分比 一般來講CPU us高的解決方法: CPU us

Java程序各種監控命令和排查方法

Java 排查 1、監控進程GC情況: jstat -gcutil pid 頻率例如:jstat -gcutil 3807 2s 2、監控CUP和內存:命令:top,vmstat,nmon工具:Jvisualvm ,Jprofile,perfnom,Btrace,loadrunner 3、監控IO:i

一個TomcatCPU佔用問題的定位

      前段時間專案(交接過來的)釋出了一個大的版本以後,IDC機器CPU不時會突然飆升,而且是“根本停不下來”的樣子,一上去了就是100%。想來也納悶,雖然發了版本,但沒有太耗CPU的功能,不應該會讓CPU一下子從20%左右飆升到100%

linux cpu佔用100%排查

某伺服器上部署了若干tomcat例項,即若干垂直切分的Java站點服務,以及若干Java微服務,突然收到運維的CPU異常告警。 問:如何定位是哪個服務程序導致CPU過載,哪個執行緒導致CPU過載,哪段程式碼導致CPU過載? 步驟一、找到最耗CPU的程序 工具:top 方法:

Java專案伺服器cpu佔用100%解決辦法

 專案上線後執行一段時間,突然發現cpu 8個邏輯核心都佔用100%,心情很緊張,然後就在網上找了一些解決方法,具體如下:         1.查詢哪些程序在耗cpu          進入伺服器,top 命令看一下,發現程序6633佔用了800%         [[e

Linux中模擬診斷OracleCPU佔用

 下面是模擬過程 1,在一個session中模擬CPU高使用率,如下:declare num int:=0; begin loop num:=num+1; end loop; end; /2,在shell視窗用top命令檢視CPU使用情況:  PID USER PR

Java程序故障排查CPU資源佔用,介面響應超時,功能介面停滯等)

故障分析 # 導致系統不可用情況(頻率較大):     1)程式碼中某個位置讀取資料量較大,導致系統記憶體耗盡,進而出現Full GC次數過多,系統緩慢;     2)程式碼中有比較消耗CPU的操作,導致CPU過高,系統執

linux排查java程序佔用CPU原因方法

前言 在運維tomcat伺服器時,我們通常會發現cpu的負載過高,大多數原因是由於java程式碼的bug引起的。可能你的java程式碼有很多,檔案也有很多,一行一行的排查是很費時間的。這時我們就可以使用jstack、top等工具對引起問題的程式碼進行定位,

weblogic下java程序占用cpu的問題排查

技術 .com htm http 執行命令 roo monitor The tin 1、cpu使用情況如圖: 2、執行命令 :jstack 126624 > cpu1112.log (註意執行此命令時的用戶需為執行進程的用戶,所以此處需要用weblogi

linux檢視java程序cpu佔用

 linux下查詢java程序佔用CPU過高原因1. 查詢程序top檢視程序佔用資源情況明顯看出java的兩個程序22714,12406佔用過高cpu. 2.查詢執行緒使用top -H -p <pid>檢視執行緒佔用情況 3.查詢java的堆疊資訊將執行緒id轉換成十