在 Linux 网络编程中,“backlog 满了”通常指 TCP 监听套接字的 accept 队列(全连接队列)溢出,或与之相关的 半连接队列(SYN 队列)问题。下面系统说明原因、机制和排查方法。
int listen(int sockfd, int backlog);
backlog historically 表示:
在现代 Linux(kernel ≥ 2.2)中:
listen() 的 backlog 主要限制全连接队列net.ipv4.tcp_max_syn_backlog 控制实际队列长度还受:
min(backlog, net.core.somaxconn)
现象
accept() 处理太慢原因
accept() 太慢:
listen(sock, 5))现象
原因
tcp_max_syn_backlog 太小cat /proc/sys/net/core/somaxconn
常见默认值:
somaxconn = 128listen(sock, 128) 实际可能只生效 128netstat -s | grep -i listen
关注:
times the listen queue of a socket overflowed
或:
nstat | grep -i listen
ss -lnt
示例:
State Recv-Q Send-Q Local Address:Port
LISTEN 129 128 :::8080
Recv-Q ≈ Send-Q → 队列满listen(sock, 1024);
并确保:
sysctl -w net.core.somaxconn=1024
reuseportnet.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
Linux backlog 满,本质不是“队列不够”,而是“消费速度 < 生产速度”。
如果你愿意,我可以:
ss / netstat 输出