亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

再一次生產(chǎn) CPU 高負載排查實踐

kviccn / 1723人閱讀

摘要:前言前幾日早上打開郵箱收到一封監(jiān)控報警郵件某某服務(wù)器負載較高,請研發(fā)盡快排查解決,發(fā)送時間正好是凌晨。其實早在去年我也處理過類似的問題,并記錄下來一次生產(chǎn)排查優(yōu)化實踐不過本次問題產(chǎn)生的原因卻和上次不太一樣,大家可以接著往下看。

前言

前幾日早上打開郵箱收到一封監(jiān)控報警郵件:某某 ip 服務(wù)器 CPU 負載較高,請研發(fā)盡快排查解決,發(fā)送時間正好是凌晨。

其實早在去年我也處理過類似的問題,并記錄下來:《一次生產(chǎn) CPU 100% 排查優(yōu)化實踐》

不過本次問題產(chǎn)生的原因卻和上次不太一樣,大家可以接著往下看。

問題分析

收到郵件后我馬上登陸那臺服務(wù)器,看了下案發(fā)現(xiàn)場還在(負載依然很高)。

于是我便利用這類問題的排查套路定位一遍。

首先利用 top -c 將系統(tǒng)資源使用情況實時顯示出來 (-c 參數(shù)可以完整顯示命令)。

接著輸入大寫 P 將應(yīng)用按照 CPU 使用率排序,第一個就是使用率最高的程序。

果不其然就是我們的一個 Java 應(yīng)用。

這個應(yīng)用簡單來說就是定時跑一些報表使的,每天凌晨會觸發(fā)任務(wù)調(diào)度,正常情況下幾個小時就會運行完畢。

常規(guī)操作第二步自然是得知道這個應(yīng)用中最耗 CPU 的線程到底再干嘛。

利用 top -Hp pid 然后輸入 P 依然可以按照 CPU 使用率將線程排序。

這時我們只需要記住線程的 ID 將其轉(zhuǎn)換為 16 進制存儲起來,通過 jstack pid >pid.log 生成日志文件,利用剛才保存的 16 進制進程 ID 去這個線程快照中搜索即可知道消耗 CPU 的線程在干啥了。

如果你嫌麻煩,我也強烈推薦阿里開源的問題定位神器 arthas 來定位問題。

比如上述操作便可精簡為一個命令 thread -n 3 即可將最忙碌的三個線程快照打印出來,非常高效。

更多關(guān)于 arthas 使用教程請參考官方文檔。

由于之前忘記截圖了,這里我直接得出結(jié)論吧:

最忙綠的線程是一個 GC 線程,也就意味著它在忙著做垃圾回收。

GC 查看

排查到這里,有經(jīng)驗的老司機一定會想到:多半是應(yīng)用內(nèi)存使用有問題導致的。

于是我通過 jstat -gcutil pid 200 50 將內(nèi)存使用、gc 回收狀況打印出來(每隔 200ms 打印 50次)。

從圖中可以得到以下幾個信息:

Eden 區(qū)和 old 區(qū)都快占滿了,可見內(nèi)存回收是有問題的。

fgc 回收頻次很高,10s 之內(nèi)發(fā)生了 8 次回收((866493-866485)/ (200 *5))。

持續(xù)的時間較長,fgc 已經(jīng)發(fā)生了 8W 多次。

內(nèi)存分析

既然是初步定位是內(nèi)存問題,所以還是得拿一份內(nèi)存快照分析才能最終定位到問題。

通過命令 jmap -dump:live,format=b,file=dump.hprof pid 可以導出一份快照文件。

這時就得借助 MAT 這類的分析工具出馬了。

問題定位

通過這張圖其實很明顯可以看出,在內(nèi)存中存在一個非常大的字符串,而這個字符串正好是被這個定時任務(wù)的線程引用著。

大概算了一下這個字符串所占的內(nèi)存為 258m 左右,就一個字符串來說已經(jīng)是非常大的對象了。

那這個字符串是咋產(chǎn)生的呢?

其實看上圖中的引用關(guān)系及字符串的內(nèi)容不難看出這是一個 insertSQL 語句。

這時不得不贊嘆 MAT 這個工具,他還能幫你預(yù)測出這個內(nèi)存快照可能出現(xiàn)問題地方同時給出線程快照。

最終通過這個線程快照找到了具體的業(yè)務(wù)代碼:

他調(diào)用一個寫入數(shù)據(jù)庫的方法,而這個方法會拼接一個 insert 語句,其中的 values 是循環(huán)拼接生成,大概如下:

    
        insert into xx (files)
        values
        
            xxx
        
    

所以一旦這個 list 非常大時,這個拼接的 SQL 語句也會很長。

通過剛才的內(nèi)存分析其實可以看出這個 List 也是非常大的,也就導致了最終的這個 insert 語句占用的內(nèi)存巨大。

優(yōu)化策略

既然找到問題原因那就好解決了,有兩個方向:

控制源頭 List 的大小,這個 List 也是從某張表中獲取的數(shù)據(jù),可以分頁獲?。贿@樣后續(xù)的 insert 語句就會減小。

控制批量寫入數(shù)據(jù)的大小,其實本質(zhì)還是要把這個拼接的 SQL 長度降下來。

整個的寫入效率需要重新評估。

總結(jié)

本次問題從分析到解決花的時間并不長,也還比較典型,其中的過程再總結(jié)一下:

首先定位消耗 CPU 進程。

再定位消耗 CPU 的具體線程。

內(nèi)存問題 dump 出快照進行分析。

得出結(jié)論,調(diào)整代碼,測試結(jié)果。

最后愿大家都別接到生產(chǎn)告警。

你的點贊與分享是對我最大的支持

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

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

相關(guān)文章

  • 一次生產(chǎn) CPU 100% 排查優(yōu)化實踐

    摘要:發(fā)現(xiàn)這是的一個堆棧,前段時間正好解決過一個由于隊列引起的一次強如也發(fā)生內(nèi)存溢出沒想到又來一出。因此初步判斷為大量線程執(zhí)行函數(shù)之后互相競爭導致使用率增高,而通過對堆棧發(fā)現(xiàn)是和使用有關(guān)。 showImg(https://segmentfault.com/img/remote/1460000017395756?w=1816&h=1080); 前言 到了年底果然都不太平,最近又收到了運維報警:...

    roundstones 評論0 收藏0
  • mysql優(yōu)化

    摘要:顯示處于不可中斷的休眠的進程數(shù)量。在等待顯示被交換到磁盤的數(shù)據(jù)塊的數(shù)量。服務(wù)器硬件優(yōu)化物理狀態(tài)燈自帶管理設(shè)備遠程控制卡設(shè)備,開關(guān)機硬件監(jiān)控。 數(shù)據(jù)庫層面問題解決思路 一般應(yīng)急調(diào)優(yōu)的思路:針對突然的業(yè)務(wù)辦理卡頓,無法進行正常的業(yè)務(wù)處理!需要立馬解決的場景! 1、show processlist 2、explain select id ,name from stu where name=...

    elisa.yang 評論0 收藏0

發(fā)表評論

0條評論

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