<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      日常Bug排查-系統(tǒng)失去響應(yīng)-Redis使用不當(dāng)

      日常Bug排查-系統(tǒng)失去響應(yīng)-Redis使用不當(dāng)

      前言

      日常Bug排查系列都是一些簡單Bug排查,筆者將在這里介紹一些排查Bug的簡單技巧,同時順便積累素材_

      Bug現(xiàn)場

      開發(fā)反應(yīng)線上系統(tǒng)出現(xiàn)失去響應(yīng)的現(xiàn)象,收到業(yè)務(wù)告警已經(jīng)頻繁MarkAndSweep(Full GC)告警。于是找到筆者進行排查。

      看基礎(chǔ)監(jiān)控

      首先呢,當(dāng)然是看我們的監(jiān)控了,找到對應(yīng)失去響應(yīng)的系統(tǒng)的ip,看下我們的基礎(chǔ)監(jiān)控。

      機器內(nèi)存持續(xù)上升。因為我們是java系統(tǒng),堆的大小一開始已經(jīng)設(shè)置了最大值。

      --XX:Xms2g -Xmx2g
      

      所以看上去像堆外內(nèi)存泄露。而FullGC告警只是堆外內(nèi)存后一些關(guān)聯(lián)堆內(nèi)對象觸發(fā)。

      看應(yīng)用監(jiān)控

      第二步,當(dāng)然就是觀察我們的應(yīng)用監(jiān)控,這邊筆者用的是CAT。觀察Cat中對應(yīng)應(yīng)用的情況,很容易發(fā)現(xiàn),其ActiveThread呈現(xiàn)不正常的現(xiàn)象,竟然達到了5000+多個,同時和內(nèi)存上升曲線保持一致。

      jstack

      java應(yīng)用中遇到線程數(shù)過多的現(xiàn)象,首先我們考慮的是jstack,jstack出來對應(yīng)的文件后。我們less一下,發(fā)現(xiàn)很多線程卡在下面的代碼棧上。

      "Thread-1234
      	java.lang.Thread.State: WAITING (parking)
      		at sun.misc.Unsafe.park
      		......
      		at org.apache.commons.pool2.impl.LinkedBlockingQueue.takeFirst
      		......
      		at redis.clients.util.Pool.getResource
      

      很明顯的,這個代碼棧值得是沒有獲取連接,從而卡住。至于為什么卡這么長時間而不釋放,肯定是由于沒設(shè)置超時時間。那么是否大部分線程都卡在這里呢,這里我們做一下統(tǒng)計。

      cat jstack.txt | grep 'prio=' | wc -l 
      ======> 5648
      cat jstack.txt | grep 'redis.clients.util.Pool.getResource' 
      ======> 5242
      

      可以看到,一共5648個線程,有5242,也就是92%的線程卡在Redis getResource中。

      看下redis情況

      netstat -anp | grep 6379 
      tcp 0 0 1.2.3.4:111 3.4.5.6:6379 ESTABLISHED
      ......
      

      一共5個,而且連接狀態(tài)為ESTABLISHED,正常。由此可見他們配置的最大連接數(shù)是5(因為別的線程正在得到獲取Redis資源)。

      Redis連接泄露

      那么很自然的想到,Redis連接泄露了,即應(yīng)用獲得Redis連接后沒有還回去。這種泄露有下面幾種可能:
      情況1:

      情況2:

      情況3:
      調(diào)用Redis卡住,由于其它機器是好的,故排除這種情況。

      如何區(qū)分

      我們做個簡單的推理:
      如果是情況1,那么這個RedisConn肯定可以通過內(nèi)存可達性分析和Thread關(guān)聯(lián)上,而且這個關(guān)聯(lián)關(guān)系肯定會關(guān)聯(lián)到某個業(yè)務(wù)操作實體(例如code stack or 業(yè)務(wù)bean)。那么我們只要觀察其在堆內(nèi)的關(guān)聯(lián)路線是否和業(yè)務(wù)相關(guān)即可,如果沒有任何關(guān)聯(lián),那么基本斷定是情況2了。

      可達性分析

      我們可以通過jmap dump出應(yīng)用內(nèi)存,然后通過MAT(Memory Analysis Tool)來進行可達性分析。

      首先找到RedisConn

      將dump文件在MAT中打開,然后運行OQL:

      select * from redis.clients.jedis.Jedis (RedisConn的實體類)
      

      搜索到一堆Jedis類,然后我們執(zhí)行

      Path To GCRoots->with all references
      

      可以看到如下結(jié)果:

      redis.clients.jedis.Jedis
      	|->object 
      		|->item
      			|->first
      				|->...
      					|->java.util.TimerThread
      				|->internalPool
      

      由此可見,我們的連接僅僅被TimerThread和internalPool(Jedis本身的連接池)持有。所以我們可以判斷出大概率是情況2,即忘了歸還連接。翻看業(yè)務(wù)代碼:

      偽代碼
      void lock(){
      	conn = jedis.getResource()
      	conn.setNx()
      	// 結(jié)束,此處應(yīng)該有finally{returnResource()}或者采用RedisTemplate
      }
      

      最后就是很簡單的,業(yè)務(wù)開發(fā)在執(zhí)行setNx操作后,忘了將連接還回去。導(dǎo)致連接泄露。

      如果是情況1如何定位卡住的代碼

      到此為止,這個問題時解決了。但是如果是情況1的話,我們又該如何分析下去呢?很簡單,我們?nèi)绻业搅薺edis被哪個業(yè)務(wù)線程擁有,直接從heap dump找到其線程號,然后取Jstack中搜索即可知道其卡住的代碼棧。

      jmap:
      redis.clients.jedis.Jedis
      	|->Thread-123
      
      jstack:
      
      Thread-123 prio=...
      	at xxx.xxx.xxx.blocked
      
      

      總結(jié)

      這是一個很簡單的問題,知道套路之后排查起來完全不費事。雖然最后排查出來是個很低級的代碼,但是這種分析方法值得借鑒。

      posted @ 2021-05-20 14:10  無毀的湖光-Al  閱讀(2784)  評論(5)    收藏  舉報
      主站蜘蛛池模板: 亚洲中文字幕在线无码一区二区| 樱桃视频影院在线播放| 亚洲色欲色欱WWW在线| AV人摸人人人澡人人超碰| 亚洲爆乳WWW无码专区| 久久香蕉国产线看观看猫咪av| 国产欧美亚洲精品a| 亚洲高清日韩专区精品| 无码人妻一区二区三区av| 国产亚洲欧洲av综合一区二区三区| 一区二区三区国产亚洲自拍| 亚洲欧美成人久久综合中文网| 日本精品不卡一二三区| 亚洲日本精品国产第一区| 无卡无码无免费毛片| 日韩在线观看精品亚洲| 日本乱码在线看亚洲乱码| 欧美一区二区三区在线观看| 国产精品中文字幕日韩| 中文字幕乱码熟妇五十中出 | 最新亚洲人成网站在线观看| 久久精品国产高潮国产夫妻| 久久天天躁狠狠躁夜夜躁2012| 人妻系列无码专区无码中出| 成人国产精品三上悠亚久久| 无码人妻斩一区二区三区| 久久精品国产免费观看频道| 亚洲国产精品一区在线看| 国偷自产一区二区免费视频| 亚洲欧美精品aaaaaa片| 精品无码国产污污污免费| 久久成人 久久鬼色| 在线观看特色大片免费网站| 国产AV福利第一精品| 定西市| 国内揄拍国内精品人妻久久| 久久久这里只有精品10| 亚洲熟妇自偷自拍另欧美| 国产乱子伦视频在线播放| 新乡市| 国产精品综合av一区二区国产馆 |