1. 程式人生 > >Java程式導致伺服器CPU佔用率過高的問題

Java程式導致伺服器CPU佔用率過高的問題

1、故障現象

客服同事反饋平臺系統執行緩慢,網頁卡頓嚴重,多次重啟系統後問題依然存在,使用top命令檢視伺服器情況,發現CPU佔用率過高。

2、CPU佔用過高問題定位

2.1、定位問題程序

使用top命令檢視資源佔用情況,發現pid為14063的程序佔用了大量的CPU資源,CPU佔用率高達776.1%,記憶體佔用率也達到了29.8%


[[email protected] ~]$ top
top - 14:51:10 up 233 days, 11:40,  7 users,  load average: 6.85, 5.62, 3.97
Tasks: 192 total,   2 running, 190 sleeping,   0 stopped,   0 zombie
%Cpu(s): 97.3 us,  0.3 sy,  0.0 ni,  2.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16268652 total,  5114392 free,  6907028 used,  4247232 buff/cache
KiB Swap:  4063228 total,  3989708 free,    73520 used.  8751512 avail Mem 
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                               

14063 ylp       20   0 9260488 4.627g  11976 S 776.1 29.8 117:41.66 java    

2.2、定位問題執行緒

使用ps -mp pid -o THREAD,tid,time命令檢視該程序的執行緒情況,發現該程序的多個執行緒佔用率很高


[[email protected] ~]$ ps -mp 14063 -o THREAD,tid,time
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
ylp       361   -    - -         -      -     - 02:05:58
ylp       0.0  19    - futex_    -      - 14063 00:00:00
ylp       0.0  19    - poll_s    -      - 14064 00:00:00
ylp      44.5  19    - -         -      - 14065 00:15:30
ylp      44.5  19    - -         -      - 14066 00:15:30
ylp      44.4  19    - -         -      - 14067 00:15:29
ylp      44.5  19    - -         -      - 14068 00:15:30
ylp      44.5  19    - -         -      - 14069 00:15:30
ylp      44.5  19    - -         -      - 14070 00:15:30
ylp      44.5  19    - -         -      - 14071 00:15:30
ylp      44.6  19    - -         -      - 14072 00:15:32
ylp       2.2  19    - futex_    -      - 14073 00:00:46
ylp       0.0  19    - futex_    -      - 14074 00:00:00
ylp       0.0  19    - futex_    -      - 14075 00:00:00
ylp       0.0  19    - futex_    -      - 14076 00:00:00
ylp       0.7  19    - futex_    -      - 14077 00:00:15

從輸出資訊可以看出,14065~14072之間的執行緒CPU佔用率都很高

2.3、檢視問題執行緒堆疊

挑選TID為14065的執行緒,檢視該執行緒的堆疊情況,先將執行緒id轉為16進位制,使用printf "%x\n" tid命令進行轉換


[[email protected] ~]$ printf "%x\n" 14065
36f1

再使用jstack命令列印執行緒堆疊資訊,命令格式:jstack pid |grep tid -A 30


[[email protected] ~]$ jstack 14063 |grep 36f1 -A 30
"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007fa35001e800 nid=0x36f1 runnable 
"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007fa350020800 nid=0x36f2 runnable 
"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007fa350022800 nid=0x36f3 runnable 
"GC task thread#3 (ParallelGC)" prio=10 tid=0x00007fa350024000 nid=0x36f4 runnable 
"GC task thread#4 (ParallelGC)" prio=10 tid=0x00007fa350026000 nid=0x36f5 runnable 
"GC task thread#5 (ParallelGC)" prio=10 tid=0x00007fa350028000 nid=0x36f6 runnable 
"GC task thread#6 (ParallelGC)" prio=10 tid=0x00007fa350029800 nid=0x36f7 runnable 
"GC task thread#7 (ParallelGC)" prio=10 tid=0x00007fa35002b800 nid=0x36f8 runnable 
"VM Periodic Task Thread" prio=10 tid=0x00007fa3500a8800 nid=0x3700 waiting on condition 

JNI global references: 392

從輸出資訊可以看出,此執行緒是JVM的gc執行緒。此時可以基本確定是記憶體不足或記憶體洩露導致gc執行緒持續執行,導致CPU佔用過高。
所以接下來我們要找的記憶體方面的問題

3、記憶體問題定位

3.1、使用jstat -gcutil命令檢視程序的記憶體情況


[[email protected] ~]$ jstat -gcutil 14063 2000 10

  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00 100.00  99.99  26.31     42   21.917   218 1484.830 1506.747
  0.00   0.00 100.00  99.99  26.31     42   21.917   218 1484.830 1506.747
  0.00   0.00 100.00  99.99  26.31     42   21.917   219 1496.567 1518.484
  0.00   0.00 100.00  99.99  26.31     42   21.917   219 1496.567 1518.484
  0.00   0.00 100.00  99.99  26.31     42   21.917   219 1496.567 1518.484
  0.00   0.00 100.00  99.99  26.31     42   21.917   219 1496.567 1518.484
  0.00   0.00 100.00  99.99  26.31     42   21.917   219 1496.567 1518.484
  0.00   0.00 100.00  99.99  26.31     42   21.917   220 1505.439 1527.355
  0.00   0.00 100.00  99.99  26.31     42   21.917   220 1505.439 1527.355
  0.00   0.00 100.00  99.99  26.31     42   21.917   220 1505.439 1527.355

從輸出資訊可以看出,Eden區記憶體佔用100%,Old區記憶體佔用99.99%,Full GC的次數高達220次,並且頻繁Full GC,Full GC的持續時間也特別長,平均每次Full GC耗時6.8秒(1505.439/220)。根據這些資訊,基本可以確定是程式程式碼上出現了問題,可能存在不合理建立物件的地方

3.2、分析堆疊

使用jstack命令檢視程序的堆疊情況


[[email protected] ~]$ jstack 14063 >>jstack.out

把jstack.out檔案從伺服器拿到本地後,用編輯器查詢帶有專案目錄並且執行緒狀態是RUNABLE的相關資訊,從圖中可以看出ActivityUtil.java類的447行正在使用HashMap.put()方法

Paste_Image.png

3.3、程式碼定位

開啟專案工程,找到ActivityUtil類的477行,程式碼如下:

Paste_Image.png

找到相關同事瞭解後,這段程式碼會從資料庫中獲取配置,並根據資料庫中remain的值進行迴圈,在迴圈中會一直對HashMap進行put操作。

查詢資料庫中的配置,發現remain的數量巨大

Paste_Image.png

至此,問題定位完畢。

相關推薦

線上Java程式導致伺服器CPU用率的問題排除過程

1、故障現象 客服同事反饋平臺系統執行緩慢,網頁卡頓嚴重,多次重啟系統後問題依然存在,使用top命令檢視伺服器情況,發現CPU佔用率過高。 2、CPU佔用過高問題定位 2.1、定位問題程序 使用top命令檢視資源佔用情況,發現pid為14063的程序佔用了大量的CPU

Java程式導致伺服器CPU用率的問題

1、故障現象 客服同事反饋平臺系統執行緩慢,網頁卡頓嚴重,多次重啟系統後問題依然存在,使用

記一次Spring Websocket後臺伺服器CPU用率的問題排查過程

背景 最近在做Spring Websocket後臺程式的壓力測試,但是當併發數目在10個左右時,伺服器的CPU使用率一直在160%+,出現這個問題後,一開始很納悶,雖然伺服器配置很低,但也不至於只有10個併發吧。。伺服器的主要配置如下: CPU:2核 In

Sublime Text 3 CPU用率 && WebStorm記憶體佔用

  用Sublime Text 3或WebStorm進行前端開發時,遇到了同樣的問題:當專案檔案比較多或檔案比較大時,CPU佔用率或記憶體佔用持續比較高,後來經查閱發現是index files導致的,可以理解為:Sublime Text 3或WebStorm需要不斷重新整理檔案索引,不斷將專案檔案從硬碟中讀到

JVM FULL GC太頻繁,CPU用率問題

一,問題描述    今天上午時候,kafka的一個topic湧上來超過平常值的一堆資料,消費客戶端就開始出現了幾個明顯的問題:       1,首先是ZK連線超時       2,CPU飆升到400% 

線上Java程序導致服務器CPU用率的問題排除過程

pid rem www fin mage 程序代碼 print 故障現象 read 博文轉至:http://www.jianshu.com/p/3667157d63bb,博文更好效果看原版,轉本博文的目的就算是個書簽吧,需要時候可以定位原文學習 1、故障現象 客服同

記一次線上Java程序導致服務器CPU用率的問題排除過程

tasks all lob jstat rip 進行 runable tails 分享圖片 https://blog.csdn.net/u013991521/article/details/52781423 1、故障現象 客服同事反饋平臺系統運行緩慢,網頁卡頓嚴重,多次重啟

java獲取JVM的CPU用率、記憶體用率、執行緒數及伺服器的網口吞吐率、磁碟讀寫速率

怎麼說呢,本人菜鳥一枚,費了幾天時間,終於做了一個用java獲取JVM的CPU佔用率、記憶體佔用率、執行緒數及伺服器的網口吞吐率、磁碟讀寫速率的實現。 其中windows環境下獲取jvm 的cpu佔用率這裡是參考網上別人的東西(在此感謝提供參考的網友),其他的都是基於自己的想法做出來的。該工具類

IIS解決CPU和記憶體用率的問題

發現程序中的w3wp佔用率過高。   經過查詢,發現如下:   w3wp.exe是在IIS(因特網資訊伺服器)與應用程式池相關聯的一個程序,如果你有多個應用程式池,就會有對應的多個w3wp.exe的程序例項執行。這個程序用來分配大量的系統資源。這個程序對於系統的穩定和安

伺服器 ECS Linux 系統 CPU 用率問題排查思路

如果雲伺服器 ECS Linux 系統的 CPU 持續跑高,則會對系統穩定性和業務執行造成影響。本文對 CPU 佔用率較高問題的排查分析做簡要說明。可以通過 vmstat 從系統維度檢視 CPU 資源的使用情況。用法說明:格式:vmstat -n 1-n 1表示結果一秒重新整理一次。示例輸出:$ vmstat

壓力測試過程中MySQL服務CPU用率的問題排查思路

建立索引 效果 mysql服務器 還要 數據庫服務 如果 頻率 water vpd 〇、經驗總結: 在關註業務接口的TPS時,也要關註數據庫服務器的QPS。如果一個業務流程裏包含多條查詢,那麽業務接口TPS的上升對數據庫服務器QPS的放大效應會很明顯。 如果查詢結果集不大

Linux 系統 CPU 用率問題排查思路

CPU負載檢視方法: 使用vmstat檢視系統維度的CPU負載 使用top檢視程序維度的CPU負載 使用 vmstat 檢視系統緯度的 CPU 負載: 可以通過 vmstat 從系統維度檢視 CPU 資源的使用情況。 用法說明: 格式:vmstat -n 1# -n 1

【轉】Linux下java程序CPU用率分析方法

文章轉載的地址: https://blog.linuxeye.cn/343.html   在工作當中,肯定會遇到由程式碼所導致的高CPU耗用以及記憶體溢位的情況。這種情況發生時,我們怎麼去找出原因並解決。 一般解決方法是通過top命令找出消耗資源高的執行緒id,利用strace命令檢視該執行緒

Java獲取CPU用率

原文連結:https://www.jianshu.com/p/015cc4805e29 最近做一個Java效能統計的問題,需要統計當前程序佔用CPU的情況,最開始使用Java MxBean來獲取 OperatingSystemMXBean osMxBean = ManagementFactory

Java 獲取 CPU 用率

轉自:https://www.jianshu.com/p/015cc4805e29 最近做一個Java效能統計的問題,需要統計當前程序佔用CPU的情況,最開始使用Java MxBean來獲取: OperatingSystemMXBean osMxBean = ManagementFactor

寫一個守護程序+cpu用率在20%波動的程式

1.cpu佔用率在20%波動的程式怎麼寫 //makecpu.c void makeCpu() { int time_start; int fulltime = 100;//總時間

如何定位cpu用率java執行緒

檢視cup的使用情況,在Linux下可以使用 top 或者 htop命令 top -u ${使用者} -c top -u devops -c 在命令列提示符執行top命令,輸入大寫P,

JAVA控制CPU用率(程式設計之美有感)(二)

JAVA控制CPU佔用率(程式設計之美有感)(二)   繼續上次的電腦CPU控制,很遺憾更新的有點慢,雖然我知道沒人看,最近專案上任務有點多,所以時間少了點,不過我是達不到目的是不會放棄的!   上次勉強能達到有點類似於直線的CPU佔用率控制圖,但是這只是所有CP

一行命令讓CPU用率達到100%

一行命令讓CPU佔用率達到100% for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/dev/null & done 說明:

記一次CPU用率和load的排查

  前不久公司進行了一次大促,晚上值班。大促是從晚上8點多開始的,一開始流量慢慢的進來,觀察了應用的各項指標,一切都是正常的,因為這是雙11過後的第一次大促,想著使用者的購買慾應該不會太強,所以我們的運維同事9點多就回家了在家裡面遠端支援,留下交易組和其它後端的技術值班,樓主就是交易組的。誰知10點整的時候我