在 Linux 网络编程中,backlog 溢出通常指的是 TCP 监听队列(listen queue)满了,导致新的连接请求被丢弃或延迟。下面从原理、原因和表现几个方面说明。
在 TCP 服务端:
listen(sockfd, backlog);
backlog 表示内核为该 socket 维护的“未完成 + 已完成连接队列”长度上限(历史语义,现代实现有差异)。
Linux 中实际涉及两个队列:
accept()accept() 调用太慢结果:
原因:
net.ipv4.tcp_max_syn_backlog 太小tcp_syncookies 未开启表现:
TCPBacklogDrop 增加Linux 中:
cat /proc/sys/net/core/somaxconn
listen(..., backlog) 实际生效值为:min(backlog, somaxconn)
somaxconn = 128即使你写:
listen(fd, 1024);
也可能只有 128。
netstat -s | grep -i backlog
netstat -s | grep -i listen
关注:
times the listen queue of a socket overflowedSYNs to listened sockets ignoredss -lnt
示例:
State Recv-Q Send-Q Local Address:Port
LISTEN 129 128 :::80
Send-Q = 128 → backlog 上限Recv-Q >= Send-Q → 队列已满# 应用层
listen(fd, 1024);
# 系统层
sysctl -w net.core.somaxconn=1024
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.ipv4.tcp_syncookies=1
Linux backlog 溢出,本质是新连接速度 > 服务端 accept 速度,或内核队列容量不足。
如果你愿意,可以告诉我:
somaxconn我可以给你更具体的优化方案。