调整Linux半连接队列长度核心是同步设置net.ipv4.tcp_max_syn_backlog、net.core.somaxconn和应用层listen()的backlog值,三者不匹配则调优无效;需先通过ss、/proc/net/snmp统计和dmesg确认溢出,再启用tcp_syncookies作为兜底防护。

调整 Linux 半连接队列长度,核心是改 net.ipv4.tcp_max_syn_backlog,但必须和 net.core.somaxconn、应用层 listen() 的 backlog 值协同设置——三者不匹配,调了也白调。
确认是否真有半连接队列溢出
别一上来就改参数,先看证据:
- 执行
ss -lnt | grep :端口,观察 Recv-Q 是否长期接近 Send-Q(说明全连接队列已满,进而压垮半连接队列) - 查内核丢包统计:
awk '/^TcpExt/ {print $1,$2}' /proc/net/snmp | grep SynsToListenDrops,输出值非零即代表 SYN 包被静默丢弃 - 运行
dmesg | grep -i "possible SYN flooding",出现该提示且tcp_syncookies=0,基本可断定半连接队列已满
三个关键参数必须同步调
半连接队列实际生效大小 = min(net.core.somaxconn, net.ipv4.tcp_max_syn_backlog)。所以单独改一个没用:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
net.core.somaxconn = 65535:系统级全连接队列上限,也隐式约束半连接队列上限 -
net.ipv4.tcp_max_syn_backlog = 65535:显式定义半连接队列最大长度,必须 ≥ somaxconn -
net.ipv4.tcp_syncookies = 1:必须开启。队列满时启用 Cookie 机制,避免直接丢包,是兜底保障
应用层 listen() 的 backlog 必须对齐
内核参数再大,如果应用自己设的 backlog 太小,最终仍会被卡住:
- Nginx 需显式写:
listen 80 backlog=65535;,不能依赖默认值(常为 128) - Go 程序需在
net.ListenConfig.Control中调用setsockopt(SO_BACKLOG) - uWSGI 启动时加
--listen 65535,否则默认仅 100
持久化配置与生效
写入配置文件,避免重启失效:
- 新建
/etc/sysctl.d/99-tcp-queue.conf,填入:
net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_syncookies = 1
- 执行
sudo sysctl --system立即加载全部配置 - 验证:
sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog

















