Redis異常分析-輸入緩沖區過大以及client_list詳解


一、輸入緩沖區概念
Redis為每個客戶端分配了輸入緩沖去,它的作用是將客戶端發送的命令臨時保存,同時Redis會到輸入緩沖區拉取命令並執行,輸入緩沖區為客戶端發送命令道Redis執行命令提供了緩沖功能。qbuf代表了輸入緩沖區的大小,qbuf-free代表輸入緩沖區的剩余容量。輸入緩沖區會根據輸入內容的大小動態調整,每個客戶端的輸入緩沖區大小不能超過1G。超過后客戶端將被關閉。


二、輸入緩沖區過大的危害
(1)一旦客戶端的輸入緩沖區超過1G,客戶端將會被關閉

(2) 輸入緩沖區不受maxmemory的控制,假設一個Redis設置了maxmemory為4G,已經存儲了2G數據,但是如果此時輸入緩沖區使用了3GB,已經超過了maxmemeory限制,可能會產生數據丟失,鍵值淘汰,OOM等情況。

 

三.、引起輸入緩沖區過大的原因

(1) redis的處理速度跟不上輸入緩沖區的輸入速度,並且每次進入輸入緩沖區的命令包含大量的bigkey,從而造成了輸入緩沖區過大的情況

(2) redis發生了阻塞,短期內不能處理命令。造成客戶端命令積壓在輸入緩沖區,導致輸入緩沖區過大。

 

四. 監控輸入緩沖區異常的方法
4.1 

client list


通過定期執行client list命令,收集qbuf和qbuf-free找到異常的連接記錄並分析,最終可能出問題的客戶端。

10.3.34.101:6378> client list

id=10521 addr=10.3.34.101:39696 fd=5name= age=4017 idle=41 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=rcmd=client

id=10533 addr=10.3.34.101:48896 fd=6name= age=6 idle=0 flags=N db=0 sub=0 psub=0 multi=-1qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client

4.2 

 info clients


通過info命令的info clients模塊,找到最大的輸入緩沖區

10.3.34.101:6378> info clients

# Clients

connected_clients:2

client_longest_output_list:0

client_biggest_input_buf:0

blocked_clients:0

4.3 client list與infoclients監控輸入緩沖區的優劣勢

 CLIENT LIST 詳解

redis> CLIENT LIST
addr=127.0.0.1:43143 fd=6 age=183 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
addr=127.0.0.1:43163 fd=5 age=35 idle=15 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
addr=127.0.0.1:43167 fd=7 age=24 idle=6 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get

可用版本 >= 2.4.0
時間復雜度
O(N) , N 為連接到服務器的客戶端數量。
返回值
命令返回多行字符串,這些字符串按以下形式被格式化:

每個已連接客戶端對應一行(以 LF 分割)
每行字符串由一系列 屬性=值 形式的域組成,每個域之間以空格分開
以下是域的含義:

addr : 客戶端的地址和端口
fd : 套接字所使用的文件描述符
age : 以秒計算的已連接時長
idle : 以秒計算的空閑時長
flags : 客戶端 flag (見下文)
db : 該客戶端正在使用的數據庫 ID
sub : 已訂閱頻道的數量 psub : 已訂閱模式的數量
multi : 在事務中被執行的命令數量
qbuf : 查詢緩沖區的長度(字節為單位, 0 表示沒有分配查詢緩沖區) qbuf-free : 查詢緩沖區剩余空間的長度(字節為單位, 0 表示沒有剩余空間)
obl : 輸出緩沖區的長度(字節為單位, 0 表示沒有分配輸出緩沖區)
oll : 輸出列表包含的對象數量(當輸出緩沖區沒有剩余空間時,命令回復會以字符串對象的形式被入隊到這個隊列里)
omem : 輸出緩沖區和輸出列表占用的內存總量
events : 文件描述符事件(見下文)
cmd : 最近一次執行的命令
客戶端 flag 可以由以下部分組成:

O : 客戶端是 MONITOR 模式下的附屬節點(slave)
S : 客戶端是一般模式下(normal)的附屬節點
M : 客戶端是主節點(master)
x : 客戶端正在執行事務
b : 客戶端正在等待阻塞事件
i : 客戶端正在等待 VM I/O 操作(已廢棄)
d : 一個受監視(watched)的鍵已被修改, EXEC 命令將失敗
c : 在將回復完整地寫出之后,關閉鏈接
u : 客戶端未被阻塞(unblocked)
A : 盡可能快地關閉連接
N : 未設置任何 flag
文件描述符事件可以是:

r : 客戶端套接字(在事件 loop 中)是可讀的(readable)
w : 客戶端套接字(在事件 loop 中)是可寫的(writeable)

見地址:https://blog.csdn.net/sunhuiliang85/article/details/75102191 

見中文官網:http://redisdoc.com/server/index.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM