Redis的單線程架構(gòu)決定了其不能允許阻塞。
1. 發(fā)現(xiàn)阻塞
線上應(yīng)用最先感知到阻塞逼友,客戶端會(huì)拋出異常厨相,應(yīng)用方應(yīng)當(dāng)收集異常炼七。并保存異常的信息(哪個(gè)Redis節(jié)點(diǎn),ip, port等)
借助Redis監(jiān)控系統(tǒng)虱朵,如CacheCloud
2. 內(nèi)在原因
2.1 API或數(shù)據(jù)結(jié)構(gòu)使用不合理
避免在大對象上執(zhí)行算法復(fù)雜度超過O(n)的命令莉炉。
- 發(fā)現(xiàn)慢查詢:慢查詢統(tǒng)計(jì)功能, slowlog get {n}
- 發(fā)現(xiàn)大對象: bigkeys碴犬,統(tǒng)計(jì)歷史掃描過的最大對象
2.2 CPU飽和
Redis把單核CPU使用率跑到接近100%
比如過度使用ziplist壓縮編碼
2.3 持久化阻塞
持久化引起的阻塞操作主要有:fork阻塞絮宁,AOF刷盤阻塞,HugePage寫操作阻塞
3. 外在原因
3.1 CPU競爭
- 進(jìn)程競爭
- 綁定CPU(不適合開啟持久化或參與復(fù)制的主節(jié)點(diǎn)服协,因?yàn)樽舆M(jìn)程會(huì)與父進(jìn)程共享一個(gè)CPU)
3.2 內(nèi)存交換
- 保證機(jī)器有充足的可用內(nèi)存
- 確保所有Redis實(shí)例設(shè)置最大可用內(nèi)存
- 降低系統(tǒng)使用swap優(yōu)先級
3.3 網(wǎng)絡(luò)問題
- 連接拒絕:網(wǎng)絡(luò)閃斷绍昂,超過最大連接,連接溢出(進(jìn)程限制打開文件數(shù),backlog隊(duì)列溢出)
- 網(wǎng)絡(luò)延遲:與容災(zāi)性相反
- 網(wǎng)卡軟中斷