在 Linux 里,“backlog” 通常出现在 网络编程(TCP 监听队列) 或 内核 / 服务队列 的上下文中。下面按最常见场景给你一个清晰说明,并告诉你怎么设置。
backlog 是调用 listen(fd, backlog) 时的参数,表示:
已完成连接(ESTABLISHED)但未被 accept 的最大队列长度
而不是半连接(SYN_RECV)的数量(那由内核参数控制)。
listen(server_fd, 1024);
server_socket.listen(1024)
✅ 一般建议值
128 ~ 10241024 ~ 4096⚠️ 注意:不能无限大,内核会限制
backlog 会被内核参数 somaxconn 限制。
cat /proc/sys/net/core/somaxconn
默认通常是:
128
sysctl -w net.core.somaxconn=4096
vim /etc/sysctl.conf
添加:
net.core.somaxconn = 4096
然后:
sysctl -p
✅ 实际生效值 = min(listen backlog, somaxconn)
用于 SYN_RECV 状态(TCP 三次握手未完成)
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
默认通常是:
256 ~ 1024
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
永久:
net.ipv4.tcp_max_syn_backlog = 8192
⚠️ 这个参数 不是 listen() 的 backlog,但会影响高并发连接建立。
listen 80 backlog=4096;
生效条件:
somaxconn >= 4096tcp-backlog 2048
并确保:
sysctl net.core.somaxconn >= 2048
ServerSocket ss = new ServerSocket();
ss.bind(new InetSocketAddress(8080), 1024);
ss -lnt
示例:
LISTEN 0 128 0.0.0.0:80
这里:
128 就是当前监听队列长度如果小于你设置的值,说明被 somaxconn 限制了。
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
应用层:
listen backlog = 1024 ~ 4096
❌ backlog 是半连接队列
✅ 错,它是 已完成连接队列
❌ backlog 设得越大越好
✅ 错,合理范围即可,过大浪费资源
❌ 改了应用就生效
✅ 错,必须配合内核参数
如果你愿意,可以告诉我:
我可以给你一套完整参数模板。