在 Linux 网络编程中,backlog 增大通常是为了应对高并发连接请求,尤其是短连接或突发流量场景。下面从原理、原因和场景三个层面说明。
在 TCP 服务端:
listen(sockfd, backlog);
backlog 表示 已完成连接(ESTABLISHED)但还未被 accept() 取走的连接队列长度上限(在 Linux 2.2+ 后,实际含义是 全连接队列长度)。
内核中相关队列:
accept()Linux 实际队列长度 ≈
min(backlog, somaxconn)
如:
如果队列太小:
connection refused 或超时当:
未 accept 的连接会堆积,backlog 太小就会丢。
HTTP/1.0、RPC 短连接:
常见默认值:
net.core.somaxconn = 128listen() 默认 backlog = 128对现代服务来说 明显不够。
netstat 中看到大量 SYN_RECV 或 TIME_WAITpossible SYN flooding on port xxx
listen(sockfd, 1024);
# 全连接队列上限
net.core.somaxconn = 4096
# 半连接队列
net.ipv4.tcp_max_syn_backlog = 8192
sysctl -p
backlog 实际生效值 = min(listen backlog, somaxconn)
⚠️ 不是越大越好:
✅ 正确做法:
Linux 中 backlog 增大,本质是为了在高并发或突发连接下,避免“连接已建立但还没被 accept”就被内核丢弃。
如果你愿意,我可以结合 你的具体服务(Nginx / Java / Go / C++) 或 压测现象 给你一个更精准的配置建议。