中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

通過(guò) jstack 與 jmap 分析一次線上故障

2018-07-02    來(lái)源:importnew

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

一、發(fā)現(xiàn)問(wèn)題

下面是線上機(jī)器的cpu使用率,可以看到從4月8日開始,隨著時(shí)間cpu使用率在逐步增高,最終使用率達(dá)到100%導(dǎo)致線上服務(wù)不可用,后面重啟了機(jī)器后恢復(fù)。

二、排查思路

簡(jiǎn)單分析下可能出問(wèn)題的地方,分為5個(gè)方向:

  1. 系統(tǒng)本身代碼問(wèn)題
  2. 內(nèi)部下游系統(tǒng)的問(wèn)題導(dǎo)致的雪崩效應(yīng)
  3. 上游系統(tǒng)調(diào)用量突增
  4. http請(qǐng)求第三方的問(wèn)題
  5. 機(jī)器本身的問(wèn)題

三、開始排查

  1. 查看日志,沒(méi)有發(fā)現(xiàn)集中的錯(cuò)誤日志,初步排除代碼邏輯處理錯(cuò)誤。
  2. 首先聯(lián)系了內(nèi)部下游系統(tǒng)觀察了他們的監(jiān)控,發(fā)現(xiàn)一起正常。可以排除下游系統(tǒng)故障對(duì)我們的影響。
  3. 查看provider接口的調(diào)用量,對(duì)比7天沒(méi)有突增,排除業(yè)務(wù)方調(diào)用量的問(wèn)題。
  4. 查看tcp監(jiān)控,TCP狀態(tài)正常,可以排除是http請(qǐng)求第三方超時(shí)帶來(lái)的問(wèn)題。
  5. 查看機(jī)器監(jiān)控,6臺(tái)機(jī)器cpu都在上升,每個(gè)機(jī)器情況一樣。排除機(jī)器故障問(wèn)題。

即通過(guò)上述方法沒(méi)有直接定位到問(wèn)題。

四、解決方案

1.重啟了6臺(tái)中問(wèn)題比較嚴(yán)重的5臺(tái)機(jī)器,先恢復(fù)業(yè)務(wù)。保留一臺(tái)現(xiàn)場(chǎng),用來(lái)分析問(wèn)題。

2.查看當(dāng)前的tomcat線程pid

3.查看該pid下線程對(duì)應(yīng)的系統(tǒng)占用情況。top -Hp 384

4.發(fā)現(xiàn)pid 4430 4431 4432 4433 線程分別占用了約40%的cpu

5.將這幾個(gè)pid轉(zhuǎn)為16進(jìn)制,分別為114e 114f 1150 1151

6.下載當(dāng)前的java線程棧 sudo -u tomcat jstack -l 384>/1.txt

7.查詢5中對(duì)應(yīng)的線程情況,發(fā)現(xiàn)都是gc線程導(dǎo)致的?

8.dump java堆數(shù)據(jù)

sudo -u tomcat jmap -dump:live,format=b,file=/dump201612271310.dat 384

9.使用MAT加載堆文件,可以看到j(luò)avax.crypto.JceSecurity對(duì)象占用了95%的內(nèi)存空間,初步定位到問(wèn)題。

MAT下載地址:http://www.eclipse.org/mat/

?10.查看類的引用樹,看到BouncyCastleProvider對(duì)象持有過(guò)多。即我們代碼中對(duì)該對(duì)象的處理方式是錯(cuò)誤的,定位到問(wèn)題。

五、代碼分析

我們代碼中有一塊是這樣寫的

這是加解密的功能,每次運(yùn)行加解密都會(huì)new一個(gè)BouncyCastleProvider對(duì)象,放倒Cipher.getInstance()方法中。

看下Cipher.getInstance()的實(shí)現(xiàn),這是jdk的底層代碼實(shí)現(xiàn),追蹤到JceSecurity類中

?

verifyingProviders每次put后都會(huì)remove,verificationResults只會(huì)put,不會(huì)remove.

看到verificationResults是一個(gè)static的map,即屬于JceSecurity類的。

所以每次運(yùn)行到加解密都會(huì)向這個(gè)map put一個(gè)對(duì)象,而這個(gè)map屬于類的維度,所以不會(huì)被GC回收。這就導(dǎo)致了大量的new的對(duì)象不被回收。

六、代碼改進(jìn)

將有問(wèn)題的對(duì)象置為static,每個(gè)類持有一個(gè),不會(huì)多次新建。

七、本文總結(jié)

遇到線上問(wèn)題不要慌,首先確認(rèn)排查問(wèn)題的思路:

  1. 查看日志
  2. 查看CPU情況
  3. 查看TCP情況
  4. 查看java線程,jstack
  5. 查看java堆,jmap
  6. 通過(guò)MAT分析堆文件,尋找無(wú)法被回收的對(duì)象

標(biāo)簽: 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:ERROR 1044 (42000) : Access denied for user ‘root’@'localhost’

下一篇:kafka源碼分析4 : broker處理生產(chǎn)請(qǐng)求