跳转至

tcp_max_syn_backlogs

Overview

tcp_max_syn_backlog 是 Linux 内核的一个重要网络参数,用于控制 SYN 队列(半连接队列)的最大长度。这个队列保存了那些已经收到客户端 SYN 包、但还未完成三次握手的连接请求。

当服务器面临大量并发连接请求(如 DDoS、瞬间高并发、爬虫等)时,如果 tcp_max_syn_backlog 设置过小,会导致:

  • 新的连接请求被丢弃。
  • 客户端出现 Connection refused 或超时。
  • 服务无法及时响应。

默认值:

  • 旧版 Linux(如 CentOS 6):1024
  • 较新系统(支持 SYN Cookies):4096、8192 或更高
  • 某些云服务器:可能为 65535

查看和配置

查看当前 tcp_max_syn_backlog 值

cat /proc/sys/net/ipv4/tcp_max_syn_backlog
# 或
sysctl net.ipv4.tcp_max_syn_backlog

配置tcp_max_syn_backlog

  • 临时调整(重启后失效)
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=65535
  • 永久调整(推荐)

方法 1:修改 /etc/sysctl.conf

sudo vim /etc/sysctl.conf
# 添加或修改
net.ipv4.tcp_max_syn_backlog = 65535
# 保存
sudo sysctl -p

方法 2:创建专用配置文件(推荐)

sudo vim /etc/sysctl.d/99-tcp-syn-backlog.conf

添加内容

net.ipv4.tcp_max_syn_backlog = 65535

加载配置:

sudo sysctl --system

验证结果

检查参数是否加载

sysctl net.ipv4.tcp_max_syn_backlog
# 输出应为 65535

查看当前半连接状态(可选)

# 查看处于 SYN_RECV 状态的连接数
ss -an | grep SYN_RECV | wc -l

查看监听端口的 Send-Q(全连接队列)

ss -lnt

输出结果

State   Recv-Q  Send-Q  Local Address:Port   Peer Address:Port
LISTEN  0       65535   *:80                *:*

Send-Q 显示的是 min(somaxconn, 应用 backlog),应与你设置的值一致。

推荐值(根据场景)

场景 推荐 tcp_max_syn_backlog
普通 Web 服务 4096 ~ 16384
高并发 API 服务、网关 32768
Redis / MySQL 高负载 65535
抗 DDoS / 高性能网关 65535 + 启用 tcp_syncookies

优化网络性能相关参数

# 启用 SYN Cookies(防止 SYN Flood 攻击)
net.ipv4.tcp_syncookies = 1

# 调大接受连接队列(全连接队列上限)
net.core.somaxconn = 65535

# 增加网络设备接收队列长度
net.core.netdev_max_backlog = 5000

# 可选:减少 SYN 重试次数(加快资源释放)
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_synack_retries = 3