问题现象

JedisConnectionException: java.net.SocketTimeoutException: Read timed out

分析

netstat -s 查看有tcp 队列满了溢出

    10663940 times the listen queue of a socket overflowed
    10663940 SYNs to LISTEN sockets ignored

对应参数查看:
cat /proc/sys/net/core/somaxconn
somaxconn 对应全连接队列,另外还有 tcp_max_syn_backlog 对应半连接队列

$ cat /proc/sys/net/ipv4/tcp_max_syn_backlog
65536

解决

设置somaxconn
设置 sysctl -w net.core.somaxconn=32768

vim /etc/sysctl.conf
net.core.somaxconn=32768

设置redis 配置参数,重启
tcp-backlog 8192

查看

$ ss -lnt
State       Recv-Q Send-Q                                                    Local Address:Port                                                      Peer Address:Port 
LISTEN      0      8192                                                       10.x.x.x:6881                                                                 *:*

扩展

TCP握手过程中建连接的流程和队列


如上图所示,这里有两个队列:syns queue(半连接队列);accept queue(全连接队列)


nosqldb 于 8 天前 修改
0 回复
需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。