redis的tcp-backlog配置

  有报障,说是连接超时。。。然后查看docker里有队列溢出

netstat -s | grep overflowed

  通过抓取队列溢出的大小,发现每次报障时,实例的队列溢出数都会突增。

  队列溢出是查看现有连接数是否大于backlog,如果大于就丢弃,并overflow数+1,backlog数是有配置的backlog和系统的somaxconn决定的,backlog值取min(somaxconn,backlog)。

  1.redis的配置文件有tcp-backlog,默认的是511

    tcp服务里面默认有两个队列,一个是tcp-backlog,用于存放未连接队列,另外一个是somaxconn,用于存放已连接队列。

    在完成tcp三次握手之前,首先进入未连接队列,完成tcp三次握手之后正式建立连接,进入已连接队列。因为redis是单进程的,如果主进程出现慢查询的话,会导致已连接队列堆满,并且新accept的连接不能被处理,不能进入到已连接队列,也导致未连接队列堆满,在服务器看到处于未连接队列中的连接状态为SYN_RECV。 新进来的客户端连接将会一直处于SYN_SENT状态等待服务器的ACK应答,最终导致连接超时。

    关于TCP三次握手

    1. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
    2. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.

    处理方法:将配置tcp-backlog设和系统somaxconn设置成8192

    

posted on 2020-08-20 00:08  `Elaine  阅读(1768)  评论(0编辑  收藏  举报

导航