在 Linux 中,“backlog” 常见于 网络连接(socket listen backlog) 和 内核队列 场景中。下面按最常见情况给你说明如何查看和修改。
backlog 是 listen() 系统调用中的参数,表示:
已完成连接(ESTABLISHED)但还未被应用 accept() 的最大队列长度
通常受两个因素影响:
listen(fd, backlog)net.core.somaxconncat /proc/sys/net/core/somaxconn
常见默认值:
sudo sysctl -w net.core.somaxconn=4096
编辑:
sudo vi /etc/sysctl.conf
添加或修改:
net.core.somaxconn = 4096
生效:
sudo sysctl -p
✅ 这是修改 Linux backlog 最关键的一步
仅改内核参数 不够,应用本身也要设置 backlog:
listen(fd, 4096);
listen 80 backlog=4096;
server_socket.listen(4096)
⚠️ 实际生效值是:
min(应用 backlog, net.core.somaxconn)
如果你关心的是 SYN flood 或握手阶段:
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=8192
永久:
net.ipv4.tcp_max_syn_backlog = 8192
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
ss -lnt
查看 Recv-Q / Send-Q 是否变大
| 误区 | 说明 |
|---|---|
| 只改应用 backlog | 会被内核截断 |
| backlog 越大越好 | 太大会浪费资源 |
| backlog = 并发连接数 | 仅表示等待 accept 的队列 |
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
net.core.netdev_max_backlog = 16384
如果你能说明:
我可以给你更精确的修改方案 ✅