新聞中心
客戶端讀寫超時(shí)
- 讀寫超時(shí)時(shí)間設(shè)置得過短
- 命令本身就比較慢
- 客戶端與服務(wù)端網(wǎng)絡(luò)不正常
- redis自身發(fā)生堵塞
客戶端連接超時(shí)
- 連接超時(shí)時(shí)間設(shè)置過短
- redis發(fā)生阻塞,造成tcp-backlog 已滿,造成新的連接失敗
- 客戶端與服務(wù)端網(wǎng)絡(luò)不正常
客戶端緩沖區(qū)異常
- 輸出緩沖區(qū)滿,例如將普通客戶端的輸出緩沖區(qū)設(shè)置為1M 1M 60;
config set client-output-buffer-limit "normal 1048576 1048576 60 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
如果使用get 命令獲取一個(gè)bigkey(例如3M) ,就會(huì)出現(xiàn)異常,因?yàn)槟J(rèn)位1M(1048576字節(jié))
- 長時(shí)間閑置連接被服務(wù)端主動(dòng)斷開(timeout參數(shù)設(shè)置,當(dāng)閑置時(shí)間大于這個(gè)值,就會(huì)被服務(wù)端主動(dòng)斷開)
- 不正常并發(fā)讀寫
Lua腳本正在執(zhí)行
如果redis 正在執(zhí)行l(wèi)ua腳本,并且超過了lua-time-limit ,此時(shí)其它客戶端調(diào)用redis 時(shí),會(huì)收到redis busy running a script;
可以使用腳本殺死,script kill 或者 shutdown save
需要注意的是script kill 該命令在腳本執(zhí)行過寫操作是不會(huì)生效的,所以要么等待腳本執(zhí)行結(jié)束或者是shutdown save 停掉redis服務(wù),雖然redis腳本好用,但是需要謹(jǐn)慎使用。
redis正在加載持久化文件
如果redis正在加載持久化文件時(shí),客戶端調(diào)用redis ,就會(huì)報(bào)loading redis is loading the dataset in memory錯(cuò)誤
redis使用的內(nèi)存超過maxmemory配置
客戶端在執(zhí)行寫操作時(shí),如果redis 的使用內(nèi)存大于maxmemory 的設(shè)置,會(huì)收到 oom used memory >maxmemory 錯(cuò)誤;
此時(shí)應(yīng)該調(diào)整maxmemory 的值并造成內(nèi)存增長的原因。當(dāng)然這也是因?yàn)閞edis的淘汰策略使用的是默認(rèn)值:maxmemory-policy:noeviction
noeviction(默認(rèn)策略):對(duì)于寫請(qǐng)求不再提供服務(wù),直接返回錯(cuò)誤
臨時(shí)解決方案:config set maxmemory-policy allkeys-lru 設(shè)置
客戶端連接數(shù)過大
如果客戶端連接數(shù)超過了maxlients ,新的客戶端連接就會(huì)出現(xiàn)報(bào)錯(cuò):err max number of clients reached
redis 默認(rèn)值為10000 ,正常都是夠用的,出現(xiàn)這種情況屬于異常情況,原因很多,需要后續(xù)排查。
臨時(shí)解決方案就是: 下線一些,應(yīng)用程序中不重要的部分使用,使得連接數(shù)降下來 或者調(diào)整一下maxclients 值進(jìn)行問題修復(fù)。但是還是得找出根源,不然過段時(shí)間又會(huì)出現(xiàn)問題。
客戶端案例分析
例如:redis 內(nèi)存陡增
客戶端接收到 OOM 異常
分析如下:
第一:首先看是否存在主從復(fù)制出現(xiàn)問題,使用dbsize 查看key的對(duì)比大小
第二:其它原因?qū)е轮鞴?jié)點(diǎn)內(nèi)存使用過大,排查是否由客戶端緩沖區(qū)造成主節(jié)點(diǎn)內(nèi)存陡增,使用 info clients 命令查詢信息如下:
127.0.0.1:6379>info clients
# Clients
connected_clients:1
cluster_connections:0
maxclients:10000
client_recent_max_input_buffer:1689600
client_recent_max_output_buffer:0
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:0
很明顯輸出緩存區(qū)不太正常,大的緩存區(qū)已經(jīng)超過了168萬多個(gè)對(duì)象了,這個(gè)時(shí)候需要通過client list 命令找到omem 不正常的連接,一般來說omem 為0 (因?yàn)樗俣茸銐蚩欤瑘?zhí)行如下代碼可找出omem非零的客戶端連接:
? ~ redis-cli client list | grep -v "omem=0"
找到如下一條命令:
id=5 addr=127.xxx.xx.1:55606 laddr=127.xx.0.1:6379 fd=8 name= age=0 idle=0 flags=N db=0 sub=0 psub=0 ssub=0 multi=-1 qbuf=26 qbuf-free=16864 argv-mem=10 multi-mem=0 rbs=16384 rbp=16384 obl=0 oll=1689600 omem=1682131200 tot-mem=34042 events=r cmd=monitor
很明顯是因?yàn)榭蛻舳嗽趫?zhí)行monitor 命令造成的
解決方案:
可以使用client kill 命令殺死這個(gè)連接
? ~ client kill 127.xxx.xx.1:55606
如何避免此類問題再次發(fā)生呢:
使用rename-command 命令重置monitor命令
限制輸出緩存區(qū)的大小
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
分享題目:Redis客戶端常見異常-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://www.dlmjj.cn/article/ccpgij.html