Redis幾個(gè)重要的健康指標(biāo)
存活情況
所有指標(biāo)中最重要的當(dāng)然是檢查redis是否還活著,可以通過(guò)命令PING的響應(yīng)是否是PONG來(lái)判斷。
連接數(shù)
連接的客戶端數(shù)量,可通過(guò)命令src/redis-cli info Clients | grep connected_clients得到,這個(gè)值跟使用redis的服務(wù)的連接池配置關(guān)系比較大,所以在監(jiān)控這個(gè)字段的值時(shí)需要注意。另外這個(gè)值也不能太大,建議不要超過(guò)5000,如果太大可能是redis處理太慢,那么需要排除問(wèn)題找出原因。
另外還有一個(gè)拒絕連接數(shù)(rejected_connections)也需要關(guān)注,這個(gè)值理想狀態(tài)是0。如果大于0,說(shuō)明創(chuàng)建的連接數(shù)超過(guò)了maxclients,需要排查原因。是redis連接池配置不合理還是連接這個(gè)redis實(shí)例的服務(wù)過(guò)多等。
阻塞客戶端數(shù)量
blocked_clients,一般是執(zhí)行了list數(shù)據(jù)類(lèi)型的BLPOP或者BRPOP命令引起的,可通過(guò)命令src/redis-cli info Clients | grep blocked_clients得到,很明顯,這個(gè)值***應(yīng)該為0。
使用內(nèi)存峰值
監(jiān)控redis使用內(nèi)存的峰值,我們都知道Redis可以通過(guò)命令config set maxmemory 10737418240設(shè)置允許使用的***內(nèi)存(強(qiáng)烈建議不要超過(guò)20G),為了防止發(fā)生swap導(dǎo)致Redis性能驟降,甚至由于使用內(nèi)存超標(biāo)導(dǎo)致被系統(tǒng)kill,建議used_memory_peak的值與maxmemory的值有個(gè)安全區(qū)間,例如1G,那么used_memory_peak的值不能超過(guò)9663676416(9G)。另外,我們還可以監(jiān)控maxmemory不能少于多少G,比如5G。因?yàn)槲覀円郧吧a(chǎn)環(huán)境出過(guò)這樣的問(wèn)題,運(yùn)維不小心把10G配置成了1G,從而導(dǎo)致服務(wù)器有足夠內(nèi)存卻不能使用的悲劇。
內(nèi)存碎片率
mem_fragmentation_ratio=used_memory_rss/used_memory,這也是一個(gè)非常需要關(guān)心的指標(biāo)。如果是redis4.0之前的版本,這個(gè)問(wèn)題除了重啟也沒(méi)什么很好的優(yōu)化辦法。而redis4.0有一個(gè)主要特性就是優(yōu)化內(nèi)存碎片率問(wèn)題(Memory de-fragmentation)。在redis.conf配置文件中有介紹即ACTIVE DEFRAGMENTATION:碎片整理允許Redis壓縮內(nèi)存空間,從而回收內(nèi)存。這個(gè)特性默認(rèn)是關(guān)閉的,可以通過(guò)命令CONFIG SET activedefrag yes熱啟動(dòng)這個(gè)特性。
- 當(dāng)這個(gè)值大于1時(shí),表示分配的內(nèi)存超過(guò)實(shí)際使用的內(nèi)存,數(shù)值越大,碎片率越嚴(yán)重。
- 當(dāng)這個(gè)值小于1時(shí),表示發(fā)生了swap,即可用內(nèi)存不夠。
另外需要注意的是,當(dāng)內(nèi)存使用量(used_memory)很小的時(shí)候,這個(gè)值參考價(jià)值不大。所以,建議used_memory至少1G以上才考慮對(duì)內(nèi)存碎片率進(jìn)行監(jiān)控。
緩存***率
keyspace_misses/keyspace_hits這兩個(gè)指標(biāo)用來(lái)統(tǒng)計(jì)緩存的命令率,keyspace_misses指未***次數(shù),keyspace_hits表示***次數(shù)。keyspace_hits/(keyspace_hits+keyspace_misses)就是緩存***率。視情況而定,建議0.9以上,即緩存***率要超過(guò)90%。如果緩存***率過(guò)低,那么要排查對(duì)緩存的用法是否有問(wèn)題!
OPS
instantaneous_ops_per_sec這個(gè)指標(biāo)表示緩存的OPS,如果業(yè)務(wù)比較平穩(wěn),那么這個(gè)值也不會(huì)波動(dòng)很大,不過(guò)國(guó)內(nèi)的業(yè)務(wù)比較特性,如果不是全球化的產(chǎn)品,夜間是基本上沒(méi)有什么訪問(wèn)量的,所以這個(gè)字段的監(jiān)控要結(jié)合自己的具體業(yè)務(wù),不同時(shí)間段波動(dòng)范圍可能有所不同。
持久化
rdb_last_bgsave_status/aof_last_bgrewrite_status,即最近一次或者說(shuō)***一次RDB/AOF持久化是否有問(wèn)題,這兩個(gè)值都應(yīng)該是"ok"。
另外,由于redis持久化時(shí)會(huì)fork子進(jìn)程,且fork是一個(gè)完全阻塞的過(guò)程,所以可以監(jiān)控fork耗時(shí)即latest_fork_usec,單位是微妙,如果這個(gè)值比較大會(huì)影響業(yè)務(wù),甚至出現(xiàn)timeout。
失效KEY
如果把Redis當(dāng)緩存使用,那么建議所有的key都設(shè)置了expire屬性,通過(guò)命令src/redis-cli info Keyspace得到每個(gè)db中key的數(shù)量和設(shè)置了expire屬性的key的屬性,且expires需要等于keys:
- # Keyspace
- db0:keys=30,expires=30,avg_ttl=0
- db0:keys=23,expires=22,avg_ttl=0
慢日志
通過(guò)命令slowlog get得到Redis執(zhí)行的slowlog集合,理想情況下,slowlog集合應(yīng)該為空,即沒(méi)有任何慢日志,不過(guò),有時(shí)候由于網(wǎng)絡(luò)波動(dòng)等原因造成set key value這種命令執(zhí)行也需要幾毫秒,在監(jiān)控的時(shí)候我們需要注意,而不能看到slowlog就想著去優(yōu)化,簡(jiǎn)單的set/get可能也會(huì)出現(xiàn)在slowlog中。