Redis 問題排查與 QPS 評(píng)估
go-zero 社區(qū)核心貢獻(xiàn)者 Mikael(go-zero-looklook 作者)找我溝通了一個(gè)關(guān)于 Redis 的問題。在解決后,我意識(shí)到,社區(qū)中很多同學(xué)可能也會(huì)遇到類似的問題。因此,抽空總結(jié)了一些關(guān)于 Redis 響應(yīng)時(shí)長和 QPS 評(píng)估的經(jīng)驗(yàn),希望對(duì)大家有所幫助。
Redis 響應(yīng)時(shí)長排查思路
Redis 的核心優(yōu)勢(shì)之一就是高性能。在沒有大 Key和熱 Key的情況下,響應(yīng)速度通常非??臁5绻霈F(xiàn)異常,尤其是響應(yīng)時(shí)長過高,我們需要仔細(xì)排查。以下是一些關(guān)鍵點(diǎn):
1. 正常情況下的響應(yīng)時(shí)長
- 量化指標(biāo):
Redis 在正常情況下處理請(qǐng)求時(shí)長通常低于 1ms。
調(diào)用端指標(biāo)上報(bào)中,一般會(huì)在 2ms 以內(nèi),即使是同城跨區(qū)訪問,時(shí)延增加也不過 1ms。
- 異常判斷:
如果響應(yīng)時(shí)長(均值或 P99)超過 10ms,就需要開始排查原因。
2. 可能的性能瓶頸
- 大 Key 或熱 Key:?jiǎn)未握?qǐng)求操作的數(shù)據(jù)量過大,導(dǎo)致 Redis 處理時(shí)間變長。
- CPU 負(fù)載過高:CPU 占用過高會(huì)直接影響性能。
- 內(nèi)存淘汰機(jī)制:內(nèi)存即將耗盡時(shí),Redis 會(huì)進(jìn)行數(shù)據(jù)淘汰,導(dǎo)致響應(yīng)變慢。
- 大范圍查詢:如使用 SCAN、SORT 等命令,會(huì)觸發(fā)較大的數(shù)據(jù)遍歷。
- 連接數(shù)過多:Redis 連接過載,可能引發(fā)排隊(duì)等待,影響響應(yīng)速度。
Redis 客戶端可承載 QPS 計(jì)算方法
在 go-zero 中,使用了官方庫 go-redis。這里按照 Redis 的部署模式,分別探討單節(jié)點(diǎn)和集群模式下的 QPS 計(jì)算。
1. 連接數(shù)配置
- 單節(jié)點(diǎn)模式:
調(diào)用端每個(gè) CPU 核心維護(hù) 10 個(gè)連接。假設(shè)是 4 核 CPU,總共就是 40 個(gè)連接。
- 集群模式:
調(diào)用端每個(gè) CPU 核心對(duì)每個(gè)分片維護(hù) 5 個(gè)連接。假設(shè)有 2 個(gè)分片,4 核 CPU,總共至少 40 個(gè)連接。
2. QPS 計(jì)算公式
假設(shè)每個(gè)請(qǐng)求的平均處理時(shí)長為 2ms(包含網(wǎng)絡(luò)延遲),那么單個(gè)連接每秒可處理 500 個(gè)請(qǐng)求。按照上面的連接數(shù):
- 單節(jié)點(diǎn) Redis:
- 調(diào)用端每個(gè)核對(duì)應(yīng) 10 個(gè)連接。假設(shè)是 4 核 CPU,總共就是 40 個(gè)連接。
- 集群模式(至少兩分片):
調(diào)用端每個(gè)核對(duì)應(yīng)每個(gè)分片 5 個(gè)連接,每個(gè)分片至少提供 10,000 QPS 的處理能力(如果是用來限流或者熱 key 則可能請(qǐng)求打在單分片上)。
這種計(jì)算雖然粗略,但基本能夠作為評(píng)估依據(jù)。如果遇到 Redis 連接數(shù)不足的問題,可以按照上述方法進(jìn)行自查,分析瓶頸所在。
總結(jié)與建議
遇到 Redis 性能問題時(shí),不能簡(jiǎn)單地通過增加連接數(shù)來解決。我們需要深入分析根因,定位到具體問題,找到真正的瓶頸。提升系統(tǒng)性能的關(guān)鍵在于理解 Redis 的工作機(jī)制,并針對(duì)性優(yōu)化。
































