在 Linux 网络编程或系统运维中,“backlog 超限”通常指 TCP listen 的 backlog 队列满了,导致新连接被丢弃或客户端连接失败(如 connection timeout / reset)。下面按原因 → 排查 → 解决来说明。
listen(fd, backlog) 中的 backlog 控制半连接 + 全连接队列长度(不同内核版本含义略有差异):
accept()backlog 超限 = 队列已满 → 新连接无法入队
Connection timed out / Connection resetnetstat 中 Recv-Q 很大TCPBacklogDrop 增加ss -lnt
关注:
State Recv-Q Send-Q Local Address:Port
LISTEN 100 128 :::8080
Recv-Q 接近 Send-Q → 队列快满netstat -s | grep -i backlog
# 或
nstat | grep -i backlog
如有:
TCPBacklogDrop: 12345
说明 backlog 已丢包
cat /proc/net/netstat | grep TcpExt
关注:
ListenOverflowsListenDropslisten(sockfd, 1024);
常见框架示例:
listen 8080 backlog=1024;ServerSocket(int port, int backlog)net.Listen 受系统限制⚠️ 注意:受内核参数限制,不能无限大
# 查看
cat /proc/sys/net/core/somaxconn
# 修改
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
写入持久化:
/etc/sysctl.conf
net.core.somaxconn=4096
net.ipv4.tcp_max_syn_backlog=8192
backlog 满往往是:
解决:
sysctl -w net.ipv4.tcp_syncookies=1
优点:
⚠️ 缺点:
netstat -an | grep :80 | wc -l
ss -tan | grep SYN_RECV | wc -l
若大量 SYN_RECV → 可能是 SYN Flood
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_syncookies = 1
应用 backlog ≥ 1024
backlog 超限不是调大一个数就能解决,本质是“accept 速度 < 连接到达速度”。
如果你愿意,可以告诉我:
我可以给你针对性的参数和代码建议。