redis性能9个checklist和实操
遇到 Redis 性能變慢時(shí),按照這些步驟逐一檢查,高效地解決問(wèn)題。
1. 獲取 Redis 實(shí)例在當(dāng)前環(huán)境下的基線性能。
2.是否用了慢查詢(xún)命令?如果是的話,就使用其他命令替代慢查詢(xún)命令,或者把聚合計(jì)算命令放在客戶端做。
3.是否對(duì)過(guò)期 key 設(shè)置了相同的過(guò)期時(shí)間?對(duì)于批量刪除的 key,可以在每個(gè) key 的過(guò)期時(shí)間上加一個(gè)隨機(jī)數(shù),避免同時(shí)刪除。
4.是否存在 bigkey? 對(duì)于 bigkey 的刪除操作,如果你的 Redis 是 4.0 及以上的版本,可以直接利用異步線程機(jī)制減少主線程阻塞;如果是 Redis 4.0 以前的版本,可以使用 SCAN 命令迭代刪除;對(duì)于 bigkey 的集合查詢(xún)和聚合操作,可以使用 SCAN 命令在客戶端完成。
5.Redis AOF 配置級(jí)別是什么?業(yè)務(wù)層面是否的確需要這一可靠性級(jí)別?如果我們需要高性能,同時(shí)也允許數(shù)據(jù)丟失,可以將配置項(xiàng) no-appendfsync-on-rewrite 設(shè)置為 yes,避免 AOF 重寫(xiě)和 fsync 競(jìng)爭(zhēng)磁盤(pán) IO 資源,導(dǎo)致 Redis 延遲增加。當(dāng)然, 如果既需要高性能又需要高可靠性,最好使用高速固態(tài)盤(pán)作為 AOF 日志的寫(xiě)入盤(pán)。
6.Redis 實(shí)例的內(nèi)存使用是否過(guò)大?發(fā)生 swap 了嗎?如果是的話,就增加機(jī)器內(nèi)存,或者是使用 Redis 集群,分?jǐn)倖螜C(jī) Redis 的鍵值對(duì)數(shù)量和內(nèi)存壓力。同時(shí),要避免出現(xiàn) Redis 和其他內(nèi)存需求大的應(yīng)用共享機(jī)器的情況。
7.在 Redis 實(shí)例的運(yùn)行環(huán)境中,是否啟用了透明大頁(yè)機(jī)制?如果是的話,直接關(guān)閉內(nèi)存大頁(yè)機(jī)制就行了。
8.是否運(yùn)行了 Redis 主從集群?如果是的話,把主庫(kù)實(shí)例的數(shù)據(jù)量大小控制在 2~4GB,以免主從復(fù)制時(shí),從庫(kù)因加載大的 RDB 文件而阻塞。是否使用了多核 CPU 或 NUMA 架構(gòu)的機(jī)器運(yùn)行 Redis 實(shí)例?使用多核 CPU 時(shí),可以給 Redis 實(shí)例綁定物理核;使用 NUMA 架構(gòu)時(shí),注意把 Redis 實(shí)例和網(wǎng)絡(luò)中斷處理程序運(yùn)行在同一個(gè) CPU Socket 上。
?
關(guān)于如何分析、排查、解決Redis變慢問(wèn)題,我總結(jié)的checklist如下:
1、使用復(fù)雜度過(guò)高的命令(例如SORT/SUION/ZUNIONSTORE/KEYS),或一次查詢(xún)?nèi)繑?shù)據(jù)(例如LRANGE key 0 N,但N很大)
分析:a) 查看slowlog是否存在這些命令 b) Redis進(jìn)程CPU使用率是否飆升(聚合運(yùn)算命令導(dǎo)致)
解決:a) 不使用復(fù)雜度過(guò)高的命令,或用其他方式代替實(shí)現(xiàn)(放在客戶端做) b) 數(shù)據(jù)盡量分批查詢(xún)(LRANGE key 0 N,建議N<=100,查詢(xún)?nèi)繑?shù)據(jù)建議使用HSCAN/SSCAN/ZSCAN)
2、操作bigkey
分析:a) slowlog出現(xiàn)很多SET/DELETE變慢命令(bigkey分配內(nèi)存和釋放內(nèi)存變慢) b) 使用redis-cli -h $host -p $port --bigkeys掃描出很多bigkey
解決:a) 優(yōu)化業(yè)務(wù),避免存儲(chǔ)bigkey b) Redis 4.0+可開(kāi)啟lazy-free機(jī)制
3、大量key集中過(guò)期
分析:a) 業(yè)務(wù)使用EXPIREAT/PEXPIREAT命令 b) Redis info中的expired_keys指標(biāo)短期突增
解決:a) 優(yōu)化業(yè)務(wù),過(guò)期增加隨機(jī)時(shí)間,把時(shí)間打散,減輕刪除過(guò)期key的壓力 b) 運(yùn)維層面,監(jiān)控expired_keys指標(biāo),有短期突增及時(shí)報(bào)警排查
4、Redis內(nèi)存達(dá)到maxmemory
分析:a) 實(shí)例內(nèi)存達(dá)到maxmemory,且寫(xiě)入量大,淘汰key壓力變大 b) Redis info中的evicted_keys指標(biāo)短期突增
解決:a) 業(yè)務(wù)層面,根據(jù)情況調(diào)整淘汰策略(隨機(jī)比LRU快) b) 運(yùn)維層面,監(jiān)控evicted_keys指標(biāo),有短期突增及時(shí)報(bào)警 c) 集群擴(kuò)容,多個(gè)實(shí)例減輕淘汰key的壓力
5、大量短連接請(qǐng)求
分析:Redis處理大量短連接請(qǐng)求,TCP三次握手和四次揮手也會(huì)增加耗時(shí)
解決:使用長(zhǎng)連接操作Redis
6、生成RDB和AOF重寫(xiě)fork耗時(shí)嚴(yán)重
分析:a) Redis變慢只發(fā)生在生成RDB和AOF重寫(xiě)期間 b) 實(shí)例占用內(nèi)存越大,fork拷貝內(nèi)存頁(yè)表越久 c) Redis info中l(wèi)atest_fork_usec耗時(shí)變長(zhǎng)
解決:a) 實(shí)例盡量小 b) Redis盡量部署在物理機(jī)上 c) 優(yōu)化備份策略(例如低峰期備份) d) 合理配置repl-backlog和slave client-output-buffer-limit,避免主從全量同步 e) 視情況考慮關(guān)閉AOF f) 監(jiān)控latest_fork_usec耗時(shí)是否變長(zhǎng)
7、AOF使用awalys機(jī)制
分析:磁盤(pán)IO負(fù)載變高
解決:a) 使用everysec機(jī)制 b) 丟失數(shù)據(jù)不敏感的業(yè)務(wù)不開(kāi)啟AOF
8、使用Swap
分析:a) 所有請(qǐng)求全部開(kāi)始變慢 b) slowlog大量慢日志 c) 查看Redis進(jìn)程是否使用到了Swap
解決:a) 增加機(jī)器內(nèi)存 b) 集群擴(kuò)容 c) Swap使用時(shí)監(jiān)控報(bào)警
9、進(jìn)程綁定CPU不合理
分析:a) Redis進(jìn)程只綁定一個(gè)CPU邏輯核 b) NUMA架構(gòu)下,網(wǎng)絡(luò)中斷處理程序和Redis進(jìn)程沒(méi)有綁定在同一個(gè)Socket下
解決:a) Redis進(jìn)程綁定多個(gè)CPU邏輯核 b) 網(wǎng)絡(luò)中斷處理程序和Redis進(jìn)程綁定在同一個(gè)Socket下
10、開(kāi)啟透明大頁(yè)機(jī)制
分析:生成RDB和AOF重寫(xiě)期間,主線程處理寫(xiě)請(qǐng)求耗時(shí)變長(zhǎng)(拷貝內(nèi)存副本耗時(shí)變長(zhǎng))
解決:關(guān)閉透明大頁(yè)機(jī)制
11、網(wǎng)卡負(fù)載過(guò)高
分析:a) TCP/IP層延遲變大,丟包重傳變多 b) 是否存在流量過(guò)大的實(shí)例占滿帶寬
解決:a) 機(jī)器網(wǎng)絡(luò)資源監(jiān)控,負(fù)載過(guò)高及時(shí)報(bào)警 b) 提前規(guī)劃部署策略,訪問(wèn)量大的實(shí)例隔離部署
總之,Redis的性能與CPU、內(nèi)存、網(wǎng)絡(luò)、磁盤(pán)都息息相關(guān),任何一處發(fā)生問(wèn)題,都會(huì)影響到Redis的性能。
主要涉及到的包括業(yè)務(wù)使用層面和運(yùn)維層面:業(yè)務(wù)人員需要了解Redis基本的運(yùn)行原理,使用合理的命令、規(guī)避bigke問(wèn)題和集中過(guò)期問(wèn)題。運(yùn)維層面需要DBA提前規(guī)劃好部署策略,預(yù)留足夠的資源,同時(shí)做好監(jiān)控,這樣當(dāng)發(fā)生問(wèn)題時(shí),能夠及時(shí)發(fā)現(xiàn)并盡快處理。
總結(jié)
以上是生活随笔為你收集整理的redis性能9个checklist和实操的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: redis中KEYS替代命令
- 下一篇: Redis设计与实现之SDS和链表