成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[400658]]

前言

日常Bug排查系列都是一些簡(jiǎn)單Bug排查,筆者將在這里介紹一些排查Bug的簡(jiǎn)單技巧,同時(shí)順便積累素材^_^。

Bug現(xiàn)場(chǎng)

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

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

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

機(jī)器內(nèi)存持續(xù)上升。因?yàn)槲覀兪莏ava系統(tǒng),堆的大小一開始已經(jīng)設(shè)置了最大值。

  1. --XX:Xms2g -Xmx2g 

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

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

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

jstack

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

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

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

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

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

看下redis情況

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

一共5個(gè),而且連接狀態(tài)為ESTABLISHED,正常。由此可見他們配置的最大連接數(shù)是5(因?yàn)閯e的線程正在等待獲取Redis資源)。

Redis連接泄露

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

情況1:

情況2:

情況3:

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

如何區(qū)分

我們做個(gè)簡(jiǎn)單的推理:

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

可達(dá)性分析

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

首先找到RedisConn

將dump文件在MAT中打開,然后運(yùn)行OQL:

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

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

  1. Path To GCRoots->with all references 

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

  1. redis.clients.jedis.Jedis 
  2.     |->object  
  3.         |->item 
  4.             |->first 
  5.                 |->... 
  6.                     |->java.util.TimerThread 
  7.                 |->internalPool 

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

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

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

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

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

  1. jmap: 
  2. redis.clients.jedis.Jedis 
  3.     |->Thread-123 
  4.  
  5. jstack: 
  6.  
  7. Thread-123 prio=... 
  8.     at xxx.xxx.xxx.blocked 

總結(jié)

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

責(zé)任編輯:武曉燕 來源: 解Bug之路
相關(guān)推薦

2020-10-22 07:09:19

TCP網(wǎng)絡(luò)協(xié)議

2021-06-10 06:59:34

Redis應(yīng)用API

2021-09-11 19:00:54

Intro元素MemoryCache

2019-10-10 15:40:17

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

2009-12-17 14:53:52

VS2008程序

2022-10-25 18:00:00

Redis事務(wù)生產(chǎn)事故

2021-08-26 14:26:25

Java代碼集合

2021-07-11 09:34:45

ArrayListLinkedList

2022-06-21 11:24:05

多線程運(yùn)維

2024-02-04 08:26:38

線程池參數(shù)內(nèi)存

2024-06-28 10:01:04

2011-08-18 13:49:32

筆記本技巧

2021-06-04 11:33:50

消息技巧排查

2024-09-05 08:07:55

2021-06-07 09:37:05

異常Bug排查

2024-05-13 10:21:43

Bug排查TCP

2010-01-06 10:56:47

華為交換機(jī)使用

2021-05-19 14:03:48

磁盤故障時(shí)

2020-02-06 11:30:08

代碼JavaScript&&

2021-06-15 16:17:19

Commit報(bào)錯(cuò)事務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲综合视频一区 | 日韩精品视频在线 | 国产激情视频在线 | 国产精品三级 | 精品中文在线 | 精品亚洲一区二区三区 | 成人免费视频 | 久久久久久国产精品免费免费狐狸 | 国产欧美一区二区三区免费 | 欧美午夜精品 | www.五月天婷婷 | 色婷婷影院 | 一级免费在线视频 | 断背山在线观看 | 欧美一级二级在线观看 | 日韩视频 中文字幕 | 国产一区二区在线免费视频 | 欧美精品a∨在线观看不卡 国产精品久久国产精品 | 福利一区二区在线 | 在线看亚洲| 中文字幕国产精品视频 | 精品久久久久久久久久久下田 | 中文字幕一区二区三区乱码在线 | 国产激情在线观看视频 | 久久午夜视频 | 欧美一卡二卡在线观看 | av手机在线播放 | 亚洲视频在线观看一区二区三区 | 黄色网一级片 | 精品欧美一区免费观看α√ | 毛片一区 | av一级久久 | 精品欧美一区二区三区 | 美国av毛片 | 欧美激情亚洲 | 日韩欧美国产精品一区二区三区 | 国产精品久久久久久 | 欧美日韩国产一区二区三区 | 色黄视频在线 | 久久av一区二区三区 | 毛片入口|