成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Linux系統(tǒng)Java進(jìn)程CPU高消耗問題分析

IT那活兒 / 2555人閱讀
Linux系統(tǒng)Java進(jìn)程CPU高消耗問題分析
[
概     述
]


當(dāng)應(yīng)用系統(tǒng)出現(xiàn)卡頓或者應(yīng)用程序響應(yīng)速度非常慢的時候,我們需要登錄到應(yīng)用所在主機(jī)進(jìn)行查看、分析問題原因。


常用來排查Java進(jìn)程問題命令:


  • 使用top命令查看主機(jī)資源總體使用情況,及相關(guān)Java進(jìn)程占用主機(jī)資源情況;

  • 使用vmstat 2 5命令查看主機(jī)CPU、內(nèi)存使用率;


  • 使用df -h命令查看主機(jī)文件系統(tǒng)使用率;

  • 使用netstat -na命令收集主機(jī)網(wǎng)絡(luò)連接情況;

  • 使用pstree -p PID | wc -l查看占用CPU資源較高的進(jìn)程內(nèi)的線程數(shù);

  • 使用${JAVA_HOME}/bin/jstat -gcutil PID 1000 10查看占用CPU資源較高的進(jìn)程GC情況;


  • 使用${JAVA_HOME}/bin/jmap -dump:live,format=b,file=PID.hprof PID導(dǎo)出占用CPU資源較高的進(jìn)程堆快照信息,用來統(tǒng)計當(dāng)前JVM堆中存放了哪些對象信息;


  • 使用${JAVA_HOME}/bin/jstack PID > stack_PID.log導(dǎo)出占用CPU資源較高的線程??煺招畔?,來最終定位占用CPU過高的代碼模塊。


[
常見CPU高消耗原因
]


1、大量高并發(fā)密集型計算

2、高并發(fā)的I/O讀寫

3、堆內(nèi)存無法有效回收,F(xiàn)ULLGC頻繁

4、程序死循環(huán)

5、程序邏輯請求堵塞


[
分   析   方   法
]


案例1:Java進(jìn)程耗用CPU高,但未觸發(fā)FULLGC的情況

1、查看進(jìn)程使用CPU、MEM情況

使用命令:top

可以看到PID為4267,USER為dform的進(jìn)程CPU使用率高達(dá)1464.2%(即消耗當(dāng)前主機(jī)14.64個CPU),嚴(yán)重超高。使用命令cat/proc/cpuinfo | grep processor |wc –l 可查看當(dāng)前主機(jī)邏輯CPU個數(shù)。


2、根據(jù)問題進(jìn)程的PID查詢該進(jìn)程的線程使用CPU、MEM情況

使用命令:top-p 4267-H

紅框標(biāo)出的10幾個線程耗用CPU都接近或者超過了100%(即該進(jìn)程下有10幾個線程耗用CPU都高達(dá)1個左右)。


3、導(dǎo)出問題進(jìn)程的線程棧信息

使用命令:

連續(xù)導(dǎo)出多個線程棧(stack)快照文件,每次導(dǎo)出間隔5s-10s

${JAVA_HOME}/bin/jstack4267 > stack_4267_1.log

${JAVA_HOME}/bin/jstack4267 > stack_4267_2.log

${JAVA_HOME}/bin/jstack4267 > stack_4267_3.log


4、將問題線程的PID(十進(jìn)制)轉(zhuǎn)換成十六進(jìn)制的nid

使用命令:我們選取如下兩個線程為例


(1)線程PID4477,轉(zhuǎn)換之后的十六進(jìn)制nid為117d

printf "%x "4477


(2)線程PID4542,轉(zhuǎn)換之后的十六進(jìn)制nid為11be


5、根據(jù)nid在第3步中導(dǎo)出的線程棧(stack)快照文件中查找對應(yīng)的線程



(1)根據(jù)nid=0x117d查找到正在運(yùn)行的程序代碼模塊,紅框標(biāo)出是該線程最后正在做的事物(線程執(zhí)行順序要從下向上看),綠框標(biāo)出是應(yīng)用側(cè)代碼模塊。


(2)同理,根據(jù)nid=0x11be查找到正在運(yùn)行的程序代碼模塊


最后將上述分析結(jié)果和線程棧(stack)快照文件一并反饋給應(yīng)用側(cè)核查和處理。


案例2:Java進(jìn)程耗用CPU高,而且頻繁觸發(fā)FULLGC的情況

導(dǎo)致Java進(jìn)程頻繁FULLGC的原因有:


(1)應(yīng)用代碼邏輯設(shè)計不合理,對象創(chuàng)建太多,而且對象使用完后未及時釋放資源,或者已不再有用的對象相互之間存在引用,導(dǎo)致該對象無法進(jìn)行回收;


(2)消費(fèi)者消費(fèi)速度慢(或停止消費(fèi)),而生產(chǎn)者不斷往隊列中投遞任務(wù),導(dǎo)致隊列中任務(wù)累積過多,任務(wù)對象占用堆內(nèi)存太多而產(chǎn)生FULLGC;


(3)應(yīng)用進(jìn)程創(chuàng)建線程太多(每個線程需要分配線程棧內(nèi)存),也可能導(dǎo)致內(nèi)存溢出OOM,觸發(fā)FULLGC;


注:分析FULLGC的問題,除了要分析案例1中的線程棧(stack)快照信息外,還要導(dǎo)出JVM堆(heap)進(jìn)行分析。


1、使用命令:導(dǎo)出JVM堆(heap)快照信息

${JAVA_HOME}/bin/jmapdump:live,format=b,file=17074.hprof17074

注:堆(heap)快照文件一般都比較大,有幾個G大?。ɑ竞蛥?shù)-Xmx設(shè)置大小一致)。


2、使用Java堆分析工具M(jìn)AT(MemoryAnalyzer tool)分析堆內(nèi)存中對象占用情況

通過對堆內(nèi)存快照文件17074.hprof的分析,發(fā)現(xiàn)有以下一些對象占用內(nèi)存較多:


結(jié)合日志信息分析,應(yīng)用一次性經(jīng)過代理節(jié)點從數(shù)據(jù)節(jié)點中獲取大量數(shù)據(jù)到堆內(nèi)存中,并同時幾條請求同時進(jìn)行,該代理節(jié)點出現(xiàn)JVM堆內(nèi)數(shù)據(jù)占用較大導(dǎo)致內(nèi)存溢出,F(xiàn)ULLGC無法回收,此后一直頻繁FullGC。另根據(jù)GC信息分析,大約7個小時就會有一次較多請求刷新導(dǎo)致內(nèi)存占用過多的情況。


最后將分析結(jié)果反饋給應(yīng)用側(cè)核查和處理。


[
處理建議
]


1、結(jié)合中間件側(cè)分析結(jié)果應(yīng)用側(cè)核查對應(yīng)的代碼模塊中是否有多線程高并發(fā)或者涉及網(wǎng)絡(luò)間IO等,導(dǎo)致線程CPU耗用高的代碼,并優(yōu)化;


2、結(jié)合中間件側(cè)分析結(jié)果應(yīng)用側(cè)核查相應(yīng)的代碼模塊所涉及的業(yè)務(wù)是否存在邏輯問題,并優(yōu)化;


3、對于長時間處于CPU高消耗的進(jìn)程,收集完top、線程棧(stack)快照、堆(heap)快照等信息之后,可找合適時間重啟該進(jìn)程。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/130177.html

相關(guān)文章

  • 學(xué)點虛擬化知識

    摘要:虛擬化技術(shù)是業(yè)務(wù)發(fā)展到一定階段,互聯(lián)網(wǎng)企業(yè)必然會使用的技術(shù)。混部當(dāng)然也有一些問題,例如同一臺物理機(jī)上應(yīng)用被應(yīng)用突來的高峰所影響,周期被搶光,莫名其妙的負(fù)載升高?;觳坑袝r也不是一開始就能規(guī)劃好的,最好能動態(tài)調(diào)整,這樣就能通過虛擬化技術(shù)來做。 showImg(https://segmentfault.com/img/bVu8fH);虛擬化技術(shù)是業(yè)務(wù)發(fā)展到一定階段,互聯(lián)網(wǎng)企業(yè)必然會使用的技術(shù)...

    TerryCai 評論0 收藏0
  • Java多線程的一些理解

    摘要:線程僅僅被視為一個與其他進(jìn)程共享某些資源的進(jìn)程。穩(wěn)定性可創(chuàng)建的線程的數(shù)量上存在限制,包括的啟動參數(shù)操作系統(tǒng)對線程的限制,如果超出這些限制,很可能會拋出異常。若是密集型程序產(chǎn)生大量的線程切換,將會降低系統(tǒng)的吞吐量。 OS中的進(jìn)程、線程 進(jìn)程:即處于執(zhí)行期的程序,且包含其他資源,如打開的文件、掛起的信號、內(nèi)核內(nèi)部數(shù)據(jù)、處理器狀態(tài)、內(nèi)核地址空間、一個或多個執(zhí)行的線程、數(shù)據(jù)段。 線程:進(jìn)程中...

    Nekron 評論0 收藏0

發(fā)表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<