在 Debian(以及大多数 Linux 发行版)里常说的 backlog 满,一般是指 网络监听 socket 的 accept 队列(backlog)满了,常见表现包括:
netstat -s 里出现 listen queue / overflow 相关计数增长ss -lnt 中 Recv-Q 接近或超过 Send-Qconnection refused / too many open connections下面按最常见原因给你梳理一下。
backlog 指的是:
已经完成 TCP 三次握手,但还没被应用调用
accept()取走的连接队列
如果:
那么队列会堆满,新连接被内核丢弃或重试。
✅ 现象:
ss -lnt
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* Recv-Q=128
✅ 解决:
很多程序默认 backlog 很小(如 50、128),高并发直接打满。
例如:
listen 80 backlog=1024;listen(sock, 128)但注意:
Linux 实际 backlog = min(应用设置, net.core.somaxconn)
✅ 查看:
cat /proc/sys/net/core/somaxconn
✅ 修改:
sysctl -w net.core.somaxconn=65535
并写入 /etc/sysctl.conf:
net.core.somaxconn=65535
如果受到:
会出现:
SYN_RECV 很多✅ 查看:
netstat -s | grep -i listen
✅ 缓解:
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
即使 backlog 没满,但:
ulimit -n 太小也会导致无法 accept 新连接。
✅ 查看:
cat /proc/<pid>/limits
✅ 修改:
ulimit -n 65535
systemd 服务加:
LimitNOFILE=65535
容易误解:
syn backlog:未完成握手accept backlog:已完成握手两者都满,都会表现为“backlog 满”。
Debian 默认:
somaxconn = 128(很低)这是** Debian 服务器高并发常见问题之一 **。
ss -lnt
netstat -s | grep -i listen
cat /proc/sys/net/core/somaxconn
cat /proc/sys/net/ipv4.tcp_max_syn_backlog
如果你能告诉我:
ss 输出我可以直接帮你定位是哪一层满的。