日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

線上CPU飆升100%問題排查,一篇足矣

 

一、引子

對于互聯網公司,線上CPU飆升的問題很常見(例如某個活動開始,流量突然飆升時),按照本文的步驟排查,基本1分鐘即可搞定!特此整理排查方法一篇,供大家參考討論提高。

二、問題復現

線上系統突然運行緩慢,CPU飆升,甚至到100%,以及Full GC次數過多,接著就是各種報警:例如接口超時報警等。此時急需快速線上排查問題。

三、問題排查

不管什么問題,既然是CPU飆升,肯定是查一下耗CPU的線程,然后看看GC。

3.1 核心排查步驟

1.執行“top”命令:查看所有進程占系統CPU的排序。極大可能排第一個的就是咱們的JAVA進程(COMMAND列)。PID那一列就是進程號。

2.執行“top -Hp 進程號”命令:查看java進程下的所有線程占CPU的情況。

3.執行“printf "%xn 10"命令 :后續查看線程堆棧信息展示的都是十六進制,為了找到咱們的線程堆棧信息,咱們需要把線程號轉成16進制。例如,printf "%xn 10-》打印:a,那么在jstack中線程號就是0xa.

4.執行 “jstack 進程號 | grep 線程ID” 查找某進程下-》線程ID(jstack堆棧信息中的nid)=0xa的線程堆棧信息。如果“"VM Thread" os_prio=0 tid=0x00007f871806e000 nid=0xa runnable”,第一個雙引號圈起來的就是線程名,如果是“VM Thread”這就是虛擬機GC回收線程了

5.執行“jstat -gcutil 進程號 統計間隔毫秒 統計次數(缺省代表一致統計)”,查看某進程GC持續變化情況,如果發現返回中FGC很大且一直增大-》確認Full GC! 也可以使用“jmap -heap 進程ID”查看一下進程的堆內從是不是要溢出了,特別是老年代內從使用情況一般是達到閾值(具體看垃圾回收器和啟動時配置的閾值)就會進程Full GC。

6.執行“jmap -dump:format=b,file=filename 進程ID”,導出某進程下內存heap輸出到文件中。可以通過eclipse的mat工具查看內存中有哪些對象比較多。

3.2 原因分析

1.內存消耗過大,導致Full GC次數過多

執行步驟1-5:

  • 多個線程的CPU都超過了100%,通過jstack命令可以看到這些線程主要是垃圾回收線程-》上一節步驟2
  • 通過jstat命令監控GC情況,可以看到Full GC次數非常多,并且次數在不斷增加。--》上一節步驟5

確定是Full GC,接下來找到具體原因

  • 生成大量的對象,導致內存溢出-》執行步驟6,查看具體內存對象占用情況。
  • 內存占用不高,但是Full GC次數還是比較多,此時可能是代碼中手動調用 System.gc()導致GC次數過多,這可以通過添加 -XX:+DisableExplicitGC來禁用JVM對顯示GC的響應。

2.代碼中有大量消耗CPU的操作,導致CPU過高,系統運行緩慢;

執行步驟1-4:在步驟4jstack,可直接定位到代碼行。例如某些復雜算法,甚至算法BUG,無限循環遞歸等等。

3.由于鎖使用不當,導致死鎖。

執行步驟1-4: 如果有死鎖,會直接提示。關鍵字:deadlock.步驟四,會打印出業務死鎖的位置。

造成死鎖的原因:最典型的就是2個線程互相等待對方持有的鎖。

4.隨機出現大量線程訪問接口緩慢。

代碼某個位置有阻塞性的操作,導致該功能調用整體比較耗時,但出現是比較隨機的;平時消耗的CPU不多,而且占用的內存也不高。

思路:

首先找到該接口,通過壓測工具不斷加大訪問力度,大量線程將阻塞于該阻塞點。

執行步驟1-4:

"http-nio-8080-exec-4" #31 daemon prio=5 os_prio=31 tid=0x00007fd08d0fa000 nid=0x6403 waiting on condition [0x00007000033db000]
 java.lang.Thread.State: TIMED_WAITING (sleeping)-》期限等待
 at java.lang.Thread.sleep(Native Method)
 at java.lang.Thread.sleep(Thread.java:340)
 at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
 at com.*.user.controller.UserController.detail(UserController.java:18)-》業務代碼阻塞點

如上圖,找到業務代碼阻塞點,這里業務代碼使用了TimeUnit.sleep()方法,使線程進入了TIMED_WAITING(期限等待)狀態。

5.某個線程由于某種原因而進入WAITING狀態,此時該功能整體不可用,但是無法復現;

執行步驟1-4:jstack多查詢幾次,每次間隔30秒,對比一直停留在parking 導致的WAITING狀態的線程。例如CountDownLatch倒計時器,使得相關線程等待->AQS->LockSupport.park()。

"Thread-0" #11 prio=5 os_prio=31 tid=0x00007f9de08c7000 nid=0x5603 waiting on condition [0x0000700001f89000] 
java.lang.Thread.State: WAITING (parking) ->無期限等待
at sun.misc.Unsafe.park(Native Method) 
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304) 
at com.*.SyncTask.lambda$main$0(SyncTask.java:8)-》業務代碼阻塞點
at com.*.SyncTask$$Lambda$1/1791741888.run(Unknown Source) 
at java.lang.Thread.run(Thread.java:748)

分享到:
標簽:飆升 CPU
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定