1.redis使用中的深坑monitor命令
????事情的原由開啟redis的monitor命令雌桑,為然后把日志出入到磁盤中,方便查詢系統(tǒng)bug你踩。到了第二天下午2點(diǎn)左右刊侯,整個平臺開始出現(xiàn)大面積的崩潰,通過報警發(fā)現(xiàn)redis的cpu占用達(dá)到99%芒炼,但是不知道由什么引起的瘫怜,隨后開始google 發(fā)現(xiàn)網(wǎng)上已經(jīng)有人遇到相同的問題。他說的原因就是monitor本刽,隨后我們感覺關(guān)閉了monitor命令 cpu一下子恢復(fù)正常 從99%降到33%鲸湃,以下是monitor命令的截圖正常的情況cpu占用39%
當(dāng)開啟monitor命令,如下圖
????redis的cpu占用瞬間從39%變成85%子寓。為什么說redis的cpu占用達(dá)到99%平臺就會卡住唤锉,因?yàn)閞edis是單核所有系統(tǒng)操作redis都被阻塞了,導(dǎo)致一系列的雪崩别瞭。
2.redis使用中的深坑keys命令
????系統(tǒng)有個業(yè)務(wù)場景是這樣的窿祥,需要推送通知給所有的在線客服,我們一個程序員寫了這樣的代碼
Jedis jedis = CacheUtils.getJedis();
try{
List list = jedis.keys("online.kf.*");
.......循環(huán)list 執(zhí)行推送業(yè)務(wù).....
}finally{
CacheUtils.returnJedis(jedis);
}
????看上去代碼沒有毛病蝙寨,但是發(fā)布到了線上系統(tǒng)開始崩潰晒衩,又是一連串的雪崩。墙歪。听系。 o(︶︿︶)o唉 大家不要笑話我們的系統(tǒng)架構(gòu),沒辦法系統(tǒng)還在改造中虹菲。通過redis的執(zhí)行slowlog get 10 分析執(zhí)行查詢時間發(fā)行keys命令執(zhí)行長達(dá)1秒鐘靠胜,也就是說1秒鐘內(nèi)所有操作redis的系統(tǒng)將被阻塞。毕源。浪漠。。 好可怕啊有木有⊙♂⊙霎褐。址愿。。
????上圖是我們生產(chǎn)環(huán)境執(zhí)行的keys時間將近2秒鐘冻璃,keys是時間復(fù)雜度是O(N)响谓, N 為數(shù)據(jù)庫中 key 的數(shù)量,redis的官方給出了使用keys的一個警告省艳。
3.redis周期性的拋出Could not get a resource from the pool
????原由是客戶度去jedispool獲取jedis的時候發(fā)現(xiàn)jedis已經(jīng)被其他線程全部取走娘纷,然后當(dāng)前線程會進(jìn)入等待,等待時間超過maxActive將會拋出Could not get a resource from the pool跋炕,造成這點(diǎn)的原因我遇到了兩種赖晶。
????1.由于系統(tǒng)的并發(fā)量增加導(dǎo)致的瓶頸,解決方案 調(diào)整maxActive的大小枣购、調(diào)整MaxTotal的大小嬉探、testOnBorrow為false testOnReturn為false 擦耀。
????testOnBorrow、testOnReturn這兩個參數(shù)的作用是從jedispool獲取jedis 和釋放jedis的會ping一下redis涩堤,如果ping不通則拋出異常眷蜓,所以這里造成了資源的兩次浪費(fèi)。╮(╯_╰)╭
@Override
public boolean validateObject(PooledObject<Jedis> pooledJedis) {
final BinaryJedis jedis = pooledJedis.getObject();
try {
HostAndPort hostAndPort = this.hostAndPort.get();
String connectionHost = jedis.getClient().getHost();
int connectionPort = jedis.getClient().getPort();
return hostAndPort.getHost().equals(connectionHost)
&& hostAndPort.getPort() == connectionPort && jedis.isConnected()
&& jedis.ping().equals("PONG");
} catch (final Exception e) {
return false;
}
}
????2.內(nèi)網(wǎng)帶寬滿被占用滿胎围。解決方案 網(wǎng)卡把千兆網(wǎng)卡換成萬兆完美解決吁系。
????內(nèi)網(wǎng)服務(wù)之間消息大量的傳輸沾滿了整個帶寬導(dǎo)致應(yīng)用程序向redis發(fā)送請求的時候卡了,所以導(dǎo)致異常╮(╯_╰)╭