Linux中的backlog是socket函数listen的参数,用于指定当应用程序调用listen系统调用让一个socket进入LISTEN状态时,新连接队列的长度限制。具体来说,backlog的产生原因和作用可以从以下几个方面来理解:
TCP连接建立过程:
SYN_RCVD状态,并将该连接请求放入syn队列(半连接队列)中。ESTABLISHED状态,服务器将连接从syn队列移动到accept队列(已完成连接队列)。backlog的作用:
backlog用于限制accept队列的大小,即已经握手成功但尚未被应用程序接受的连接数量。accept队列满了,新的连接请求可能会被拒绝,或者客户端可能会收到ECONNREFUSED错误。somaxconn参数决定,可以通过编辑/proc/sys/net/core/somaxconn的值进行设置。serverbootstrap的option进行设置,即option(ChannelOption.SO_BACKLOG, number),其中number为要设置的大小。backlog的设置既不能太大,也不能太小。设置太大可能会导致内存使用过大和CPU负载增加;设置太小则可能无法充分发挥服务器的负载能力,导致客户端连接失败。backlog设置为服务器最大能够承受的QPS(每秒查询率)的1-1.5倍左右。/proc/sys/net/core/somaxconn:表示socket监听的backlog上限。/proc/sys/net/ipv4/tcp_max_syn_backlog:表示syn队列的最大长度。总的来说,backlog在Linux中是一个重要的网络参数,它帮助管理服务器端接受新连接的能力,需要在保证服务效率的同时,也要考虑到系统的稳定性和资源的合理利用。