在 Linux 中,backlog 通常指两类东西,调优方式不同,先明确一下你指的是哪一种:
listen(fd, backlog))下面按最常见的 TCP backlog 调优来讲,也是面试和实战中最常遇到的。
listen(sockfd, backlog);
backlog 表示:已完成三次握手、等待 accept 的队列长度上限(不完全准确,见下)。
实际队列由两个部分组成:
| 队列 | 含义 |
|---|---|
| 半连接队列 (SYN Queue) | 收到 SYN,未完成握手 |
| 全连接队列 (Accept Queue) | 完成握手,等待应用 accept |
backlog 不是你设多少就多少
实际全连接队列长度 =
min(backlog, net.core.somaxconn)
listen(fd, 1024);
cat /proc/sys/net/core/somaxconn
默认通常是:
128
⚠️ 这是最常见的瓶颈
# 临时
sysctl -w net.core.somaxconn=4096
# 永久
echo "net.core.somaxconn=4096" >> /etc/sysctl.conf
sysctl -p
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
永久:
echo "net.ipv4.tcp_max_syn_backlog=8192" >> /etc/sysctl.conf
例如:
listen 80 backlog=4096;tcp-backlog 511listen(fd, 4096)应用 backlog ≤ somaxconn 才有效
sysctl -w net.ipv4.tcp_syncookies=1
netstat -s | grep -i listen
或
nstat | grep -i Listen
关注:
ListenOverflows
ListenDrops
非 0 说明全连接队列满了
ss -lnt
示例:
State Recv-Q Send-Q Local Address:Port
LISTEN 0 128 *:80
Send-Q = 当前 backlog 上限Recv-Q ≈ 等待 accept 的连接数❌ 只改代码 backlog 不生效
✅ 必须同时改 somaxconn
❌ 盲目调非常大
✅ 一般 1024–8192 足够
❌ 忽略应用 accept 速度
✅ backlog 只是缓冲,消费慢照样丢
| 场景 | 建议 |
|---|---|
| 高并发 Web | somaxconn=4096 |
| 短连接风暴 | syncookies=1 |
| 网关 / 代理 | tcp_max_syn_backlog=8192 |
| 容器环境 | 注意宿主机也要调 |
如果你愿意,可以告诉我:
我可以给你一套更针对性的参数。