今天ELK收集日志的時候,發現收集失敗,查找各方面原因,最后在redis日志里面發現報錯:
[2489] 02 Jun 10:43:42 # Error allocating resoures for the client
錯誤是無法為客戶端分配資源,查看redis連接數:
# redis-cli info | grep connected
connected_clients:5036
connected_slaves:0
客戶端的連接竟然有達到5000多
查看客戶端連接情況:
redis 127.0.0.1:6379> client list
addr=10.247.64.115:52834 fd=5 idle=2144 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
addr=127.0.0.1:38484 fd=7 idle=0 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=blpop
addr=10.105.1.2:53125 fd=8 idle=2144 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
addr=10.105.1.3:32639 fd=9 idle=2144 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
addr=10.105.1.4:57134 fd=10 idle=2144 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
addr=10.105.1.5:53126 fd=11 idle=2144 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
addr=10.105.1.7:8887 fd=12 idle=2144 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
每個字段含義如下:
addr:客戶端的地址和端口
fd:套接字所使用的文件描述符
idle:以秒計算的空閑時長
flags:客戶端 flag
db:該客戶端正在使用的數據庫 ID
sub:已訂閱頻道的數量
psub:已訂閱模式的數量
multi:在事務中被執行的命令數量
qbuf:查詢緩沖區的長度(字節為單位, 0 表示沒有分配查詢緩沖區)
qbuf-free:查詢緩沖區剩余空間的長度(字節為單位, 0 表示沒有剩余空間)
obl:輸出緩沖區的長度(字節為單位, 0 表示沒有分配輸出緩沖區)
oll:輸出列表包含的對象數量(當輸出緩沖區沒有剩余空間時,命令回復會以字符串對象的形式被入隊到這個隊列里)
omem:輸出緩沖區和輸出列表占用的內存總量
events:文件描述符事件
cmd:最近一次執行的命令
發現客戶端的idle空閑時長太長,連接池維持了太多的連接,需要將不用的連接及時釋放掉:
redis 127.0.0.1:6379> CONFIG SET timeout 30
OK
再次查看連接:
# redis-cli info | grep connected
connected_clients:1137
connected_slaves:0
連接數大量下降
查看連接的具體情況
redis 127.0.0.1:6379> client list
addr=127.0.0.1:38484 fd=7 idle=0 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=blpop
addr=10.105.1.150:39742 fd=269 idle=29 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
addr=10.105.1.226:53291 fd=5 idle=31 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=rpush
idle的時間已經限制在30秒了