在Linux中,backlog
是listen
系统调用的一个重要参数,用于指定服务器套接字接收连接请求的最大队列长度。以下是对backlog
的详细分析:
什么是Backlog
backlog
是Linux下socket函数listen
的参数,用于控制服务器能够同时处理的连接请求数量。当应用程序调用listen
系统调用让一个socket进入LISTEN
状态时,需要指定一个backlog
参数。这个参数经常被描述为新连接队列的长度限制。
Backlog的作用
- 控制连接请求队列的长度:
backlog
决定了在调用listen
之后,等待被接受的连接请求的最大数量。 - 避免连接请求丢失或超时:如果服务器进程没有及时处理这些连接请求,超过
backlog
大小的连接请求将被丢弃。
Backlog的设置
系统层面
somaxconn
参数:可以通过编辑/proc/sys/net/core/somaxconn
的值进行设置。
应用层面
- 对于Netty服务端来说,可以通过
serverbootstrap
的option
进行设置,即option((ChannelOption.SO_BACKLOG, number))
,其中number
即为要设置的大小,类型为int
。backlog
最终的取值为二者中的最小值,即min(backlog, somaxconn)
。
Backlog的使用分析
对于backlog
队列的使用情况,可以通过netstat
进行查询。在listen
状态情况下:
Recv-Q
表示存在于backlog
当中未被服务端应用程序accept
的队列大小。Send-Q
表示最大的backlog
的大小,即我们设置的backlog
的大小min(backlog, somaxconn)
。
Backlog设置标准
在设置backlog
时,既不能太大,也不能太小。设置太大,当访问流量突然增加超过服务器的负载时,客户端不能快速失败,造成读取连接超时,对服务端来讲,会影响网络I/O,同时造成内存使用过大,CPU负载增加;如果设置太小,不能充分发挥服务端的负载能力,并且会客户端造成连接失败的情况。应根据服务端能够承受的最大QPS进行设置,backlog
的大小,应设置成在服务端最大能够承受QPS的1-1.5倍左右。
常见问题
- backlog队列溢出:当全连接队列溢出时,新的连接请求会根据
/proc/sys/net/ipv4/tcp_abort_on_overflow
的设置进行不同的处理。如果设置为0,会直接丢弃该ACK;如果设置为1,会发送RST通知客户端。。
通过以上分析,我们可以看到backlog
在Linux网络编程中的重要性。合理设置backlog
的值,可以有效控制连接请求队列的长度,确保服务器能够有效地处理连接请求。