小編給大家分享一下redis db連接超時怎么辦,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)公司是一家網(wǎng)站設(shè)計(jì)公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營產(chǎn)品:響應(yīng)式網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營銷推廣。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡(luò)互動的體驗(yàn),以及在手機(jī)等移動端的優(yōu)質(zhì)呈現(xiàn)。成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、移動互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營、VI設(shè)計(jì)、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價值服務(wù)。
問題描述:
現(xiàn)象是redis db訪問出現(xiàn)超時。
問題分析:
網(wǎng)絡(luò)流量出現(xiàn)瓶頸,訪問變慢。
[machine1 ~]$ ping 192.168.10.66
PING 192.168.10.66 (192.168.10.66) 56(84) bytes of data.
64 bytes from 192.168.10.66: icmp_seq=1 ttl=64 time=17.7 ms
64 bytes from 192.168.10.66: icmp_seq=2 ttl=64 time=17.2 ms
Input queue: 0/2000/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: fifo
Output queue: 0/40 (size/max)
5 minute input rate 874639000 bits/sec, 85931 packets/sec –網(wǎng)絡(luò)流量每秒800m bit
5 minute output rate 47017000 bits/sec, 75274 packets/sec
96257027404 packets input, 21537684106526 bytes, 0 no buffer
Received 70287596 broadcasts (69442689 multicasts)
主機(jī)的網(wǎng)卡流量也達(dá)到了瓶頸。
redis主機(jī)的某些實(shí)例內(nèi)存也開始報警,超過90%。
停止中間件應(yīng)用后,發(fā)現(xiàn)問題還是沒有解決,網(wǎng)絡(luò)流量依舊很高。
將redis db切換到備機(jī)后,系統(tǒng)恢復(fù),網(wǎng)絡(luò)流量下降。redis db從庫的內(nèi)存使用率很低。
發(fā)生問題時當(dāng)時主庫的內(nèi)存最高是14g,但是從庫的內(nèi)存才1.9g。那主庫的內(nèi)存占用是從哪里來的呢?
根據(jù)網(wǎng)絡(luò)同事的反饋,網(wǎng)絡(luò)請求的大小大概也就幾十個字節(jié),但是輸出的大小每次達(dá)到了幾M。
Redis輸出緩沖區(qū)可能占用大量的內(nèi)存空間,這和oracle的pga內(nèi)存非常類似,每個oracle會話會獨(dú)立分配一個內(nèi)存區(qū)域。那么繼續(xù)看看本案例是否也是輸出緩沖區(qū)內(nèi)存占用過多。查看zabbix相關(guān)指標(biāo),發(fā)現(xiàn)client_longest_output_list的確有增加。應(yīng)該是輸出緩沖區(qū)占用內(nèi)存較大,也就是有大量的數(shù)據(jù)
從Redis服務(wù)器向某些客戶端輸出。
查看當(dāng)時的日志,有omem比較大的情況。
id=411550 addr=172.24.1.30:34542 fd=280 name= age=2 idle=1 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=9
omem=237928 events=rw cmd=lrange
后續(xù)從slowlog中也發(fā)現(xiàn)有返回?cái)?shù)據(jù)較多的操作。
[machine1 ~]$redis-cli -p 6500 slowlog get 10
1) 1) (integer) 2245
2) (integer) 1460002216
3) (integer) 23236
4) 1) "SMEMBERS"
2) "prdkey1"
一次獲取9075多個元素。
127.0.0.1:6410> scard prdkey1
(integer) 9075
經(jīng)過和開發(fā)一起分析,類似于Oracle中的數(shù)據(jù)傾斜,redis的某個分片上返回的數(shù)據(jù)很大,導(dǎo)致服務(wù)器向客戶端發(fā)送數(shù)據(jù)的buffer的積壓。后續(xù)開發(fā)將這些數(shù)據(jù)分批取出,并放到JVM中進(jìn)行緩存。
以上是“Redis db連接超時怎么辦”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!