开心六月综合激情婷婷|欧美精品成人动漫二区|国产中文字幕综合色|亚洲人在线成视频

    1. 
      
        <b id="zqfy3"><legend id="zqfy3"><fieldset id="zqfy3"></fieldset></legend></b>
          <ul id="zqfy3"></ul>
          <blockquote id="zqfy3"><strong id="zqfy3"><dfn id="zqfy3"></dfn></strong></blockquote>
          <blockquote id="zqfy3"><legend id="zqfy3"></legend></blockquote>
          打開APP
          userphoto
          未登錄

          開通VIP,暢享免費電子書等14項超值服

          開通VIP
          重啟大法好!線上常見問題排查手冊


          一  線上常見問題定位

          常見問題 1:CPU 利用率高

          CPU 使用率是衡量系統(tǒng)繁忙程度的重要指標,一般情況下單純的 CPU 高并沒有問題,它代表系統(tǒng)正在不斷的處理我們的任務(wù),但是如果 CPU 過高,導(dǎo)致任務(wù)處理不過來,從而引起 load 高,這個是非常危險需要關(guān)注的。 CPU 使用率的安全值沒有一個標準值,取決于你的系統(tǒng)是計算密集型還是 IO 密集型,一般計算密集型應(yīng)用 CPU 使用率偏高 load 偏低,IO 密集型相反。

          問題原因及定位:

          1  頻繁 FullGC/YongGC

          • 查看 gc 日志

          • jstat -gcutil pid  查看內(nèi)存使用和 gc 情況


          2  代碼消耗,如死循環(huán),md5 等內(nèi)存態(tài)操作

          1)arthas (已開源:https://github.com/alibaba/arthas)

          • thread -n 5  查看 CPU 使用率最高的前 5 個線程(包含堆棧,第二部分有詳解)

          2)jstack 查找

          • ps -ef | grep java  找到 Java 進程 id

          • top -Hp pid  找到使用 CPU 最高的線程

          • printf ‘0x%x’  tid  線程 id 轉(zhuǎn)化 16 進制

          • jstack pid | grep tid  找到線程堆棧

                             


          ps:輸入“1”可查看每個 CPU 的情況,之前有團隊遇到單個 CPU 被中間件綁定導(dǎo)致 CPU 飚高的 case。

          常見問題 2:load 高

          load 指單位時間內(nèi)活躍進程數(shù),包含運行態(tài)(runnable 和 running)和不可中斷態(tài)( IO、內(nèi)核態(tài)鎖)。關(guān)鍵字是運行態(tài)和不可中斷態(tài),運行態(tài)可以聯(lián)想到 Java 線程的 6 種狀態(tài),如下,線程 new 之后處于 NEW 狀態(tài),執(zhí)行 start 進入 runnable 等待 CPU 調(diào)度,因此如果 CPU 很忙會導(dǎo)致 runnable 進程數(shù)增加;不可中斷態(tài)主要包含網(wǎng)絡(luò) IO、磁盤 IO 以及內(nèi)核態(tài)的鎖,如 synchronized 等。


          問題原因及定位:

          1  CPU 利用率高,可運行態(tài)進程數(shù)多

          • 排查方法見常見問題一

          2  iowait,等待 IO

          • vmstat  查看 blocked 進程狀況

          • jstack -l pid | grep BLOCKED  查看阻塞態(tài)線程堆棧


          3  等待內(nèi)核態(tài)鎖,如 synchronized

          • jstack -l pid | grep BLOCKED  查看阻塞態(tài)線程堆棧


          • profiler  dump 線程棧,分析線程持鎖情況


          常見問題 3:持續(xù) FullGC

          在了解 FullGC 原因之前,先花一點時間回顧下 jvm 的內(nèi)存相關(guān)知識:

          內(nèi)存模型

          新 new 的對象放在 Eden 區(qū),當 Eden 區(qū)滿之后進行一次 MinorGC,并將存活的對象放入 S0;


          當下一次 Eden 區(qū)滿的時候,再次進行 MinorGC,并將存活的對象和 S0 的對象放入S1(S0 和 S1 始終有一個是空的);


          依次循環(huán)直到 S0 或者 S1 快滿的時候?qū)ο蠓湃?old 區(qū),依次,直到 old 區(qū)滿進行 FullGC。


          jdk1.7 之前 Java 類信息、常量池、靜態(tài)變量存儲在 Perm 永久代,類的原數(shù)據(jù)和靜態(tài)變量在類加載的時候放入 Perm 區(qū),類卸載的時候清理;在 1.8 中,MetaSpace 代替 Perm 區(qū),使用本地內(nèi)存,常量池和靜態(tài)變量放入堆區(qū),一定程度上解決了在運行時生成或加載大量類造成的 FullGC,如反射、代理、groovy 等。


          回收器

          年輕代常用 ParNew,復(fù)制算法,多線程并行;

          老年代常用 CMS,標記清除算法(會產(chǎn)生內(nèi)存碎片),并發(fā)收集(收集過程中有用戶線程產(chǎn)生對象)。

          關(guān)鍵常用參數(shù)

          • CMSInitiatingOccupancyFraction 表示老年代使用率達到多少時進行 FullGC;


          • UseCMSCompactAtFullCollection 表示在進行 FullGC 之后進行老年代內(nèi)存整理,避免產(chǎn)生內(nèi)存碎片。


          問題原因及定位:

          1  prommotion failed

          從S區(qū)晉升的對象在老年代也放不下導(dǎo)致 FullGC(fgc 回收無效則拋 OOM)。

          1)survivor 區(qū)太小,對象過早進入老年代。

          • jstat -gcutil pid 1000  觀察內(nèi)存運行情況;


          • jinfo pid  查看 SurvivorRatio 參數(shù);


          2)大對象分配,沒有足夠的內(nèi)存。

          • 日志查找關(guān)鍵字 “allocating large”;


          • profiler  查看內(nèi)存概況大對象分布;


          3)old 區(qū)存在大量對象。

          • 實例數(shù)量前十的類:jmap -histo pid | sort -n -r -k 2 | head -10


          • 實例容量前十的類:jmap -histo pid | sort -n -r -k 3 | head -10


          • dump 堆,profiler 分析對象占用情況

          2  concurrent mode failed

          在 CMS GC 過程中業(yè)務(wù)線程將對象放入老年代(并發(fā)收集的特點)內(nèi)存不足。詳細原因:

          1)fgc 觸發(fā)比例過大,導(dǎo)致老年代占用過多,并發(fā)收集時用戶線程持續(xù)產(chǎn)生對象導(dǎo)致達到觸發(fā) FGC 比例。

          • jinfo  查看 CMSInitiatingOccupancyFraction 參數(shù),一般 70~80 即可


          2)老年代存在內(nèi)存碎片。


          • jinfo  查看 UseCMSCompactAtFullCollection 參數(shù),在 FullGC 后整理內(nèi)存


          常見問題 4:線程池滿

          Java 線程池以有界隊列的線程池為例,當新任務(wù)提交時,如果運行的線程少于 corePoolSize,則創(chuàng)建新線程來處理請求。如果正在運行的線程數(shù)等于 corePoolSize 時,則新任務(wù)被添加到隊列中,直到隊列滿。當隊列滿了后,會繼續(xù)開辟新線程來處理任務(wù),但不超過 maximumPoolSize。當任務(wù)隊列滿了并且已開辟了最大線程數(shù),此時又來了新任務(wù),ThreadPoolExecutor 會拒絕服務(wù)。

          問題原因及定位:

          1  下游 RT 高,超時時間不合理

          • 業(yè)務(wù)監(jiān)控

          • sunfire

          • eagleeye


          2  數(shù)據(jù)庫慢 sql 或者數(shù)據(jù)庫死鎖

          • 日志關(guān)鍵字 “Deadlock found when trying to get lock”


          • Jstack 或 zprofiler 查看阻塞態(tài)線程


          3  Java 代碼死鎖

          • jstack –l pid | grep -i –E 'BLOCKED | deadlock'


          • dump thread 通過 zprofiler 分析阻塞線程和持鎖情況


          常見問題 5:NoSuchMethodException

          問題原因及定位:

          1  jar 包沖突

           java 在裝載一個目錄下所有 jar 包時,它加載的順序完全取決于操作系統(tǒng)。

          • mvn dependency:tree  分析報錯方法所在的 jar 包版本,留下新的


          • arthas:sc -d ClassName


          • XX:+TraceClassLoading


          2  同類問題

          • ClassNotFoundException

          • NoClassDefFoundError

          • ClassCastException


          二  常用工具介紹

          常用命令

          1  tail

          • -f   跟蹤文件


          2  grep

          • -i   忽略大小寫


          • -v  反轉(zhuǎn)查找


          • -E  擴展正則表達式 :grep -E 'pattern1|pattern2' filename


          3  pgm

          • -b  開啟并發(fā)


          • -p  指定并發(fā)數(shù)


          • -A  開啟 askpass


          4  awk

          • -F  指定分隔符:awk -F “|”  '{print $1}‘ | sort -r | uniq -c


          5  sed

          • 時間段匹配:sed '/2020-03-02 10:00:00/,/2020-03-02 11:00:00/p' filename


          arthas

          阿里巴巴開源 Java 診斷工具(開源地址:https://github.com/alibaba/arthas),基于 javaAgent 方式,使用 Instrumentation 方式修改字節(jié)碼方式進行 Java 應(yīng)用診斷。

          基礎(chǔ)功能介紹

          • dashboard:系統(tǒng)實時數(shù)據(jù)面板, 可查看線程,內(nèi)存,gc 等信息


          • thread:jvm 線程堆棧信息,如查看最繁忙的前 n 線程


          • getstatic:獲取靜態(tài)屬性值,如 getstatic className attrName 可用于查看線上開關(guān)真實值


          • sc:查看 jvm 已加載類信息,可用于排查 jar 包沖突


          • sm:查看 jvm 已加載類的方法信息


          • jad:反編譯 jvm 加載類信息,排查代碼邏輯沒執(zhí)行原因


          • watch:觀測方法執(zhí)行數(shù)據(jù),包含出入?yún)?,異常等?/p>


          watch xxxClass xxxMethod ' {params, throwExp} '  -e -x 2

          watch xxxClass xxxMethod '{params,returnObj}' 'params[0].sellerId.equals('189')' -x 2

          watch xxxClass xxxMethod sendMsg '@com.taobao.eagleeye.EagleEye@getTraceId()'

          • trace:方法內(nèi)部調(diào)用時長,并輸出每個節(jié)點的耗時,用于性能分析


          • tt:用于記錄方法,并做回放


          三  常見問題恢復(fù)

          1  線程池滿


          • rpc 框架線程池滿


          高 RT 接口進行線程數(shù)限流


          • 應(yīng)用內(nèi)線程池滿


          重啟可短暫緩解,具體還得看問題原因


          2  CPU 高,load 高

          • 單機置換或重啟,可短暫緩解,恢復(fù)看具體原因


          • 集群高且流量大幅增加,擴容,恢復(fù)看具體原因


          3  下游 RT 高

          • 限流


          • 降級


          4  數(shù)據(jù)庫

          • 死鎖


          kill 進程


          • 慢 sql


          sql 限流


          線上問題的排查是一個積累的過程,只有了解問題背后的原理才能更快速的定位和恢復(fù),除此之外更需要有一些趁手的工具來輔助排查,從而降低整個團隊問題定位和快恢的門檻。
          本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
          打開APP,閱讀全文并永久保存 查看更多類似文章
          猜你喜歡
          類似文章
          JAVA 線上故障排查全套路
          Linux系統(tǒng)監(jiān)控命令及如何定位到Java線程
          Java性能問題定位---CPU過高
          jstack分析cpu占用100%(轉(zhuǎn))
          史上最全最詳細的JVM優(yōu)化方案---建議收藏
          記一次springboot 故障:接口無響應(yīng)--》CPU 100%---》log無法寫入---》磁盤滿了
          更多類似文章 >>
          生活服務(wù)
          分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
          綁定賬號成功
          后續(xù)可登錄賬號暢享VIP特權(quán)!
          如果VIP功能使用有故障,
          可點擊這里聯(lián)系客服!

          聯(lián)系客服