<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          "服務(wù)不可用"怎么排查?講了100遍還是記不住?

          共 1829字,需瀏覽 4分鐘

           ·

          2021-02-02 17:07


          作者 |?kingszelda

          來源 |?https://www.cnblogs.com/kingszelda/p/9034191.html?

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

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

          Spring中涉及的設(shè)計模式總結(jié)

          二、排查思路

          簡單分析下可能出問題的地方,分為5個方向:

          1.系統(tǒng)本身代碼問題

          2.內(nèi)部下游系統(tǒng)的問題導(dǎo)致的雪崩效應(yīng)

          3.上游系統(tǒng)調(diào)用量突增

          4.http請求第三方的問題

          5.機器本身的問題

          三、開始排查

          1.查看日志,沒有發(fā)現(xiàn)集中的錯誤日志,初步排除代碼邏輯處理錯誤。

          2.首先聯(lián)系了內(nèi)部下游系統(tǒng)觀察了他們的監(jiān)控,發(fā)現(xiàn)一起正常。可以排除下游系統(tǒng)故障對我們的影響。

          3.查看provider接口的調(diào)用量,對比7天沒有突增,排除業(yè)務(wù)方調(diào)用量的問題。

          4.查看tcp監(jiān)控,TCP狀態(tài)正常,可以排除是http請求第三方超時帶來的問題。

          5.查看機器監(jiān)控,6臺機器cpu都在上升,每個機器情況一樣。排除機器故障問題。

          即通過上述方法沒有直接定位到問題。

          四、解決方案

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

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

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

          據(jù)說這套組合拳,可以把面試官給問懵逼了,你要不要試試?

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

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

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

          7.查詢5中對應(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對象占用了95%的內(nèi)存空間,初步定位到問題。

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


          微信8.0之后,又悄悄上線新功能:別人“搶不到”的紅包!趕緊看看灰度到你了沒?

          10.查看類的引用樹,看到BouncyCastleProvider對象持有過多。即我們代碼中對該對象的處理方式是錯誤的,定位到問題。

          五、代碼分析

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

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

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

          我以為的周末 vs 實際上的周末

          verifyingProviders每次put后都會remove,verificationResults只會put,不會remove.

          蘋果開源代碼中驚現(xiàn)“wechat”,老外注釋的吐槽亮了!

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

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

          六、代碼改進

          將有問題的對象置為static,每個類持有一個,不會多次新建。

          如何寫好注釋,讓同事贊不絕口?

          七、本文總結(jié)

          遇到線上問題不要慌,首先確認排查問題的思路:

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

          往期推薦

          Spring中涉及的設(shè)計模式總結(jié)

          據(jù)說這套組合拳,可以把面試官給問懵逼了,你要不要試試?

          微信8.0之后,又悄悄上線新功能:別人“搶不到”的紅包!趕緊看看灰度到你了沒?

          我以為的周末 vs 實際上的周末

          蘋果開源代碼中驚現(xiàn)“wechat”,老外注釋的吐槽亮了!

          中國男人の數(shù)據(jù)大賞



          瀏覽 31
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰人妻无码 | 国产一级黄片 | 艹屄网| 免费一级aa | 理论片无码|