在 Debian(以及一般的 Linux 系统)里,backlog 这个词通常出现在两个场景里:
listen() 的 backlog,常见于 Nginx / Apache / Redis 等)下面按常见情况给你讲怎么“优化 Debian 的 backlog”。
listen(sockfd, backlog);
backlog 是已完成连接(ESTABLISHED)但未 accept 的队列长度# 查看
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog
推荐优化(高并发服务器):
# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
生效:
sysctl -p
很多程序默认 backlog 很小:
Nginx
listen 80 backlog=65535;
Redis
tcp-backlog 65535
Python
sock.listen(65535)
若应用 backlog > somaxconn,会被截断
systemctl status 显示 queued# 提高并发启动数
/etc/systemd/system.conf
DefaultTasksMax=infinity
或限制不重要服务:
[Service]
Type=oneshot
lpstat -o
cancel -a
如果是网络丢包 / 收包慢:
sysctl net.core.netdev_max_backlog
建议:
net.core.netdev_max_backlog = 65535
ss -lnt
# 看 Recv-Q 是否满
dmesg | grep TCP
# 看是否有 syn flood / drop
# 高并发 Debian 服务器
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
并确保应用 backlog 设置一致
如果你能具体说明:
我可以给你针对性的 Debian backlog 调优方案。