在 Linux 网络里常说的 backlog 丢包,通常出现在 TCP 连接建立阶段(而不是数据传输阶段)。下面分场景把“为什么会丢包”讲清楚。
当服务端调用:
listen(fd, backlog);
内核实际上维护 两个队列:
accept()注意:
backlog 控制的是「全连接队列」长度(历史实现有差异)
过程:
accept()表现:
netstat -s 中:TCPBacklogDrop
ss -lnt 中 Recv-Q 接近 Send-Q✅ 本质:应用消费太慢
触发条件:
tcp_max_syn_backlog 太小表现:
Linux 早期:
listen(fd, 5);
实际可能是:
min(backlog, somaxconn)
查看:
cat /proc/sys/net/core/somaxconn
⚠️ 很多程序 backlog=128,但 somaxconn=128 或更小
即使:
但如果:
仍然会:
netstat -s | grep -i backlog
或:
nstat | grep -i backlog
ss -lnt
示例:
State Recv-Q Send-Q Local Address
LISTEN 128 128 0.0.0.0:8080
Recv-Q == Send-Q → 危险listen(fd, 1024);
并调整:
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
SO_REUSEPORTLinux backlog 丢包,本质是:连接已经完成或正在建立,但内核队列或应用消费跟不上。
如果你愿意,可以告诉我:
我可以给你更针对性的排查方案。